feat: add ollama provider
This commit is contained in:
+105
-2
@@ -5,7 +5,7 @@ const originalEnv = { ...process.env };
|
||||
|
||||
function setEnv(partial) {
|
||||
for (const key of Object.keys(process.env)) {
|
||||
if (key.startsWith('OPENAI_') || key.startsWith('CHATGPT_MCP_')) {
|
||||
if (key.startsWith('OPENAI_') || key.startsWith('CHATGPT_MCP_') || key.startsWith('OLLAMA_')) {
|
||||
delete process.env[key];
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ beforeEach(() => {
|
||||
|
||||
afterEach(() => {
|
||||
for (const key of Object.keys(process.env)) {
|
||||
if (key.startsWith('OPENAI_') || key.startsWith('CHATGPT_MCP_')) {
|
||||
if (key.startsWith('OPENAI_') || key.startsWith('CHATGPT_MCP_') || key.startsWith('OLLAMA_')) {
|
||||
delete process.env[key];
|
||||
}
|
||||
}
|
||||
@@ -47,6 +47,10 @@ describe('loadConfig', () => {
|
||||
expect(cfg.maxFiles).toBe(5);
|
||||
expect(cfg.maxLogChars).toBe(10000);
|
||||
expect(cfg.redactSecrets).toBe(true);
|
||||
expect(cfg.ollamaBaseUrl).toBe('http://localhost:11434');
|
||||
expect(cfg.ollamaModel).toBe('qwen3:latest');
|
||||
expect(cfg.ollamaTemperature).toBe(0.2);
|
||||
expect(cfg.ollamaTimeout).toBe(60);
|
||||
});
|
||||
|
||||
it('applies custom string values', () => {
|
||||
@@ -162,3 +166,102 @@ describe('loadConfig chatgptMcpProvider', () => {
|
||||
expect(cfg.chatgptMcpProvider).toBe('ollama');
|
||||
});
|
||||
});
|
||||
|
||||
// --- Ollama env vars ---
|
||||
|
||||
describe('loadConfig ollama env vars', () => {
|
||||
it('returns default ollama values when no OLLAMA_ vars set', () => {
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaBaseUrl).toBe('http://localhost:11434');
|
||||
expect(cfg.ollamaModel).toBe('qwen3:latest');
|
||||
expect(cfg.ollamaTemperature).toBe(0.2);
|
||||
expect(cfg.ollamaTimeout).toBe(60);
|
||||
});
|
||||
|
||||
it('applies custom OLLAMA_BASE_URL', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_BASE_URL: 'http://localhost:11435' });
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaBaseUrl).toBe('http://localhost:11435');
|
||||
});
|
||||
|
||||
it('returns raw OLLAMA_BASE_URL — trailing slash normalization is in the provider', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_BASE_URL: 'http://localhost:11434/' });
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaBaseUrl).toBe('http://localhost:11434/');
|
||||
});
|
||||
|
||||
it('applies custom OLLAMA_MODEL', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_MODEL: 'llama3' });
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaModel).toBe('llama3');
|
||||
});
|
||||
|
||||
it('applies custom OLLAMA_TEMPERATURE', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_TEMPERATURE: '0.7' });
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaTemperature).toBe(0.7);
|
||||
});
|
||||
|
||||
it('applies custom OLLAMA_TIMEOUT', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_TIMEOUT: '120' });
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaTimeout).toBe(120);
|
||||
});
|
||||
|
||||
it('throws on invalid OLLAMA_TEMPERATURE', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_TEMPERATURE: 'abc' });
|
||||
expect(() => loadConfig()).toThrow(
|
||||
'Configuration error: OLLAMA_TEMPERATURE must be a positive number, got "abc".'
|
||||
);
|
||||
});
|
||||
|
||||
it('throws on negative OLLAMA_TIMEOUT', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_TIMEOUT: '-10' });
|
||||
expect(() => loadConfig()).toThrow(
|
||||
'Configuration error: OLLAMA_TIMEOUT must be a positive number, got "-10".'
|
||||
);
|
||||
});
|
||||
|
||||
it('works with ollama provider and all ollama env vars', () => {
|
||||
setEnv({
|
||||
OPENAI_API_KEY: 'sk-test',
|
||||
CHATGPT_MCP_PROVIDER: 'ollama',
|
||||
OLLAMA_BASE_URL: 'http://ollama-server:8080',
|
||||
OLLAMA_MODEL: 'mistral',
|
||||
OLLAMA_TEMPERATURE: '0.5',
|
||||
OLLAMA_TIMEOUT: '90',
|
||||
});
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.chatgptMcpProvider).toBe('ollama');
|
||||
expect(cfg.ollamaBaseUrl).toBe('http://ollama-server:8080');
|
||||
expect(cfg.ollamaModel).toBe('mistral');
|
||||
expect(cfg.ollamaTemperature).toBe(0.5);
|
||||
expect(cfg.ollamaTimeout).toBe(90);
|
||||
});
|
||||
});
|
||||
|
||||
describe('loadConfig ollama env vars with trailing slash', () => {
|
||||
it('returns raw base URL — normalization happens in the provider', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_BASE_URL: 'http://localhost:11434//' });
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaBaseUrl).toBe('http://localhost:11434//');
|
||||
});
|
||||
|
||||
it('returns raw base URL with multiple slashes', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_BASE_URL: 'http://localhost:11434///' });
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaBaseUrl).toBe('http://localhost:11434///');
|
||||
});
|
||||
|
||||
it('handles base URL without trailing slash', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_BASE_URL: 'http://localhost:11434' });
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaBaseUrl).toBe('http://localhost:11434');
|
||||
});
|
||||
|
||||
it('handles empty base URL as default', () => {
|
||||
setEnv({ OPENAI_API_KEY: 'test-key', OLLAMA_BASE_URL: '' });
|
||||
const cfg = loadConfig();
|
||||
expect(cfg.ollamaBaseUrl).toBe('http://localhost:11434');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user