Send reasoning options only to supported model
All checks were successful
Forgejo Android APK / Build signed APK (push) Successful in 1m53s

This commit is contained in:
Daniel 2026-08-27 21:25:38 +02:00
parent e710b1c7bd
commit 2c02e6eca7
3 changed files with 20 additions and 9 deletions

View file

@ -7,7 +7,7 @@
const { OpenAI } = require('openai');
const { DEFAULT_MODEL, FALLBACK_MODEL, getBedrockModelId, getBedrockMaxOut } = require('./models');
const logger = require('./logger');
const { resolveGenerationOptions } = require('./generationOptions');
const { resolveGenerationOptions, addReasoningOptions } = require('./generationOptions');
var activeProvider = process.env.AI_PROVIDER || (process.env.LITELLM_API_BASE ? 'litellm' : 'openrouter');
@ -368,12 +368,6 @@ async function callVertex(messages, model, temperature, maxTokens) {
// ============================================================
// CALL LITELLM (OpenAI-compatible proxy)
// ============================================================
function addReasoningOptions(request, generation) {
if (generation.reasoningEffort != null) request.reasoning_effort = generation.reasoningEffort;
if (generation.reasoningFormat != null) request.reasoning_format = generation.reasoningFormat;
return request;
}
async function callLiteLLM(messages, model, temperature, maxTokens, generation) {
if (!litellmClient) throw new Error('LiteLLM not configured. Set LITELLM_API_BASE in .env');

View file

@ -8,4 +8,13 @@ function resolveGenerationOptions(options) {
};
}
module.exports = { resolveGenerationOptions };
function addReasoningOptions(request, generation) {
// These OpenAI-compatible fields are rejected by ordinary chat models such as GPT-4.1.
// Keep the Clinical Assistant profile, but only send it to the Groq Qwen model that supports both fields.
if (request.model !== 'groq-qwen3.8-27b') return request;
if (generation.reasoningEffort != null) request.reasoning_effort = generation.reasoningEffort;
if (generation.reasoningFormat != null) request.reasoning_format = generation.reasoningFormat;
return request;
}
module.exports = { resolveGenerationOptions, addReasoningOptions };

View file

@ -2,7 +2,7 @@ const test = require('node:test');
const assert = require('node:assert/strict');
const { assistantGenerationOptions } = require('../src/utils/clinicalAnswer');
const { resolveGenerationOptions } = require('../src/utils/generationOptions');
const { resolveGenerationOptions, addReasoningOptions } = require('../src/utils/generationOptions');
test('clinical assistant profile requests low reasoning without exposing it', () => {
assert.deepEqual(assistantGenerationOptions({ temperature: 0, maxTokens: 80 }), {
@ -17,3 +17,11 @@ test('generation defaults preserve an explicit zero temperature', () => {
assert.equal(resolveGenerationOptions({ temperature: 0 }).temperature, 0);
assert.equal(resolveGenerationOptions({}).temperature, 0.3);
});
test('reasoning fields are sent only to the confirmed Groq Qwen model', () => {
const profile = { reasoningEffort: 'low', reasoningFormat: 'hidden' };
assert.deepEqual(addReasoningOptions({ model: 'openai-gpt-4.1' }, profile), { model: 'openai-gpt-4.1' });
assert.deepEqual(addReasoningOptions({ model: 'groq-qwen3.8-27b' }, profile), {
model: 'groq-qwen3.8-27b', reasoning_effort: 'low', reasoning_format: 'hidden'
});
});