Spaces:
Sleeping
Sleeping
| import { describe, expect, it } from "vitest"; | |
| import { CodexExecutor } from "../../open-sse/executors/codex.js"; | |
| function normalizeTools(tools) { | |
| const executor = new CodexExecutor(); | |
| const body = { | |
| model: "gpt-5.5", | |
| input: [{ type: "message", role: "user", content: [{ type: "input_text", text: "probe" }] }], | |
| tools, | |
| stream: true, | |
| }; | |
| executor.transformRequest("gpt-5.5", body, true, { | |
| connectionId: "test-codex-tools", | |
| providerSpecificData: {}, | |
| }); | |
| return body.tools; | |
| } | |
| describe("CodexExecutor tool normalization", () => { | |
| it("preserves Responses text.format for structured outputs", () => { | |
| const executor = new CodexExecutor(); | |
| const schema = { | |
| type: "object", | |
| additionalProperties: false, | |
| properties: { | |
| title: { type: "string" }, | |
| }, | |
| required: ["title"], | |
| }; | |
| const body = { | |
| model: "gpt-5.4-mini", | |
| input: [{ type: "message", role: "user", content: [{ type: "input_text", text: "test for session title" }] }], | |
| stream: true, | |
| metadata: { unsupported: true }, | |
| text: { | |
| format: { | |
| type: "json_schema", | |
| name: "codex_output_schema", | |
| strict: true, | |
| schema, | |
| }, | |
| }, | |
| }; | |
| executor.transformRequest("gpt-5.4-mini", body, true, { | |
| connectionId: "test-codex-structured-output", | |
| providerSpecificData: {}, | |
| }); | |
| expect(body.text).toEqual({ | |
| format: { | |
| type: "json_schema", | |
| name: "codex_output_schema", | |
| strict: true, | |
| schema, | |
| }, | |
| }); | |
| expect(body.metadata).toBeUndefined(); | |
| }); | |
| it("preserves Responses-native tool_search tools", () => { | |
| const tools = normalizeTools([ | |
| { | |
| type: "tool_search", | |
| execution: "sync", | |
| description: "Discover deferred tools", | |
| parameters: { type: "object", properties: {} }, | |
| }, | |
| { | |
| type: "namespace", | |
| name: "codex_app", | |
| description: "app tools", | |
| tools: [ | |
| { | |
| type: "function", | |
| name: "automation_update", | |
| description: "automation", | |
| parameters: { type: "object", properties: {} }, | |
| defer_loading: true, | |
| }, | |
| ], | |
| }, | |
| { | |
| type: "function", | |
| name: "plain_fn", | |
| description: "plain", | |
| parameters: { type: "object", properties: {} }, | |
| }, | |
| ]); | |
| expect(tools.map((tool) => `${tool.type}:${tool.name || ""}`)).toEqual([ | |
| "tool_search:", | |
| "namespace:codex_app", | |
| "function:plain_fn", | |
| ]); | |
| }); | |
| it("preserves hosted Responses tools", () => { | |
| const tools = normalizeTools([ | |
| { type: "web_search", search_context_size: "medium" }, | |
| { type: "image_generation", size: "1024x1024" }, | |
| { type: "mcp", server_label: "docs", server_url: "https://example.com/mcp" }, | |
| { type: "local_shell" }, | |
| { type: "code_interpreter", container: { type: "auto" } }, | |
| { type: "computer", display_width: 1024, display_height: 768, environment: "browser" }, | |
| ]); | |
| expect(tools.map((tool) => tool.type)).toEqual([ | |
| "web_search", | |
| "image_generation", | |
| "mcp", | |
| "local_shell", | |
| "code_interpreter", | |
| "computer", | |
| ]); | |
| }); | |
| it("preserves custom freeform tools with format payloads", () => { | |
| const tools = normalizeTools([ | |
| { | |
| type: "custom", | |
| name: "apply_patch", | |
| description: "patch", | |
| format: { type: "grammar", syntax: "lark", definition: "start: /.+/" }, | |
| }, | |
| ]); | |
| expect(tools).toEqual([ | |
| { | |
| type: "custom", | |
| name: "apply_patch", | |
| description: "patch", | |
| format: { type: "grammar", syntax: "lark", definition: "start: /.+/" }, | |
| }, | |
| ]); | |
| }); | |
| }); | |