1
0
forked from boos/BoosAPI

address comment

This commit is contained in:
ksmaze
2026-03-14 22:05:12 -07:00
parent e227fc0dd3
commit 9e4ffbd6c8
2 changed files with 52 additions and 14 deletions
@@ -679,6 +679,40 @@ describe('buildUpstreamEndpointRequest', () => {
expect(request.body.temperature).toBe(0.8); expect(request.body.temperature).toBe(0.8);
}); });
it('strips unsupported openai parameters like frequency_penalty for Gemini models from downstream responses bodies', () => {
const request = buildUpstreamEndpointRequest({
endpoint: 'responses',
modelName: 'gemini-1.5-pro',
stream: false,
tokenValue: 'sk-test',
sitePlatform: 'gemini',
openaiBody: {},
downstreamFormat: 'responses',
responsesOriginalBody: {
model: 'gemini-1.5-pro',
input: 'hello',
frequency_penalty: 0.5,
presence_penalty: 0.2,
logit_bias: { '100': 1 },
logprobs: true,
top_logprobs: 2,
store: true,
temperature: 0.8,
top_p: 1.0,
},
});
expect(request.path).toBe('/v1beta/openai/responses');
expect(request.body.frequency_penalty).toBeUndefined();
expect(request.body.presence_penalty).toBeUndefined();
expect(request.body.logit_bias).toBeUndefined();
expect(request.body.logprobs).toBeUndefined();
expect(request.body.top_logprobs).toBeUndefined();
expect(request.body.store).toBeUndefined();
expect(request.body.temperature).toBe(0.8);
expect(request.body.top_p).toBe(1.0);
});
it('preserves structured responses content blocks instead of flattening them', () => { it('preserves structured responses content blocks instead of flattening them', () => {
const request = buildUpstreamEndpointRequest({ const request = buildUpstreamEndpointRequest({
endpoint: 'responses', endpoint: 'responses',
+10 -6
View File
@@ -481,20 +481,24 @@ export function buildUpstreamEndpointRequest(input: {
commonHeaders.Authorization = `Bearer ${input.tokenValue}`; commonHeaders.Authorization = `Bearer ${input.tokenValue}`;
} }
const openaiBody = { ...input.openaiBody }; const stripGeminiUnsupportedFields = (body: Record<string, unknown>) => {
const next = { ...body };
if (isGeminiUpstream) { if (isGeminiUpstream) {
const blacklist = [ for (const key of [
'frequency_penalty', 'frequency_penalty',
'presence_penalty', 'presence_penalty',
'logit_bias', 'logit_bias',
'logprobs', 'logprobs',
'top_logprobs', 'top_logprobs',
'store', 'store',
]; ]) {
for (const key of blacklist) { delete next[key];
delete openaiBody[key];
} }
} }
return next;
};
const openaiBody = stripGeminiUnsupportedFields(input.openaiBody);
if (input.endpoint === 'messages') { if (input.endpoint === 'messages') {
const claudeHeaders = input.downstreamFormat === 'claude' const claudeHeaders = input.downstreamFormat === 'claude'
@@ -554,7 +558,7 @@ export function buildUpstreamEndpointRequest(input: {
const rawBody = ( const rawBody = (
input.downstreamFormat === 'responses' && input.responsesOriginalBody input.downstreamFormat === 'responses' && input.responsesOriginalBody
? { ? {
...input.responsesOriginalBody, ...stripGeminiUnsupportedFields(input.responsesOriginalBody),
model: input.modelName, model: input.modelName,
stream: input.stream, stream: input.stream,
} }