Send reasoning options only to supported model
All checks were successful
Forgejo Android APK / Build signed APK (push) Successful in 1m53s
All checks were successful
Forgejo Android APK / Build signed APK (push) Successful in 1m53s
This commit is contained in:
parent
e710b1c7bd
commit
2c02e6eca7
3 changed files with 20 additions and 9 deletions
|
|
@ -7,7 +7,7 @@
|
||||||
const { OpenAI } = require('openai');
|
const { OpenAI } = require('openai');
|
||||||
const { DEFAULT_MODEL, FALLBACK_MODEL, getBedrockModelId, getBedrockMaxOut } = require('./models');
|
const { DEFAULT_MODEL, FALLBACK_MODEL, getBedrockModelId, getBedrockMaxOut } = require('./models');
|
||||||
const logger = require('./logger');
|
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');
|
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)
|
// 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) {
|
async function callLiteLLM(messages, model, temperature, maxTokens, generation) {
|
||||||
if (!litellmClient) throw new Error('LiteLLM not configured. Set LITELLM_API_BASE in .env');
|
if (!litellmClient) throw new Error('LiteLLM not configured. Set LITELLM_API_BASE in .env');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 };
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ const test = require('node:test');
|
||||||
const assert = require('node:assert/strict');
|
const assert = require('node:assert/strict');
|
||||||
|
|
||||||
const { assistantGenerationOptions } = require('../src/utils/clinicalAnswer');
|
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', () => {
|
test('clinical assistant profile requests low reasoning without exposing it', () => {
|
||||||
assert.deepEqual(assistantGenerationOptions({ temperature: 0, maxTokens: 80 }), {
|
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 }).temperature, 0);
|
||||||
assert.equal(resolveGenerationOptions({}).temperature, 0.3);
|
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'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue