工具集成
工具集成
相关源文件
本章引用的主要源码文件:
backend/alembic/versions/f3c9e59c3b07_seed_coding_agent_tool.pybackend/onyx/db/code_interpreter.pybackend/onyx/server/manage/code_interpreter/__init__.pybackend/onyx/server/manage/code_interpreter/api.pybackend/onyx/server/manage/code_interpreter/models.pybackend/onyx/server/query_and_chat/session_loading.pybackend/onyx/tools/built_in_tools.pybackend/onyx/tools/constants.pybackend/onyx/tools/tool_constructor.pybackend/onyx/tools/tool_implementations/coding_agent/__init__.pybackend/onyx/tools/tool_implementations/coding_agent/coding_agent_tool.pybackend/onyx/tools/tool_implementations/custom/custom_tool.pybackend/onyx/tools/tool_implementations/images/image_generation_tool.pybackend/onyx/tools/tool_implementations/mcp/mcp_tool.pybackend/onyx/tools/tool_implementations/open_url/firecrawl.pybackend/onyx/tools/tool_implementations/open_url/open_url_tool.pybackend/onyx/tools/tool_implementations/python/code_interpreter_client.pybackend/onyx/tools/tool_implementations/python/python_tool.pybackend/onyx/tools/tool_implementations/web_search/utils.pybackend/onyx/tools/tool_implementations/web_search/web_search_tool.pybackend/tests/external_dependency_unit/tools/test_mcp_passthrough_oauth.pybackend/tests/external_dependency_unit/tools/test_oauth_tool_integration.pybackend/tests/external_dependency_unit/tools/test_python_tool.pybackend/tests/external_dependency_unit/tools/test_python_tool_server_enabled.pybackend/tests/integration/common_utils/managers/chat.pybackend/tests/integration/common_utils/managers/tool.pybackend/tests/integration/common_utils/test_models.pybackend/tests/integration/tests/chat/test_chat_deletion.pybackend/tests/integration/tests/code_interpreter/conftest.pybackend/tests/integration/tests/code_interpreter/test_code_interpreter_api.pybackend/tests/integration/tests/migrations/test_tool_seeding.pybackend/tests/integration/tests/streaming_endpoints/test_chat_stream.pybackend/tests/unit/onyx/tools/custom/test_custom_tools.pybackend/tests/unit/onyx/tools/test_mcp_tool_schema.pybackend/tests/unit/onyx/tools/test_python_tool_availability.pybackend/tests/unit/onyx/tools/tool_implementations/python/__init__.pybackend/tests/unit/onyx/tools/tool_implementations/python/test_code_interpreter_client.pyweb/src/app/app/components/tools/constants.tsweb/src/app/app/services/actionUtils.ts
目的与范围
本文档记录了 Onyx 中的工具集成系统,涵盖如何根据角色配置构建工具、如何将工具传递给大语言模型(LLM)进行函数调用,以及在聊天交互过程中如何执行工具。工具使大语言模型(LLM)能够执行搜索文档、浏览网页、运行 Python 代码、读取文件以及管理用户记忆等操作。
有关配置角色可用工具的详细信息,请参阅助手配置。有关工具结果如何整合到提示词中的详细信息,请参阅提示词工程。
可用的内置工具
Onyx 提供了几个核心内置工具,可以在角色上启用。这些工具定义在 BUILT_IN_TOOL_MAP onyx/tools/built_in_tools.py:36-46 中。
| 工具名称 | 类名 | 用途 |
|---|---|---|
| run_search | SearchTool | 在已索引的连接器中进行内部文档搜索,并执行访问控制列表(ACL)强制 onyx/tools/tool_implementations/search/search_tool.py:47 |
| web_search | WebSearchTool | 查询外部搜索引擎(Google、Bing 等)以获取互联网结果 onyx/tools/tool_implementations/web_search/web_search_tool.py:84 |
| open_urls | OpenURLTool | 通过 URL 获取并提取网页或已索引文档的内容 onyx/tools/tool_implementations/open_url/open_url_tool.py:29 |
| python | PythonTool | 使用代码解释器服务在沙箱环境中执行 Python 代码 onyx/tools/tool_implementations/python/python_tool.py:51 |
| file_reader | FileReaderTool | 当项目/角色附加的文件过大无法放入上下文时,读取这些文件 onyx/tools/tool_implementations/file_reader/file_reader_tool.py:39 |
| memory | MemoryTool | 跨对话存储和检索关于用户的持久信息 onyx/tools/tool_implementations/memory/memory_tool.py:44 |
| generate_image | ImageGenerationTool | 使用配置的提供者根据文本提示生成图像 onyx/tools/tool_implementations/images/image_generation_tool.py:48 |
来源: onyx/tools/built_in_tools.py:36-53,onyx/tools/tool_constructor.py:33-48
工具构建管线
概述
工具是根据角色配置、用户权限和聊天上下文,为每条聊天消息动态构建的。构建过程发生在 construct_tools 中,该函数在进入大语言模型(LLM)循环之前被调用。
自然语言空间到代码实体空间:工具构建
构建入口点
主要的构建过程发生在 construct_tools onyx/tools/tool_constructor.py:114-125 中。该函数通过检查角色附加的工具和用户可用的凭证,来处理 Tool 子类的实例化。例如,它会检查 user.oauth_accounts 来为需要用户级认证的工具提供令牌 onyx/tools/tool_constructor.py:173-176。
该函数返回一个字典,将工具数据库 ID 映射到 Tool 实例列表 onyx/tools/tool_constructor.py:161。
来源: onyx/tools/tool_constructor.py:114-176
工具配置对象
特定的配置对象控制工具构建行为和过滤范围:
SearchToolConfig
控制内部文档搜索配置 onyx/tools/tool_constructor.py:55-67:
| 字段 | 类型 | 用途 |
|---|---|---|
user_selected_filters | BaseFilters | None | 用户应用的来源类型和时间范围过滤器 |
project_id_filter | int | None | 将搜索限制在 Vespa 中的项目文件 |
persona_id_filter | int | None | 将搜索限制在 Vespa 中的角色文件 |
bypass_acl | bool | 是否绕过访问控制(管理员功能) |
slack_context | SlackContext | None | 用于联合搜索的 Slack 特定上下文 |
FileReaderToolConfig
用于指定 FileReaderTool 应有权访问哪些文件 onyx/tools/tool_constructor.py:69-74:
| 字段 | 类型 | 用途 |
|---|---|---|
user_file_ids | list[UUID] | 来自 user_file 表的 ID(角色附加) |
chat_file_ids | list[UUID] | 来自 file_record 表的 ID(聊天附加) |
来源: onyx/tools/tool_constructor.py:55-82
工具执行详情
PythonTool(代码解释器)
PythonTool 使用 CodeInterpreterClient 与外部沙箱服务进行通信 onyx/tools/tool_implementations/python/python_tool.py:51-57。
- 可用性:通过
CODE_INTERPRETER_BASE_URL和服务器健康检查来验证onyx/tools/tool_implementations/python/python_tool.py:93-101。 - 文件处理:它可以通过将文件上传到解释器并缓存
ci_file_id来准备执行文件,从而避免在会话内重复上传onyx/tools/tool_implementations/python/python_tool.py:168-182。 - 流式传输:它会向前端发送
PythonToolStart和PythonToolDelta数据包,以实时显示代码和输出onyx/tools/tool_implementations/python/python_tool.py:157-163。
WebSearchTool
WebSearchTool 抽象了各种互联网搜索提供者(Google、Bing、Serper 等)onyx/tools/tool_implementations/web_search/web_search_tool.py:83-114。
- 消毒:在发送给提供者之前,会对大语言模型(LLM)生成的查询进行消毒,以移除控制字符并规范化空白字符
onyx/tools/tool_implementations/web_search/web_search_tool.py:47-56。 - 并行性:大语言模型(LLM)生成的多个搜索查询会使用线程池并行执行
onyx/tools/tool_implementations/web_search/web_search_tool.py:39。
OpenURLTool
OpenURLTool 允许大语言模型(LLM)“浏览”特定链接 onyx/tools/tool_implementations/open_url/open_url_tool.py:29。
- 混合检索:它首先尝试在现有的 Onyx 索引中查找 URL
onyx/tools/tool_implementations/open_url/open_url_tool.py:181-183。如果未找到,则使用WebContentProvider(如 Firecrawl 或基本抓取器)获取实时页面onyx/tools/tool_implementations/open_url/open_url_tool.py:132-133。 - 规范化:URL 会被规范化(移除片段/查询参数),以提高缓存和索引命中率
onyx/tools/tool_implementations/open_url/open_url_tool.py:150-167。
ImageGenerationTool
当用户明确请求图像时使用 onyx/tools/tool_implementations/images/image_generation_tool.py:48-51。
- 心跳:由于图像生成可能较慢,该工具每 5 秒发送一次
ImageGenerationToolHeartbeat数据包,以防止客户端超时onyx/tools/tool_implementations/images/image_generation_tool.py:41-42。 - 持久化:生成的图像会保存到 Onyx 的
FileStore中,并作为包含前端可访问 URL 的GeneratedImage对象返回onyx/tools/tool_implementations/images/image_generation_tool.py:231-253。
来源: onyx/tools/tool_implementations/python/python_tool.py:51-182,onyx/tools/tool_implementations/web_search/web_search_tool.py:47-114,onyx/tools/tool_implementations/open_url/open_url_tool.py:132-183,onyx/tools/tool_implementations/images/image_generation_tool.py:41-253
MCP(模型上下文协议)集成
Onyx 支持模型上下文协议,允许其连接到外部 MCP 服务器以动态扩展其工具集 onyx/tools/tool_implementations/mcp/mcp_tool.py:52。
自然语言空间到代码实体空间:MCP 流程
- 认证:支持
NONE、API_KEY和PT_OAUTH(直通 OAuth),其中用户的登录令牌会传递给 MCP 服务器onyx/tools/tool_implementations/mcp/mcp_tool.py:167-172。 - 优先级:来自
MCPConnectionConfig(数据库)的请求头优先于来自 API 请求的附加请求头onyx/tools/tool_implementations/mcp/mcp_tool.py:132-164。 - 安全性:拒绝列表包含关键请求头(如
Host),以防止请求头注入攻击onyx/tools/tool_implementations/mcp/mcp_tool.py:23-28。
来源: onyx/tools/tool_implementations/mcp/mcp_tool.py:23-182,onyx/tools/tool_constructor.py:16-18