| |
| import { describe, it, expect } from "vitest"; |
| import "./registerAll.js"; |
| import { translateRequest } from "../../open-sse/translator/index.js"; |
| import { FORMATS } from "../../open-sse/translator/formats.js"; |
|
|
| const AG2O = (req) => |
| translateRequest(FORMATS.ANTIGRAVITY, FORMATS.OPENAI, "m", { request: req }, true, null, null); |
|
|
| describe("Antigravity β OpenAI", () => { |
| |
| |
| |
| it.fails("functionResponse + functionCall in same content keeps both", () => { |
| const out = AG2O({ |
| contents: [{ |
| role: "model", |
| parts: [ |
| { functionResponse: { id: "c1", name: "prev", response: { result: "done" } } }, |
| { functionCall: { id: "c2", name: "next", args: {} } }, |
| ], |
| }], |
| }); |
| const json = JSON.stringify(out); |
| expect(json, "functionCall lost when sharing content with functionResponse").toContain("\"next\""); |
| }); |
|
|
| |
| |
| it.fails("functionCall without id keeps a stable matchable id", () => { |
| const out = AG2O({ |
| contents: [ |
| { role: "model", parts: [{ functionCall: { name: "search", args: { q: "x" } } }] }, |
| { role: "user", parts: [{ functionResponse: { name: "search", response: { result: "r" } } }] }, |
| ], |
| }); |
| const asst = out.messages.find((m) => m.tool_calls); |
| const tool = out.messages.find((m) => m.role === "tool"); |
| expect(tool?.tool_call_id, "id mismatch between call and response").toBe(asst?.tool_calls?.[0]?.id); |
| }); |
|
|
| |
| it("signature-only part does not produce empty text", () => { |
| const out = AG2O({ |
| contents: [{ role: "model", parts: [{ thoughtSignature: "sig", text: "" }] }], |
| }); |
| const asst = out.messages.find((m) => m.role === "assistant"); |
| const content = asst?.content; |
| const hasEmpty = Array.isArray(content) |
| ? content.some((c) => c.type === "text" && c.text === "") |
| : content === ""; |
| expect(hasEmpty, "empty text part emitted").toBe(false); |
| }); |
| }); |
|
|