From 13781c3a43af433912e0ac4681b0760d124ff544 Mon Sep 17 00:00:00 2001 From: ProgrammerIn-wonderland <3838shah@gmail.com> Date: Thu, 21 May 2026 08:57:17 -0400 Subject: [PATCH] fix together provider issues --- .../drivers/ai-chat/ChatCompletionDriver.ts | 12 +++++++++++- .../providers/together/TogetherAIProvider.test.ts | 12 ++++++------ .../providers/together/TogetherAIProvider.ts | 14 +++++++++++--- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/backend/drivers/ai-chat/ChatCompletionDriver.ts b/src/backend/drivers/ai-chat/ChatCompletionDriver.ts index 2ebeadfdb7..4f1ca40173 100644 --- a/src/backend/drivers/ai-chat/ChatCompletionDriver.ts +++ b/src/backend/drivers/ai-chat/ChatCompletionDriver.ts @@ -651,8 +651,18 @@ export class ChatCompletionDriver extends PuterDriver { // thinking_tokens → output rate fallback let rate = costs[key]; if (typeof rate !== 'number' || !Number.isFinite(rate)) { - if (key === 'thinking_tokens' && outputRate !== undefined) { + if (isOutputKey(key) && outputRate !== undefined) { rate = outputRate; + } else if (!isOutputKey(key)) { + const inputRateRaw = costs[inputKey]; + if ( + typeof inputRateRaw === 'number' && + Number.isFinite(inputRateRaw) + ) { + rate = inputRateRaw; + } else { + continue; + } } else { continue; } diff --git a/src/backend/drivers/ai-chat/providers/together/TogetherAIProvider.test.ts b/src/backend/drivers/ai-chat/providers/together/TogetherAIProvider.test.ts index 7667310100..f5a251390c 100644 --- a/src/backend/drivers/ai-chat/providers/together/TogetherAIProvider.test.ts +++ b/src/backend/drivers/ai-chat/providers/together/TogetherAIProvider.test.ts @@ -433,10 +433,10 @@ describe('TogetherAIProvider.complete non-stream output', () => { completion_tokens: 50, cached_tokens: 0, }); - // Qwen pricing: input=20, output=20 (per million). + // Qwen pricing: input=20, output=20 (per million, dollars from API → ×100 for cents). expect(overrides).toMatchObject({ - prompt_tokens: 100 * 20, - completion_tokens: 50 * 20, + prompt_tokens: 100 * 20 * 100, + completion_tokens: 50 * 20 * 100, }); }); }); @@ -484,13 +484,13 @@ describe('TogetherAIProvider.complete streaming', () => { cached_tokens: 0, }); - // Qwen pricing: input=20, output=20. + // Qwen pricing: input=20, output=20 (dollars from API → ×100 for cents). expect(recordSpy).toHaveBeenCalledTimes(1); const [, , prefix, overrides] = recordSpy.mock.calls[0]!; expect(prefix).toBe('togetherai:Qwen/Qwen2.5-7B-Instruct-Turbo'); expect(overrides).toMatchObject({ - prompt_tokens: 4 * 20, - completion_tokens: 2 * 20, + prompt_tokens: 4 * 20 * 100, + completion_tokens: 2 * 20 * 100, }); }); }); diff --git a/src/backend/drivers/ai-chat/providers/together/TogetherAIProvider.ts b/src/backend/drivers/ai-chat/providers/together/TogetherAIProvider.ts index fe379483e6..f6b287858c 100644 --- a/src/backend/drivers/ai-chat/providers/together/TogetherAIProvider.ts +++ b/src/backend/drivers/ai-chat/providers/together/TogetherAIProvider.ts @@ -75,7 +75,11 @@ export class TogetherAIProvider implements IChatProvider { output_cost_key: 'output', costs: { tokens: 1_000_000, - ...model.pricing, + ...Object.fromEntries( + Object.entries(model.pricing ?? {}).map( + ([k, v]) => [k, (v as number) * 100], + ), + ), }, max_tokens: model.context_length ?? 8000, }); @@ -126,9 +130,13 @@ export class TogetherAIProvider implements IChatProvider { const actor = Context.get('actor'); const models = await this.models(); + const modelLower = model.toLowerCase(); const modelUsed = - models.find((m) => [m.id, ...(m.aliases || [])].includes(model)) || - models.find((m) => m.id === this.getDefaultModel())!; + models.find((m) => + [m.id, ...(m.aliases || [])].some( + (id) => id.toLowerCase() === modelLower, + ), + ) || models.find((m) => m.id === this.getDefaultModel())!; const modelIdForParams = modelUsed.id.startsWith('togetherai:') ? modelUsed.id.slice('togetherai:'.length) : modelUsed.id;