
























@@ -1403,6 +1403,46 @@ describe("openai transport stream", () => {
14031403expect(params.top_p).toBe(0.9);
14041404});
140514051406+it("forwards response_format to chat completions request params", () => {
1407+const model = {
1408+id: "gpt-5.4",
1409+name: "GPT-5.4",
1410+api: "openai-completions",
1411+provider: "openai",
1412+baseUrl: "https://api.openai.com/v1",
1413+reasoning: false,
1414+input: ["text"],
1415+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1416+contextWindow: 200000,
1417+maxTokens: 8192,
1418+} satisfies Model<"openai-completions">;
1419+1420+const context = {
1421+systemPrompt: "system",
1422+messages: [{ role: "user", content: "hi", timestamp: 1 }],
1423+tools: [],
1424+} as never;
1425+1426+{
1427+const params = buildOpenAICompletionsParams(model, context, {
1428+responseFormat: { type: "json_object" },
1429+});
1430+expect(params.response_format).toEqual({ type: "json_object" });
1431+}
1432+1433+{
1434+const params = buildOpenAICompletionsParams(model, context, {
1435+responseFormat: { type: "json_schema", json_schema: {} },
1436+});
1437+expect(params.response_format).toEqual({ type: "json_schema", json_schema: {} });
1438+}
1439+1440+{
1441+const params = buildOpenAICompletionsParams(model, context, {});
1442+expect(params).not.toHaveProperty("response_format");
1443+}
1444+});
1445+14061446it("does not build OpenRouter reasoning params for Hunter Alpha when reasoning is disabled", () => {
14071447const params = buildOpenAICompletionsParams(
14081448{
@@ -1569,6 +1609,7 @@ describe("openai transport stream", () => {
15691609prompt_cache_retention: "24h",
15701610service_tier: "auto",
15711611temperature: 0.2,
1612+text: { format: { type: "json_object" } },
15721613top_p: 0.85,
15731614};
15741615@@ -1594,6 +1635,7 @@ describe("openai transport stream", () => {
15941635expect(sanitized).not.toHaveProperty("prompt_cache_retention");
15951636expect(sanitized).not.toHaveProperty("service_tier");
15961637expect(sanitized).not.toHaveProperty("temperature");
1638+expect(sanitized).not.toHaveProperty("text");
15971639expect(sanitized).not.toHaveProperty("top_p");
15981640});
15991641@@ -1640,6 +1682,51 @@ describe("openai transport stream", () => {
16401682expect(params.top_p).toBe(0.85);
16411683});
164216841685+it("forwards response_format to responses text format request params", () => {
1686+const model = {
1687+id: "gpt-5.4",
1688+name: "GPT-5.4",
1689+api: "openai-responses",
1690+provider: "openai",
1691+baseUrl: "https://api.openai.com/v1",
1692+reasoning: true,
1693+input: ["text"],
1694+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1695+contextWindow: 200000,
1696+maxTokens: 65_536,
1697+} satisfies Model<"openai-responses">;
1698+1699+const context = {
1700+systemPrompt: "system",
1701+messages: [{ role: "user", content: "hi", timestamp: 1 }],
1702+tools: [],
1703+} as never;
1704+1705+{
1706+const params = buildOpenAIResponsesParams(model, context, {
1707+responseFormat: { type: "json_object" },
1708+}) as Record<string, unknown>;
1709+expect(params.text).toEqual({ format: { type: "json_object" } });
1710+}
1711+1712+{
1713+const params = buildOpenAIResponsesParams(model, context, {
1714+responseFormat: {
1715+type: "json_schema",
1716+json_schema: { name: "test", schema: { type: "object" } },
1717+},
1718+}) as Record<string, unknown>;
1719+expect(params.text).toEqual({
1720+format: { type: "json_schema", name: "test", schema: { type: "object" } },
1721+});
1722+}
1723+1724+{
1725+const params = buildOpenAIResponsesParams(model, context, {}) as Record<string, unknown>;
1726+expect(params).not.toHaveProperty("text");
1727+}
1728+});
1729+16431730it("preserves custom Codex-compatible responses params after payload hooks mutate them", () => {
16441731const payload = {
16451732model: "gpt-5.4",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。