feat: gate model overrides and load full token history (#271)
Co-authored-by: zuolingxuan <zuolingxuan@bytedance.com>
This commit is contained in:
committed by
GitHub
Unverified
parent
3371e4fe74
commit
30b03add1c
@@ -1,5 +1,11 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { PROVIDER_TYPES, PROVIDER_TYPE_INFO, resolveProviderApiKeyForSave } from '@/lib/providers';
|
||||
import {
|
||||
PROVIDER_TYPES,
|
||||
PROVIDER_TYPE_INFO,
|
||||
resolveProviderApiKeyForSave,
|
||||
resolveProviderModelForSave,
|
||||
shouldShowProviderModelId,
|
||||
} from '@/lib/providers';
|
||||
import {
|
||||
BUILTIN_PROVIDER_TYPES,
|
||||
getProviderConfig,
|
||||
@@ -54,6 +60,43 @@ describe('provider metadata', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('only exposes OpenRouter and SiliconFlow model overrides in developer mode', () => {
|
||||
const openrouter = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'openrouter');
|
||||
const siliconflow = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'siliconflow');
|
||||
|
||||
expect(openrouter).toMatchObject({
|
||||
showModelId: true,
|
||||
showModelIdInDevModeOnly: true,
|
||||
defaultModelId: 'anthropic/claude-opus-4.6',
|
||||
});
|
||||
expect(siliconflow).toMatchObject({
|
||||
showModelId: true,
|
||||
showModelIdInDevModeOnly: true,
|
||||
defaultModelId: 'deepseek-ai/DeepSeek-V3',
|
||||
});
|
||||
|
||||
expect(shouldShowProviderModelId(openrouter, false)).toBe(false);
|
||||
expect(shouldShowProviderModelId(siliconflow, false)).toBe(false);
|
||||
expect(shouldShowProviderModelId(openrouter, true)).toBe(true);
|
||||
expect(shouldShowProviderModelId(siliconflow, true)).toBe(true);
|
||||
});
|
||||
|
||||
it('only saves OpenRouter and SiliconFlow model overrides in developer mode', () => {
|
||||
const openrouter = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'openrouter');
|
||||
const siliconflow = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'siliconflow');
|
||||
const ark = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'ark');
|
||||
|
||||
expect(resolveProviderModelForSave(openrouter, 'openai/gpt-5', false)).toBeUndefined();
|
||||
expect(resolveProviderModelForSave(siliconflow, 'Qwen/Qwen3-Coder-480B-A35B-Instruct', false)).toBeUndefined();
|
||||
|
||||
expect(resolveProviderModelForSave(openrouter, 'openai/gpt-5', true)).toBe('openai/gpt-5');
|
||||
expect(resolveProviderModelForSave(siliconflow, 'Qwen/Qwen3-Coder-480B-A35B-Instruct', true)).toBe('Qwen/Qwen3-Coder-480B-A35B-Instruct');
|
||||
|
||||
expect(resolveProviderModelForSave(openrouter, ' ', true)).toBe('anthropic/claude-opus-4.6');
|
||||
expect(resolveProviderModelForSave(siliconflow, ' ', true)).toBe('deepseek-ai/DeepSeek-V3');
|
||||
expect(resolveProviderModelForSave(ark, ' ep-custom-model ', false)).toBe('ep-custom-model');
|
||||
});
|
||||
|
||||
it('normalizes provider API keys for save flow', () => {
|
||||
expect(resolveProviderApiKeyForSave('ollama', '')).toBe('ollama-local');
|
||||
expect(resolveProviderApiKeyForSave('ollama', ' ')).toBe('ollama-local');
|
||||
|
||||
@@ -80,4 +80,52 @@ describe('parseUsageEntriesFromJsonl', () => {
|
||||
|
||||
expect(parseUsageEntriesFromJsonl(jsonl, { sessionId: 'abc', agentId: 'default' })).toEqual([]);
|
||||
});
|
||||
|
||||
it('returns all matching entries when no limit is provided', () => {
|
||||
const jsonl = [
|
||||
JSON.stringify({
|
||||
type: 'message',
|
||||
timestamp: '2026-02-28T10:00:00.000Z',
|
||||
message: { role: 'assistant', model: 'm1', usage: { total: 10 } },
|
||||
}),
|
||||
JSON.stringify({
|
||||
type: 'message',
|
||||
timestamp: '2026-02-28T10:01:00.000Z',
|
||||
message: { role: 'assistant', model: 'm2', usage: { total: 20 } },
|
||||
}),
|
||||
JSON.stringify({
|
||||
type: 'message',
|
||||
timestamp: '2026-02-28T10:02:00.000Z',
|
||||
message: { role: 'assistant', model: 'm3', usage: { total: 30 } },
|
||||
}),
|
||||
].join('\n');
|
||||
|
||||
const entries = parseUsageEntriesFromJsonl(jsonl, { sessionId: 'abc', agentId: 'default' });
|
||||
expect(entries).toHaveLength(3);
|
||||
expect(entries.map((entry) => entry.model)).toEqual(['m3', 'm2', 'm1']);
|
||||
});
|
||||
|
||||
it('still supports explicit limits when provided', () => {
|
||||
const jsonl = [
|
||||
JSON.stringify({
|
||||
type: 'message',
|
||||
timestamp: '2026-02-28T10:00:00.000Z',
|
||||
message: { role: 'assistant', model: 'm1', usage: { total: 10 } },
|
||||
}),
|
||||
JSON.stringify({
|
||||
type: 'message',
|
||||
timestamp: '2026-02-28T10:01:00.000Z',
|
||||
message: { role: 'assistant', model: 'm2', usage: { total: 20 } },
|
||||
}),
|
||||
JSON.stringify({
|
||||
type: 'message',
|
||||
timestamp: '2026-02-28T10:02:00.000Z',
|
||||
message: { role: 'assistant', model: 'm3', usage: { total: 30 } },
|
||||
}),
|
||||
].join('\n');
|
||||
|
||||
const entries = parseUsageEntriesFromJsonl(jsonl, { sessionId: 'abc', agentId: 'default' }, 2);
|
||||
expect(entries).toHaveLength(2);
|
||||
expect(entries.map((entry) => entry.model)).toEqual(['m3', 'm2']);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user