Files
sub2api/backend/internal/service/openai_codex_transform_additions_test.go
T
eyre 5e6effd79c feat: 模型感知 Codex prompt / client_metadata / anthropic SSE 补全
- 模型感知 instructions:刷新 instructions.txt 至最新 GPT-5-Codex prompt,新增
  GPT-5.1 / GPT-5.2 真实 Codex 编码 agent prompt;新增 openai.CodexBaseInstructionsForModel
  按模型选用(codex 系→GPT-5-Codex,gpt-5.2→GPT-5.2,gpt-5.1/gpt-5→GPT-5.1),
  defaultCodexSynthInstructions 改为按 model 选择
- client_metadata:OAuth /responses 请求用账号真实 openai_device_id 注入
  client_metadata["x-codex-installation-id"];加法式、幂等、不覆盖既有项,
  无 device_id(非 OAuth 账号)则不写入、不伪造
- anthropic 转换补全 SSE 事件 reasoning_text.delta 与 custom_tool_call_input.delta
  (含 custom_tool_call item 注册为 tool_use),与 chat completions 路径对齐
- 新增单元测试覆盖以上行为(apicompat / openai / service)

承接上一提交,仍为加法式改进,不改动既有可工作的请求头。
2026-06-06 00:59:27 +08:00

67 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package service
import (
"strings"
"testing"
"github.com/stretchr/testify/require"
)
// ensureCodexReasoningInclude:带 reasoning 时补齐 include,幂等且保留既有项。
func TestEnsureCodexReasoningInclude(t *testing.T) {
// reasoning 存在、include 缺失 → 注入
body := map[string]any{"reasoning": map[string]any{"effort": "medium"}}
require.True(t, ensureCodexReasoningInclude(body))
require.Equal(t, []any{"reasoning.encrypted_content"}, body["include"])
// 幂等:再次调用不重复
require.False(t, ensureCodexReasoningInclude(body))
// 无 reasoning → 不动
body2 := map[string]any{}
require.False(t, ensureCodexReasoningInclude(body2))
_, ok := body2["include"]
require.False(t, ok)
// 既有 include 保留并追加
body3 := map[string]any{
"reasoning": map[string]any{"effort": "high"},
"include": []any{"foo"},
}
require.True(t, ensureCodexReasoningInclude(body3))
require.Equal(t, []any{"foo", "reasoning.encrypted_content"}, body3["include"])
}
// applyCodexClientMetadata:用账号真实 device_id 注入 installation 标识,幂等、不覆盖既有项、不伪造。
func TestApplyCodexClientMetadata(t *testing.T) {
// 仅 OpenAI OAuth 账号才有 device_id(GetOpenAIDeviceID 的门控)。
acc := &Account{Platform: PlatformOpenAI, Type: AccountTypeOAuth, Extra: map[string]any{"openai_device_id": "dev-xyz"}}
body := map[string]any{}
require.True(t, applyCodexClientMetadata(body, acc))
cm, ok := body["client_metadata"].(map[string]any)
require.True(t, ok)
require.Equal(t, "dev-xyz", cm["x-codex-installation-id"])
// 幂等
require.False(t, applyCodexClientMetadata(body, acc))
// OAuth 账号但无 device_id → 不写入(不伪造)
body2 := map[string]any{}
require.False(t, applyCodexClientMetadata(body2, &Account{Platform: PlatformOpenAI, Type: AccountTypeOAuth}))
_, ok = body2["client_metadata"]
require.False(t, ok)
// 既有 client_metadata(如 turn metadata)保留,仅补 installation 键
body3 := map[string]any{"client_metadata": map[string]any{"x-codex-turn-metadata": "t"}}
require.True(t, applyCodexClientMetadata(body3, acc))
cm3 := body3["client_metadata"].(map[string]any)
require.Equal(t, "t", cm3["x-codex-turn-metadata"])
require.Equal(t, "dev-xyz", cm3["x-codex-installation-id"])
}
// defaultCodexSynthInstructions:按模型选用真实 Codex base prompt。
func TestDefaultCodexSynthInstructionsModelAware(t *testing.T) {
require.True(t, strings.Contains(defaultCodexSynthInstructions("gpt-5-codex"), "You are Codex, based on GPT-5"))
require.True(t, strings.Contains(defaultCodexSynthInstructions("gpt-5.2"), "You are GPT-5.2 running in the Codex CLI"))
require.True(t, strings.Contains(defaultCodexSynthInstructions("gpt-5.1"), "You are GPT-5.1 running in the Codex CLI"))
}