| |
| |
| |
| |
| |
|
|
| import { describe, it, expect } from 'vitest'; |
| import { |
| ModelConfigService, |
| type ModelConfigServiceConfig, |
| } from './modelConfigService.js'; |
|
|
| |
| |
| |
| |
| describe('ModelConfigService Integration', () => { |
| const complexConfig: ModelConfigServiceConfig = { |
| aliases: { |
| |
| base: { |
| modelConfig: { |
| generateContentConfig: { |
| topP: 0.95, |
| topK: 64, |
| }, |
| }, |
| }, |
| 'default-text-model': { |
| extends: 'base', |
| modelConfig: { |
| model: 'gemini-1.5-pro-latest', |
| generateContentConfig: { |
| topK: 40, |
| }, |
| }, |
| }, |
| 'creative-writer': { |
| extends: 'default-text-model', |
| modelConfig: { |
| generateContentConfig: { |
| temperature: 0.9, |
| topK: 50, |
| }, |
| }, |
| }, |
| 'fast-classifier': { |
| extends: 'base', |
| modelConfig: { |
| model: 'gemini-1.5-flash-latest', |
| generateContentConfig: { |
| temperature: 0.1, |
| candidateCount: 4, |
| }, |
| }, |
| }, |
| }, |
| overrides: [ |
| |
| { |
| match: { model: 'gemini-1.5-flash-latest' }, |
| modelConfig: { |
| generateContentConfig: { |
| maxOutputTokens: 2048, |
| }, |
| }, |
| }, |
| |
| { |
| match: { overrideScope: 'core' }, |
| modelConfig: { |
| generateContentConfig: { |
| temperature: 0.5, |
| stopSequences: ['AGENT_STOP'], |
| }, |
| }, |
| }, |
| |
| { |
| match: { model: 'fast-classifier', overrideScope: 'core' }, |
| modelConfig: { |
| generateContentConfig: { |
| temperature: 0.0, |
| maxOutputTokens: 4096, |
| }, |
| }, |
| }, |
| |
| { |
| match: { model: 'base', overrideScope: 'core' }, |
| modelConfig: { |
| model: 'gemini-1.5-pro-latest', |
| }, |
| }, |
| ], |
| }; |
|
|
| const service = new ModelConfigService(complexConfig); |
|
|
| it('should resolve a simple model, applying core agent defaults', () => { |
| const resolved = service.getResolvedConfig({ |
| model: 'gemini-test-model', |
| }); |
|
|
| expect(resolved.model).toBe('gemini-test-model'); |
| expect(resolved.generateContentConfig).toEqual({ |
| temperature: 0.5, |
| stopSequences: ['AGENT_STOP'], |
| }); |
| }); |
|
|
| it('should correctly apply a simple inherited alias and merge with global defaults', () => { |
| const resolved = service.getResolvedConfig({ |
| model: 'default-text-model', |
| }); |
|
|
| expect(resolved.model).toBe('gemini-1.5-pro-latest'); |
| expect(resolved.generateContentConfig).toEqual({ |
| temperature: 0.5, |
| topP: 0.95, |
| topK: 40, |
| stopSequences: ['AGENT_STOP'], |
| }); |
| }); |
|
|
| it('should resolve a multi-level inherited alias', () => { |
| const resolved = service.getResolvedConfig({ |
| model: 'creative-writer', |
| }); |
|
|
| expect(resolved.model).toBe('gemini-1.5-pro-latest'); |
| expect(resolved.generateContentConfig).toEqual({ |
| temperature: 0.5, |
| topP: 0.95, |
| topK: 50, |
| stopSequences: ['AGENT_STOP'], |
| }); |
| }); |
|
|
| it('should apply an inherited alias and a broad model-based override', () => { |
| const resolved = service.getResolvedConfig({ |
| model: 'fast-classifier', |
| |
| }); |
|
|
| expect(resolved.model).toBe('gemini-1.5-pro-latest'); |
| expect(resolved.generateContentConfig).toEqual({ |
| topP: 0.95, |
| topK: 64, |
| candidateCount: 4, |
| stopSequences: ['AGENT_STOP'], |
| maxOutputTokens: 4096, |
| temperature: 0.0, |
| }); |
| }); |
|
|
| it('should apply settings for an unknown model but a known agent', () => { |
| const resolved = service.getResolvedConfig({ |
| model: 'gemini-test-model', |
| overrideScope: 'core', |
| }); |
|
|
| expect(resolved.model).toBe('gemini-test-model'); |
| expect(resolved.generateContentConfig).toEqual({ |
| temperature: 0.5, |
| stopSequences: ['AGENT_STOP'], |
| }); |
| }); |
|
|
| it('should apply the most specific override for a known inherited alias and agent', () => { |
| const resolved = service.getResolvedConfig({ |
| model: 'fast-classifier', |
| overrideScope: 'core', |
| }); |
|
|
| expect(resolved.model).toBe('gemini-1.5-pro-latest'); |
| expect(resolved.generateContentConfig).toEqual({ |
| |
| topP: 0.95, |
| topK: 64, |
| |
| candidateCount: 4, |
| |
| stopSequences: ['AGENT_STOP'], |
| |
| temperature: 0.0, |
| maxOutputTokens: 4096, |
| }); |
| }); |
|
|
| it('should correctly apply agent override on top of a multi-level inherited alias', () => { |
| const resolved = service.getResolvedConfig({ |
| model: 'creative-writer', |
| overrideScope: 'core', |
| }); |
|
|
| expect(resolved.model).toBe('gemini-1.5-pro-latest'); |
| expect(resolved.generateContentConfig).toEqual({ |
| temperature: 0.5, |
| topP: 0.95, |
| topK: 50, |
| stopSequences: ['AGENT_STOP'], |
| }); |
| }); |
|
|
| it('should resolve an abstract alias if a specific override provides the model', () => { |
| const resolved = service.getResolvedConfig({ |
| model: 'base', |
| overrideScope: 'core', |
| }); |
|
|
| expect(resolved.model).toBe('gemini-1.5-pro-latest'); |
| expect(resolved.generateContentConfig).toEqual({ |
| temperature: 0.5, |
| topP: 0.95, |
| topK: 64, |
| stopSequences: ['AGENT_STOP'], |
| }); |
| }); |
|
|
| it('should not apply core agent overrides when a different agent is specified', () => { |
| const resolved = service.getResolvedConfig({ |
| model: 'fast-classifier', |
| overrideScope: 'non-core-agent', |
| }); |
|
|
| expect(resolved.model).toBe('gemini-1.5-flash-latest'); |
| expect(resolved.generateContentConfig).toEqual({ |
| candidateCount: 4, |
| maxOutputTokens: 2048, |
| temperature: 0.1, |
| topK: 64, |
| topP: 0.95, |
| }); |
| }); |
|
|
| it('should correctly merge static aliases, runtime aliases, and overrides', () => { |
| |
| const service = new ModelConfigService(complexConfig); |
|
|
| |
| |
| service.registerRuntimeModelConfig('agent-runtime:my-agent', { |
| extends: 'creative-writer', |
| modelConfig: { |
| generateContentConfig: { |
| temperature: 0.1, |
| maxOutputTokens: 8192, |
| }, |
| }, |
| }); |
|
|
| |
| const resolved = service.getResolvedConfig({ |
| model: 'agent-runtime:my-agent', |
| overrideScope: 'core', |
| }); |
|
|
| |
| expect(resolved.model).toBe('gemini-1.5-pro-latest'); |
| expect(resolved.generateContentConfig).toEqual({ |
| |
| temperature: 0.5, |
| |
| topP: 0.95, |
| |
| topK: 50, |
| |
| maxOutputTokens: 8192, |
| |
| stopSequences: ['AGENT_STOP'], |
| }); |
| }); |
| }); |
|
|