配置优先级:环境变量 > config.json > 默认值
| 变量 | 默认值 | 说明 |
|---|---|---|
PORT / OPENCODE_PROXY_PORT |
10000 |
代理服务端口 |
OPENCODE_SERVER_PORT |
10001 |
OpenCode 后端服务端口 |
API_KEY |
- | Bearer Token 认证密钥 |
BIND_HOST |
0.0.0.0 |
绑定地址 |
OPENCODE_SERVER_URL |
http://127.0.0.1:10001 |
OpenCode 后端地址 |
OPENCODE_SERVER_PASSWORD |
- | OpenCode 后端密码 |
| 变量 | 默认值 | 说明 |
|---|---|---|
DISABLE_TOOLS |
true |
禁用 OpenCode 工具调用 |
OPENCODE_EXTERNAL_TOOLS_MODE |
proxy-bridge |
外部工具桥接模式;当前仅支持 proxy-bridge |
OPENCODE_EXTERNAL_TOOLS_CONFLICT_POLICY |
namespace |
外部工具冲突隔离策略;当前仅支持 namespace |
OPENCODE_INTERNAL_WEB_FETCH_ENABLED |
false |
兼容旧开关;未显式配置 allowlist 时,启用后默认放行 web_fetch |
OPENCODE_INTERNAL_ALLOWED_TOOLS |
(none) |
当请求未传入 tools 时允许使用的 OpenCode 内置工具列表,逗号分隔 |
OPENCODE_INTERNAL_TOOL_METRICS_ENABLED |
true |
输出 internal allowlist 模式的调试/指标日志 |
OPENCODE_TOOL_DISCOVERY_FIXTURE |
(none) |
集成测试/本地调试用的固定后端工具 ID 列表,逗号分隔 |
OPENCODE_HEALTH_DETAILS_ENABLED |
true |
控制 /health/details 是否暴露 |
OPENCODE_HEALTH_DETAILS_REQUIRE_AUTH |
true |
控制 /health/details 是否要求 Bearer 认证 |
OPENCODE_METRICS_ENABLED |
false |
控制 Prometheus /metrics 是否暴露 |
OPENCODE_METRICS_REQUIRE_AUTH |
true |
控制 /metrics 是否要求 Bearer 认证 |
USE_ISOLATED_HOME |
false |
使用隔离的 OpenCode 配置目录 |
PROMPT_MODE |
standard |
提示词处理模式 |
OMIT_SYSTEM_PROMPT |
false |
忽略传入的 system prompt |
AUTO_CLEANUP_CONVERSATIONS |
false |
自动清理会话存储 |
CLEANUP_INTERVAL_MS |
43200000 |
清理间隔 (毫秒) |
CLEANUP_MAX_AGE_MS |
86400000 |
最大存储时间 (毫秒) |
REQUEST_TIMEOUT_MS |
180000 |
请求超时时间 (毫秒) |
| 变量 | 默认值 | 说明 |
|---|---|---|
DEBUG / OPENCODE_PROXY_DEBUG |
false |
开启调试日志 |
OPENCODE_PATH |
opencode |
OpenCode 可执行文件路径 |
OPENCODE_ZEN_API_KEY |
- | Zen API Key 透传 |
{
"PORT": 10000,
"API_KEY": "your-secret-api-key",
"BIND_HOST": "0.0.0.0",
"DISABLE_TOOLS": true,
"EXTERNAL_TOOLS_MODE": "proxy-bridge",
"EXTERNAL_TOOLS_CONFLICT_POLICY": "namespace",
"INTERNAL_WEB_FETCH_ENABLED": false,
"INTERNAL_ALLOWED_TOOLS": ["web_fetch"],
"INTERNAL_TOOL_METRICS_ENABLED": true,
"INTERNAL_TOOL_DISCOVERY_FIXTURE": [],
"USE_ISOLATED_HOME": false,
"PROMPT_MODE": "standard",
"OMIT_SYSTEM_PROMPT": false,
"AUTO_CLEANUP_CONVERSATIONS": false,
"CLEANUP_INTERVAL_MS": 43200000,
"CLEANUP_MAX_AGE_MS": 86400000,
"DEBUG": false,
"OPENCODE_SERVER_URL": "http://127.0.0.1:10001",
"OPENCODE_PATH": "opencode",
"REQUEST_TIMEOUT_MS": 180000
}OpenCode2API 现在支持把外部客户端传入的 OpenAI-compatible tools 桥接到代理层,而不是把这些工具直接暴露为 OpenCode 内置工具。
| 配置项 | 支持值 | 说明 |
|---|---|---|
OPENCODE_EXTERNAL_TOOLS_MODE / EXTERNAL_TOOLS_MODE |
proxy-bridge |
由代理虚拟化外部工具,并返回 OpenAI-compatible tool calling 结果 |
OPENCODE_EXTERNAL_TOOLS_CONFLICT_POLICY / EXTERNAL_TOOLS_CONFLICT_POLICY |
namespace |
使用代理内部命名空间隔离同名冲突 |
- 外部客户端工具优先以“代理桥接”的方式参与对话。
- OpenCode 内置工具仍按现有
DISABLE_TOOLS机制管理,不会因为客户端传入同名工具而被误触发。 - 代理内部会使用类似
external__web_fetch的命名空间名避免冲突。 - 这些内部命名空间名称不会作为公开 API 的一部分暴露给客户端。
- 当请求 未传入
tools时,代理会进入 internal allowlist 模式,只允许OPENCODE_INTERNAL_ALLOWED_TOOLS中声明的 OpenCode 内置工具。 OPENCODE_INTERNAL_WEB_FETCH_ENABLED=true仅用于兼容旧配置:如果未显式配置 allowlist,则默认把 allowlist 视为web_fetch。- 代理会读取后端工具列表,并通过精确匹配或
.<tool>//<tool>后缀匹配解析最终可用工具。 - 如果配置的 allowlist 在后端工具列表中一个也没有匹配到,代理会自动回退到“全部内置工具禁用”的安全模式。
OPENCODE_INTERNAL_TOOL_METRICS_ENABLED=true时,会输出 internal allowlist 模式的调试/指标日志,记录模式选择、后端工具发现、allowlist 命中情况和降级原因,但不会记录工具输出内容。OPENCODE_TOOL_DISCOVERY_FIXTURE可在集成测试或本地调试时绕过真实client.tool.ids(),直接提供固定工具 ID 列表。- 一旦客户端传入
tools,请求立即切回外部工具桥接模式,所有 OpenCode 内置工具继续保持禁用。
在请求未传入 tools 的前提下,客户端可以在请求体中传入自定义字段 opencode.internal_allowed_tools 来覆盖服务端的默认内置工具列表。
出于安全隔离原则,请求级覆盖只能缩小(求交集),不能扩大服务端的 allowlist 权限:
- 如果请求了服务端未开启的内置工具,该工具会被自动忽略。
effective_allowlist = intersection(server_allowlist, request_allowlist)
示例:
{
"model": "opencode/kimi-k2.5",
"messages": [{"role": "user", "content": "Fetch this URL"}],
"opencode": {
"internal_allowed_tools": ["web_fetch"]
}
}可以通过 GET /health/details 接口获取代理内部的运行状态与指标。这不仅有助于问题排查,也是用于编写集成行为测试的重要依据。
OPENCODE_HEALTH_DETAILS_ENABLED=false时,接口返回404。OPENCODE_HEALTH_DETAILS_REQUIRE_AUTH=true时,接口要求 Bearer 认证;否则返回401。 返回值格式如下:
{
"status": "ok",
"proxy": true,
"internal_tools": {
"config": {
"allowed_tools": ["web_fetch", "filesystem"],
"metrics_enabled": true,
"discovery_fixture": ["web_fetch", "filesystem", "bash"]
},
"metrics": {
"externalBridgeRequests": 12,
"internalAllowlistRequests": 8,
"disabledRequests": 21,
"discoveryFailures": 1,
"fallbackToDisabled": 2
},
"cache": {
"tool_ids_cached": true,
"tool_id_count": 3,
"age_ms": 12000
},
"audit": {
"available": true,
"fields": [
"requestedAllowlist",
"allowedToolNames",
"deniedRequestedTools",
"resolutionPath",
"resultingMode"
]
}
}
}可以通过 GET /metrics 获取 Prometheus 文本格式指标。
OPENCODE_METRICS_ENABLED=false时,接口返回404。OPENCODE_METRICS_REQUIRE_AUTH=true时,接口要求 Bearer 认证;否则返回401。 当前暴露的核心指标包括:opencode_internal_tool_mode_requests_total{mode="external_bridge"}opencode_internal_tool_mode_requests_total{mode="internal_allowlist"}opencode_internal_tool_mode_requests_total{mode="disabled"}opencode_internal_tool_discovery_failures_totalopencode_internal_tool_fallback_disabled_totalopencode_internal_tool_cache_ids
DISABLE_TOOLS=true
OPENCODE_EXTERNAL_TOOLS_MODE=proxy-bridge
OPENCODE_EXTERNAL_TOOLS_CONFLICT_POLICY=namespace
OPENCODE_INTERNAL_ALLOWED_TOOLS=web_fetch
OPENCODE_INTERNAL_TOOL_METRICS_ENABLED=true
OPENCODE_TOOL_DISCOVERY_FIXTURE=
OPENCODE_HEALTH_DETAILS_ENABLED=true
OPENCODE_HEALTH_DETAILS_REQUIRE_AUTH=true
OPENCODE_METRICS_ENABLED=false
OPENCODE_METRICS_REQUIRE_AUTH=true
OPENCODE_PROXY_PROMPT_MODE=plugin-inject
OPENCODE_PROXY_OMIT_SYSTEM_PROMPT=true
OPENCODE_PROXY_AUTO_CLEANUP_CONVERSATIONS=true| 模式 | 说明 |
|---|---|
| standard (默认) | 标准模式,完整处理提示词 |
| plugin-inject | 插件注入模式,减小模型侧提示词大小,通常与 OMIT_SYSTEM_PROMPT=true 配合使用 |
DISABLE_TOOLS=true
OPENCODE_EXTERNAL_TOOLS_MODE=proxy-bridge
OPENCODE_EXTERNAL_TOOLS_CONFLICT_POLICY=namespace
OPENCODE_INTERNAL_ALLOWED_TOOLS=web_fetch
OPENCODE_INTERNAL_TOOL_METRICS_ENABLED=true
OPENCODE_TOOL_DISCOVERY_FIXTURE=
OPENCODE_HEALTH_DETAILS_ENABLED=true
OPENCODE_HEALTH_DETAILS_REQUIRE_AUTH=true
OPENCODE_METRICS_ENABLED=false
OPENCODE_METRICS_REQUIRE_AUTH=true
OPENCODE_PROXY_PROMPT_MODE=plugin-inject
OPENCODE_PROXY_OMIT_SYSTEM_PROMPT=true
OPENCODE_PROXY_AUTO_CLEANUP_CONVERSATIONS=trueDISABLE_TOOLS=false
OPENCODE_PROXY_DEBUG=true