Skip to content

feat(headers): 支持为 AI 渠道配置自定义 HTTP 请求头 - #379

Open
nightslient wants to merge 2 commits into
AIPentest:mainfrom
nightslient:feat/ai-channel-custom-headers
Open

nightslient wants to merge 2 commits into
AIPentest:mainfrom
nightslient:feat/ai-channel-custom-headers

Conversation

@nightslient

Copy link
Copy Markdown

关联#372,由于遇到同类问题,所以改了一下,实测opencode可用。

背景

opencode 等聚合供应商要求私有请求头(如 x-opencode-session),
当前只能发送固定的 Authorization: Bearer,无法接入。

改动

  • 渠道可配置 headers(yaml 或设置页),支持 ${ENV} 与 %session_id%
  • 覆盖 Eino ChatModel 与内置 Client 两条请求路径
  • 连接测试(单通道/批量/HITL 审计)同步携带 headers

配置示例

ai:
  channels:
    opencode:
      headers:
        x-opencode-session: '%session_id%'
        X-Client-Name: cyberstrike-ai

root and others added 2 commits October 30, 2026 20:13
部分 OpenAI 兼容供应商(如 opencode)要求私有鉴权头或会话头,
而非标准的 Authorization: Bearer,导致无法接入。

- config: OpenAIConfig / AIChannelConfig 新增 headers 字段,
  值支持 ${ENV_VAR}、${ENV_VAR:-default} 与 %session_id% 占位符
- openai: 新增 headersRoundTripper 接入 Eino ChatModel 传输链,
  同名的内置头(Authorization/User-Agent 等)可被覆盖
- openai: 内置 Client 的 4 处出站请求同样注入自定义头
- handler: 任务开始时把对话 ID 注入 ctx,供 %session_id% 替换;
  连接测试没有真实会话,使用探测值 connect-test
- web: 渠道设置页新增“自定义请求头”编辑区(每行 KEY=VALUE)
- 占位符使用 %session_id% 而非 {{session_id}},因为 index.html
  由 Go html/template 渲染,双花括号会被当作模板函数解析
- applyCustomHeaders:覆盖内置头、跳过空值、无配置时保持原行为
- headersRoundTripper:经 Eino 传输链端到端验证头已下发
- %session_id%:有会话时替换、无会话时跳过该头
- TestOpenAI:测试连接会携带静态头,%session_id% 填充探测值,
  未配置 headers 时仍使用 Bearer <api_key>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant