Github 工具包
The Github 工具包包含工具,使 LLM 代理能够与 GitHub 存储库进行交互。
该工具是 PyGitHub 库的封装。
详细介绍了所有Github Toolkit 特性和配置的文档请参见API 参考。
设置
在高层次上,我们将:
- 安装 pygithub 库
- 创建一个 GitHub 应用程序
- 设置环境变量
- 将工具传递给您的代理,请使用
toolkit.get_tools()
要启用单个工具的自动跟踪,请设置您的LangSmithAPI密钥:
# os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
# os.environ["LANGSMITH_TRACING"] = "true"
安装
1. 安装依赖项
这个集成是在langchain-community实现的。我们还需要依赖pygithub。
%pip install --upgrade --quiet pygithub langchain-community
2. 创建一个 GitHub 应用程序
按照这里说明 创建并注册一个 Github 应用程序。确保你的应用具有以下 仓库权限:
- 提交状态(只读)
- Contents (读写)
- 问题(读写)
- 元数据(只读)
- 拉取请求(可读写)
注册应用程序后,您必须授予该应用程序访问每个希望其操作的仓库的权限。请在 这里使用github.com上的App设置。
3. 设置环境变量
在初始化您的代理之前,需要设置以下环境变量:<br/>
- GITHUB_APP_ID- 一个在应用程序常规设置中找到的六位数字
- GITHUB_APP_PRIVATE_KEY- 你的应用私钥.pem文件的位置,或该文件的完整文本字符串。
- GITHUB_REPOSITORY- 你希望机器人操作的GitHub仓库名称。必须遵循 {username}/{repo-name} 的格式。请确保应用已先添加到该仓库中!
- 可选:GITHUB_BRANCH- 机器人将在此分支上提交代码。默认为
repo.default_branch。 - 可选:GITHUB_BASE_BRANCH- 您的仓库的基础分支,PR 将基于此分支创建。默认值为
repo.default_branch。
import getpass
import os
for env_var in [
"GITHUB_APP_ID",
"GITHUB_APP_PRIVATE_KEY",
"GITHUB_REPOSITORY",
]:
if not os.getenv(env_var):
os.environ[env_var] = getpass.getpass()
Instantiation
现在我们可以实例化我们的工具包:
from langchain_community.agent_toolkits.github.toolkit import GitHubToolkit
from langchain_community.utilities.github import GitHubAPIWrapper
github = GitHubAPIWrapper()
toolkit = GitHubToolkit.from_github_api_wrapper(github)
工具
查看可用工具:
tools = toolkit.get_tools()
for tool in tools:
print(tool.name)
Get Issues
Get Issue
Comment on Issue
List open pull requests (PRs)
Get Pull Request
Overview of files included in PR
Create Pull Request
List Pull Requests' Files
Create File
Read File
Update File
Delete File
Overview of existing files in Main branch
Overview of files in current working branch
List branches in this repository
Set active branch
Create a new branch
Get files from a directory
Search issues and pull requests
Search code
Create review request
这些工具的目的是如下所示:
这些步骤将在下面进行详细解释。
-
获取问题- 从仓库中检索问题。
-
获取问题- 获取特定问题的详细信息。
-
在问题上留言- 在特定的问题上发表评论。
-
创建拉取请求- 从机器人的工作分支向基础分支创建一个拉取请求。
-
创建文件- 在仓库中创建新文件。
-
读取文件- 从仓库中读取文件。
-
更新文件- 更新仓库中的文件。
-
删除文件- 从仓库中删除一个文件。
Include release tools
默认情况下,工具包不包含与发布相关的工作。您可以在初始化工具包时通过设置include_release_tools=True来包括它们:
toolkit = GitHubToolkit.from_github_api_wrapper(github, include_release_tools=True)
设置 include_release_tools=True 将包括以下工具:
-
获取最新版本- 从仓库中获取最新版本。
-
获取发布版本- 从仓库中获取最新的5个发布版本。
-
获取版本发布- 通过标签名从仓库中拉取特定的版本发布,例如:
v1.0.0。
使用于代理
我们需要一个大语言模型或聊天模型:
pip install -qU "langchain[openai]"
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")
from langchain.chat_models import init_chat_model
llm = init_chat_model("gpt-4o-mini", model_provider="openai")
使用工具的子集初始化代理:
from langgraph.prebuilt import create_react_agent
tools = [tool for tool in toolkit.get_tools() if tool.name == "Get Issue"]
assert len(tools) == 1
tools[0].name = "get_issue"
agent_executor = create_react_agent(llm, tools)
发布一个查询:
example_query = "What is the title of issue 24888?"
events = agent_executor.stream(
{"messages": [("user", example_query)]},
stream_mode="values",
)
for event in events:
event["messages"][-1].pretty_print()
================================[1m Human Message [0m=================================
What is the title of issue 24888?
==================================[1m Ai Message [0m==================================
Tool Calls:
get_issue (call_iSYJVaM7uchfNHOMJoVPQsOi)
Call ID: call_iSYJVaM7uchfNHOMJoVPQsOi
Args:
issue_number: 24888
=================================[1m Tool Message [0m=================================
Name: get_issue
{"number": 24888, "title": "Standardize KV-Store Docs", "body": "To make our KV-store integrations as easy to use as possible we need to make sure the docs for them are thorough and standardized. There are two parts to this: updating the KV-store docstrings and updating the actual integration docs.\r\n\r\nThis needs to be done for each KV-store integration, ideally with one PR per KV-store.\r\n\r\nRelated to broader issues #21983 and #22005.\r\n\r\n## Docstrings\r\nEach KV-store class docstring should have the sections shown in the [Appendix](#appendix) below. The sections should have input and output code blocks when relevant.\r\n\r\nTo build a preview of the API docs for the package you're working on run (from root of repo):\r\n\r\n\`\`\`shell\r\nmake api_docs_clean; make api_docs_quick_preview API_PKG=openai\r\n\`\`\`\r\n\r\nwhere `API_PKG=` should be the parent directory that houses the edited package (e.g. community, openai, anthropic, huggingface, together, mistralai, groq, fireworks, etc.). This should be quite fast for all the partner packages.\r\n\r\n## Doc pages\r\nEach KV-store [docs page](https://python.langchain.com/docs/integrations/stores/) should follow [this template](https://github.com/langchain-ai/langchain/blob/master/libs/cli/langchain_cli/integration_template/docs/kv_store.ipynb).\r\n\r\nHere is an example: https://python.langchain.com/docs/integrations/stores/in_memory/\r\n\r\nYou can use the `langchain-cli` to quickly get started with a new chat model integration docs page (run from root of repo):\r\n\r\n\`\`\`shell\r\npoetry run pip install -e libs/cli\r\npoetry run langchain-cli integration create-doc --name \"foo-bar\" --name-class FooBar --component-type kv_store --destination-dir ./docs/docs/integrations/stores/\r\n\`\`\`\r\n\r\nwhere `--name` is the integration package name without the \"langchain-\" prefix and `--name-class` is the class name without the \"ByteStore\" suffix. This will create a template doc with some autopopulated fields at docs/docs/integrations/stores/foo_bar.ipynb.\r\n\r\nTo build a preview of the docs you can run (from root):\r\n\r\n\`\`\`shell\r\nmake docs_clean\r\nmake docs_build\r\ncd docs/build/output-new\r\nyarn\r\nyarn start\r\n\`\`\`\r\n\r\n## Appendix\r\nExpected sections for the KV-store class docstring.\r\n\r\n\`\`\`python\r\n \"\"\"__ModuleName__ completion KV-store integration.\r\n\r\n # TODO: Replace with relevant packages, env vars.\r\n Setup:\r\n Install ``__package_name__`` and set environment variable ``__MODULE_NAME___API_KEY``.\r\n\r\n .. code-block:: bash\r\n\r\n pip install -U __package_name__\r\n export __MODULE_NAME___API_KEY=\"your-api-key\"\r\n\r\n # TODO: Populate with relevant params.\r\n Key init args \u2014 client params:\r\n api_key: Optional[str]\r\n __ModuleName__ API key. If not passed in will be read from env var __MODULE_NAME___API_KEY.\r\n\r\n See full list of supported init args and their descriptions in the params section.\r\n\r\n # TODO: Replace with relevant init params.\r\n Instantiate:\r\n .. code-block:: python\r\n\r\n from __module_name__ import __ModuleName__ByteStore\r\n\r\n kv_store = __ModuleName__ByteStore(\r\n # api_key=\"...\",\r\n # other params...\r\n )\r\n\r\n Set keys:\r\n .. code-block:: python\r\n\r\n kv_pairs = [\r\n [\"key1\", \"value1\"],\r\n [\"key2\", \"value2\"],\r\n ]\r\n\r\n kv_store.mset(kv_pairs)\r\n\r\n .. code-block:: python\r\n\r\n Get keys:\r\n .. code-block:: python\r\n\r\n kv_store.mget([\"key1\", \"key2\"])\r\n\r\n .. code-block:: python\r\n\r\n # TODO: Example output.\r\n\r\n Delete keys:\r\n ..code-block:: python\r\n\r\n kv_store.mdelete([\"key1\", \"key2\"])\r\n\r\n ..code-block:: python\r\n \"\"\" # noqa: E501\r\n\`\`\`", "comments": "[]", "opened_by": "jacoblee93"}
==================================[1m Ai Message [0m==================================
The title of issue 24888 is "Standardize KV-Store Docs".
API 参考
详细文档请参阅所有GithubToolkit功能和配置的API参考。