9router/src/mitm/handlers/antigravity.js
decolua 9abbb8ad9b # v0.4.52 (2026-05-17)
## Features
- Add Vercel AI Gateway provider support (#1183)
- rtk: Kiro format tool result compression — handle conversationState.history & currentMessage, preserve error results, ~13.6% savings (#1194)

## Fixes
- openclaw: normalize agent.model object form `{primary, fallbacks}` before .startsWith → fix TypeError & 'not configured' status (#1216)
- Usage Details pagination: stay inside mobile viewport <640px (#1218)
- Fix test model error
- Fix MIMO provider in Codex
- Disable log file creation when using MITM AG
2026-05-17 16:37:26 +07:00

33 lines
1.5 KiB
JavaScript

const { err, createResponseDumper } = require("../logger");
const { IS_DEV } = require("../config");
const { fetchRouter, pipeSSE } = require("./base");
/**
* Intercept Antigravity request — forward Gemini body as-is to /v1/chat/completions.
* Router auto-detects format via body.userAgent==="antigravity" + body.request.contents,
* runs antigravity→openai→provider→openai→antigravity translators internally.
*/
async function intercept(req, res, bodyBuffer, mappedModel) {
const dumper = IS_DEV ? createResponseDumper(req, "intercept-antigravity") : null;
const isStream = req.url.includes(":streamGenerateContent");
try {
const body = JSON.parse(bodyBuffer.toString());
if (body.model) body.model = mappedModel;
const routerRes = await fetchRouter(body, "/v1/chat/completions", req.headers);
await pipeSSE(routerRes, res, dumper);
} catch (error) {
err(`[antigravity] ${error.message}`);
if (dumper) { dumper.writeChunk(`\n[ERROR] ${error.message}\n`); dumper.end(); }
// For stream endpoint, send SSE error chunk so SDK doesn't hang waiting
if (isStream) {
if (!res.headersSent) res.writeHead(200, { "Content-Type": "text/event-stream" });
res.end(`data: ${JSON.stringify({ error: { message: error.message } })}\r\n\r\n`);
} else {
if (!res.headersSent) res.writeHead(500, { "Content-Type": "application/json" });
res.end(JSON.stringify({ error: { message: error.message, type: "mitm_error" } }));
}
}
}
module.exports = { intercept };