























@@ -980,7 +980,7 @@ describe("openai transport stream", () => {
980980expect(params.input?.[0]).toMatchObject({ role: "developer" });
981981});
982982983-it("uses top-level instructions for Codex responses without dropping parity fields", () => {
983+it("uses top-level instructions for Codex responses and strips unsupported ChatGPT params", () => {
984984const params = buildOpenAIResponsesParams(
985985{
986986id: "gpt-5.4",
@@ -1020,15 +1020,122 @@ describe("openai transport stream", () => {
10201020false,
10211021);
10221022expect(params.prompt_cache_key).toBe("session-123");
1023-expect(params.prompt_cache_retention).toBeUndefined();
1023+expect(params.store).toBe(false);
1024+expect(params).not.toHaveProperty("metadata");
1025+expect(params).not.toHaveProperty("max_output_tokens");
1026+expect(params).not.toHaveProperty("prompt_cache_retention");
1027+expect(params).not.toHaveProperty("service_tier");
1028+expect(params).not.toHaveProperty("temperature");
1029+});
1030+1031+it("sanitizes Codex responses params after payload hooks mutate them", () => {
1032+const payload = {
1033+model: "gpt-5.4",
1034+input: [],
1035+stream: true,
1036+max_output_tokens: 1024,
1037+metadata: { openclaw_session_id: "session-123" },
1038+prompt_cache_key: "session-123",
1039+prompt_cache_retention: "24h",
1040+service_tier: "auto",
1041+temperature: 0.2,
1042+};
1043+1044+const sanitized = __testing.sanitizeOpenAICodexResponsesParams(
1045+{
1046+id: "gpt-5.4",
1047+name: "GPT-5.4",
1048+api: "openai-codex-responses",
1049+provider: "openai-codex",
1050+baseUrl: "https://chatgpt.com/backend-api",
1051+reasoning: true,
1052+input: ["text"],
1053+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1054+contextWindow: 200000,
1055+maxTokens: 8192,
1056+} satisfies Model<"openai-codex-responses">,
1057+payload,
1058+);
1059+1060+expect(sanitized.prompt_cache_key).toBe("session-123");
1061+expect(sanitized).not.toHaveProperty("metadata");
1062+expect(sanitized).not.toHaveProperty("max_output_tokens");
1063+expect(sanitized).not.toHaveProperty("prompt_cache_retention");
1064+expect(sanitized).not.toHaveProperty("service_tier");
1065+expect(sanitized).not.toHaveProperty("temperature");
1066+});
1067+1068+it("preserves custom Codex-compatible responses params", () => {
1069+const params = buildOpenAIResponsesParams(
1070+{
1071+id: "gpt-5.4",
1072+name: "GPT-5.4",
1073+api: "openai-codex-responses",
1074+provider: "openai-codex",
1075+baseUrl: "https://proxy.example.com/v1",
1076+reasoning: true,
1077+input: ["text"],
1078+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1079+contextWindow: 200000,
1080+maxTokens: 8192,
1081+} satisfies Model<"openai-codex-responses">,
1082+{
1083+systemPrompt: `Stable prefix${SYSTEM_PROMPT_CACHE_BOUNDARY}Dynamic suffix`,
1084+messages: [{ role: "user", content: "Hello", timestamp: 1 }],
1085+tools: [],
1086+} as never,
1087+{
1088+cacheRetention: "long",
1089+maxTokens: 1024,
1090+sessionId: "session-123",
1091+temperature: 0.2,
1092+},
1093+{
1094+openclaw_session_id: "session-123",
1095+openclaw_turn_id: "turn-123",
1096+},
1097+) as Record<string, unknown>;
1098+1099+expect(params.instructions).toBe("Stable prefix\nDynamic suffix");
1100+expect(params.prompt_cache_key).toBe("session-123");
10241101expect(params.metadata).toEqual({
10251102openclaw_session_id: "session-123",
10261103openclaw_turn_id: "turn-123",
10271104});
1028-expect(params.store).toBe(false);
10291105expect(params.max_output_tokens).toBe(1024);
10301106expect(params.temperature).toBe(0.2);
1031-expect(params.service_tier).toBe("auto");
1107+});
1108+1109+it("preserves custom Codex-compatible responses params after payload hooks mutate them", () => {
1110+const payload = {
1111+model: "gpt-5.4",
1112+input: [],
1113+stream: true,
1114+max_output_tokens: 1024,
1115+metadata: { openclaw_session_id: "session-123" },
1116+prompt_cache_key: "session-123",
1117+prompt_cache_retention: "24h",
1118+service_tier: "auto",
1119+temperature: 0.2,
1120+};
1121+1122+const sanitized = __testing.sanitizeOpenAICodexResponsesParams(
1123+{
1124+id: "gpt-5.4",
1125+name: "GPT-5.4",
1126+api: "openai-codex-responses",
1127+provider: "openai-codex",
1128+baseUrl: "https://proxy.example.com/v1",
1129+reasoning: true,
1130+input: ["text"],
1131+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1132+contextWindow: 200000,
1133+maxTokens: 8192,
1134+} satisfies Model<"openai-codex-responses">,
1135+payload,
1136+);
1137+1138+expect(sanitized).toEqual(payload);
10321139});
1033114010341141it("adds minimal user input for Codex responses when only the system prompt is present", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。