diff --git a/server/src/config/__tests__/llmConfig.test.ts b/server/src/config/__tests__/llmConfig.test.ts new file mode 100644 index 0000000..eb8749c --- /dev/null +++ b/server/src/config/__tests__/llmConfig.test.ts @@ -0,0 +1,45 @@ +import { describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { getLlmConfig } from '../llmConfig.js'; + +describe('llmConfig', () => { + const originalEnv = process.env; + + beforeEach(() => { + process.env = { ...originalEnv }; + }); + + afterEach(() => { + process.env = originalEnv; + }); + + it('returns default config values', () => { + const config = getLlmConfig(); + expect(config.model).toBe('arcee-ai/trinity-large-preview:free'); + expect(config.maxTokens).toBe(200); + expect(config.temperature).toBe(0.8); + expect(config.requestsPerMinute).toBe(10); + expect(config.timeoutMs).toBe(15000); + expect(config.enabled).toBe(false); + }); + + it('reads API key from environment', () => { + process.env.OPENROUTER_API_KEY = 'test-key-123'; + const config = getLlmConfig(); + expect(config.apiKey).toBe('test-key-123'); + expect(config.enabled).toBe(true); + }); + + it('is disabled when no API key is set', () => { + delete process.env.OPENROUTER_API_KEY; + const config = getLlmConfig(); + expect(config.apiKey).toBe(''); + expect(config.enabled).toBe(false); + }); + + it('allows model override via environment', () => { + process.env.OPENROUTER_API_KEY = 'key'; + process.env.LLM_MODEL = 'custom/model:free'; + const config = getLlmConfig(); + expect(config.model).toBe('custom/model:free'); + }); +}); diff --git a/server/src/config/llmConfig.ts b/server/src/config/llmConfig.ts new file mode 100644 index 0000000..5dbd49e --- /dev/null +++ b/server/src/config/llmConfig.ts @@ -0,0 +1,22 @@ +export interface LlmConfig { + apiKey: string; + model: string; + maxTokens: number; + temperature: number; + requestsPerMinute: number; + timeoutMs: number; + enabled: boolean; +} + +export function getLlmConfig(): LlmConfig { + const apiKey = process.env.OPENROUTER_API_KEY ?? ''; + return { + apiKey, + model: process.env.LLM_MODEL ?? 'arcee-ai/trinity-large-preview:free', + maxTokens: 200, + temperature: 0.8, + requestsPerMinute: 10, + timeoutMs: 15000, + enabled: apiKey.length > 0, + }; +}