mirror of
https://github.com/BerriAI/litellm.git
synced 2026-08-28 05:25:59 +00:00
* test(pass-through): move Gemini pass-through tests to gemini-3.1-flash-lite gemini-2.5-flash-lite is a generation behind and is slated for discontinuation on Vertex AI no earlier than October 16, 2026, so the pass-through suite was exercising an aging model. Every reference now points at gemini-3.1-flash-lite, which is GA and already priced in the cost map so the spend-logging assertions still compute a real cost test_vertex.test.js also gains jest.retryTimes(3) to match the sibling spend tests. The CI failures were intermittent 429 RESOURCE_EXHAUSTED from Vertex quota pressure, and that file was the only one without a retry, so a single rate-limited request was failing the whole job * test(pass-through): point Vertex tests at the global endpoint for gemini-3.1-flash-lite gemini-3.1-flash-lite is not served on the Vertex us-central1 regional endpoint for the CI project, so the Vertex pass-through tests were returning a deterministic 404 "Publisher Model ... was not found or your project does not have access to it" while the Gemini API tests passed. Move the Vertex clients to the global location, which the pass-through router maps to aiplatform.googleapis.com, where the 3.1 family is served
134 lines
5.4 KiB
JavaScript
134 lines
5.4 KiB
JavaScript
const { GoogleGenerativeAI } = require("@google/generative-ai");
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// Import fetch if the SDK uses it
|
|
const originalFetch = global.fetch || require('node-fetch');
|
|
|
|
let lastCallId;
|
|
|
|
// Monkey-patch the fetch used internally
|
|
global.fetch = async function patchedFetch(url, options) {
|
|
const response = await originalFetch(url, options);
|
|
|
|
// Store the call ID if it exists
|
|
lastCallId = response.headers.get('x-litellm-call-id');
|
|
|
|
return response;
|
|
};
|
|
|
|
// Configure Jest to retry flaky tests (useful for external API flakiness)
|
|
jest.retryTimes(3);
|
|
|
|
describe('Gemini AI Tests', () => {
|
|
test('should successfully generate non-streaming content with tags', async () => {
|
|
const genAI = new GoogleGenerativeAI("sk-1234"); // litellm proxy API key
|
|
|
|
const requestOptions = {
|
|
baseUrl: 'http://127.0.0.1:4000/gemini',
|
|
customHeaders: {
|
|
"tags": "gemini-js-sdk,pass-through-endpoint"
|
|
}
|
|
};
|
|
|
|
const model = genAI.getGenerativeModel({
|
|
model: 'gemini-3.1-flash-lite'
|
|
}, requestOptions);
|
|
|
|
const prompt = 'Say "hello test" and nothing else';
|
|
|
|
const result = await model.generateContent(prompt);
|
|
expect(result).toBeDefined();
|
|
|
|
// Use the captured callId
|
|
const callId = lastCallId;
|
|
console.log("Captured Call ID:", callId);
|
|
|
|
// Poll for spend data with retries (DB writes can be slow in CI)
|
|
let spendData = null;
|
|
for (let attempt = 0; attempt < 6; attempt++) {
|
|
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
const spendResponse = await fetch(
|
|
`http://127.0.0.1:4000/spend/logs?request_id=${callId}`,
|
|
{ headers: { 'Authorization': 'Bearer sk-1234' } }
|
|
);
|
|
spendData = await spendResponse.json();
|
|
console.log(`spendData (attempt ${attempt + 1}):`, spendData);
|
|
if (spendData && spendData.length > 0 && spendData[0] && spendData[0].request_id) break;
|
|
}
|
|
|
|
if (!spendData || !spendData.length || !spendData[0] || !spendData[0].request_id) {
|
|
console.warn('Spend data not available after polling - skipping spend assertions (DB write may be slow in CI)');
|
|
return;
|
|
}
|
|
|
|
expect(spendData).toBeDefined();
|
|
expect(spendData[0].request_id).toBe(callId);
|
|
expect(spendData[0].call_type).toBe('pass_through_endpoint');
|
|
expect(spendData[0].request_tags).toEqual(['gemini-js-sdk', 'pass-through-endpoint']);
|
|
expect(spendData[0].metadata).toHaveProperty('user_api_key');
|
|
expect(spendData[0].model).toContain('gemini');
|
|
expect(spendData[0].custom_llm_provider).toBe('gemini');
|
|
expect(spendData[0].spend).toBeGreaterThan(0);
|
|
}, 90000);
|
|
|
|
test('should successfully generate streaming content with tags', async () => {
|
|
const genAI = new GoogleGenerativeAI("sk-1234"); // litellm proxy API key
|
|
|
|
const requestOptions = {
|
|
baseUrl: 'http://127.0.0.1:4000/gemini',
|
|
customHeaders: {
|
|
"tags": "gemini-js-sdk,pass-through-endpoint"
|
|
}
|
|
};
|
|
|
|
const model = genAI.getGenerativeModel({
|
|
model: 'gemini-3.1-flash-lite'
|
|
}, requestOptions);
|
|
|
|
const prompt = 'Say "hello test" and nothing else';
|
|
|
|
const streamingResult = await model.generateContentStream(prompt);
|
|
expect(streamingResult).toBeDefined();
|
|
|
|
for await (const chunk of streamingResult.stream) {
|
|
console.log('stream chunk:', JSON.stringify(chunk));
|
|
expect(chunk).toBeDefined();
|
|
}
|
|
|
|
const aggregatedResponse = await streamingResult.response;
|
|
console.log('aggregated response:', JSON.stringify(aggregatedResponse));
|
|
expect(aggregatedResponse).toBeDefined();
|
|
|
|
// Use the captured callId
|
|
const callId = lastCallId;
|
|
console.log("Captured Call ID:", callId);
|
|
|
|
// Poll for spend data with retries (DB writes can be slow in CI)
|
|
let spendData = null;
|
|
for (let attempt = 0; attempt < 6; attempt++) {
|
|
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
const spendResponse = await fetch(
|
|
`http://127.0.0.1:4000/spend/logs?request_id=${callId}`,
|
|
{ headers: { 'Authorization': 'Bearer sk-1234' } }
|
|
);
|
|
spendData = await spendResponse.json();
|
|
console.log(`spendData (attempt ${attempt + 1}):`, spendData);
|
|
if (spendData && spendData.length > 0 && spendData[0] && spendData[0].request_id) break;
|
|
}
|
|
|
|
if (!spendData || !spendData.length || !spendData[0] || !spendData[0].request_id) {
|
|
console.warn('Spend data not available after polling - skipping spend assertions (DB write may be slow in CI)');
|
|
return;
|
|
}
|
|
|
|
expect(spendData).toBeDefined();
|
|
expect(spendData[0].request_id).toBe(callId);
|
|
expect(spendData[0].call_type).toBe('pass_through_endpoint');
|
|
expect(spendData[0].request_tags).toEqual(['gemini-js-sdk', 'pass-through-endpoint']);
|
|
expect(spendData[0].metadata).toHaveProperty('user_api_key');
|
|
expect(spendData[0].model).toContain('gemini');
|
|
expect(spendData[0].spend).toBeGreaterThan(0);
|
|
expect(spendData[0].custom_llm_provider).toBe('gemini');
|
|
}, 90000);
|
|
});
|