|
1 | 1 | import { describe, expect, it } from "bun:test"; |
2 | 2 |
|
3 | 3 | import { cacheSignature } from "../cache"; |
4 | | -import { normalizeToolCallArgs, recursivelyParseJsonStrings } from "../request-helpers"; |
| 4 | +import { ANTIGRAVITY_BASE_SYSTEM_INSTRUCTION, normalizeToolCallArgs, recursivelyParseJsonStrings } from "../request-helpers"; |
5 | 5 | import { cacheToolSchemas, clearToolSchemaCache } from "../tool-schema-cache"; |
6 | 6 | import { transformClaudeRequest } from "./claude"; |
7 | 7 | import { transformGeminiRequest } from "./gemini"; |
@@ -139,6 +139,38 @@ describe("thoughtSignature handling", () => { |
139 | 139 | const userParts = contents[0].parts; |
140 | 140 | expect(userParts[0].thoughtSignature).toBe("user-sig-should-stay"); |
141 | 141 | }); |
| 142 | + |
| 143 | + it("prepends Antigravity systemInstruction and requestType for gemini-3-pro", () => { |
| 144 | + const payload: RequestPayload = { |
| 145 | + systemInstruction: { parts: [{ text: "Existing instruction" }] }, |
| 146 | + contents: [{ role: "user", parts: [{ text: "hi" }] }], |
| 147 | + }; |
| 148 | + |
| 149 | + const context = createContext("gemini-3-pro-high"); |
| 150 | + const result = transformGeminiRequest(context, payload); |
| 151 | + const parsed = JSON.parse(result.body); |
| 152 | + |
| 153 | + expect(parsed.requestType).toBe("agent"); |
| 154 | + expect(parsed.request.systemInstruction.role).toBe("user"); |
| 155 | + expect(parsed.request.systemInstruction.parts[0].text).toBe(ANTIGRAVITY_BASE_SYSTEM_INSTRUCTION); |
| 156 | + expect(parsed.request.systemInstruction.parts[1].text).toBe("Existing instruction"); |
| 157 | + }); |
| 158 | + |
| 159 | + it("prepends Antigravity systemInstruction and requestType for gemini-3-flash-preview", () => { |
| 160 | + const payload: RequestPayload = { |
| 161 | + systemInstruction: { parts: [{ text: "Existing instruction" }] }, |
| 162 | + contents: [{ role: "user", parts: [{ text: "hi" }] }], |
| 163 | + }; |
| 164 | + |
| 165 | + const context = createContext("gemini-3-flash-preview"); |
| 166 | + const result = transformGeminiRequest(context, payload); |
| 167 | + const parsed = JSON.parse(result.body); |
| 168 | + |
| 169 | + expect(parsed.requestType).toBe("agent"); |
| 170 | + expect(parsed.request.systemInstruction.role).toBe("user"); |
| 171 | + expect(parsed.request.systemInstruction.parts[0].text).toBe(ANTIGRAVITY_BASE_SYSTEM_INSTRUCTION); |
| 172 | + expect(parsed.request.systemInstruction.parts[1].text).toBe("Existing instruction"); |
| 173 | + }); |
142 | 174 | }); |
143 | 175 |
|
144 | 176 | describe("tool schema mitigations", () => { |
@@ -177,7 +209,10 @@ describe("thoughtSignature handling", () => { |
177 | 209 | const result = transformGeminiRequest(context, payload); |
178 | 210 | const parsed = JSON.parse(result.body); |
179 | 211 |
|
180 | | - expect(parsed.request.systemInstruction.parts[0].text).toContain("<CRITICAL_TOOL_USAGE_INSTRUCTIONS>"); |
| 212 | + const instructionText = parsed.request.systemInstruction.parts |
| 213 | + .map((part: any) => part.text ?? "") |
| 214 | + .join("\n"); |
| 215 | + expect(instructionText).toContain("<CRITICAL_TOOL_USAGE_INSTRUCTIONS>"); |
181 | 216 | const funcDecl = parsed.request.tools[0].functionDeclarations[0]; |
182 | 217 | expect(funcDecl.description).toContain("STRICT PARAMETERS:"); |
183 | 218 | expect(funcDecl.description).toContain("filePath"); |
@@ -306,6 +341,22 @@ describe("thoughtSignature handling", () => { |
306 | 341 | }); |
307 | 342 |
|
308 | 343 | describe("claude transformer", () => { |
| 344 | + it("prepends Antigravity systemInstruction and requestType for claude models", () => { |
| 345 | + const payload: RequestPayload = { |
| 346 | + systemInstruction: "Existing instruction", |
| 347 | + contents: [{ role: "user", parts: [{ text: "Hello" }] }], |
| 348 | + }; |
| 349 | + |
| 350 | + const context = createContext("gemini-claude-sonnet-4-5"); |
| 351 | + const result = transformClaudeRequest(context, payload); |
| 352 | + const parsed = JSON.parse(result.body); |
| 353 | + |
| 354 | + expect(parsed.requestType).toBe("agent"); |
| 355 | + expect(parsed.request.systemInstruction.role).toBe("user"); |
| 356 | + expect(parsed.request.systemInstruction.parts[0].text).toBe(ANTIGRAVITY_BASE_SYSTEM_INSTRUCTION); |
| 357 | + expect(parsed.request.systemInstruction.parts[1].text).toBe("Existing instruction"); |
| 358 | + }); |
| 359 | + |
309 | 360 | it("keeps thinking blocks with valid signatures (length > 50)", () => { |
310 | 361 | const payload: RequestPayload = { |
311 | 362 | contents: [ |
|
0 commit comments