@cogitator-ai/config 0.3.8 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/dist/__tests__/env.test.d.ts +0 -2
- package/dist/__tests__/env.test.d.ts.map +0 -1
- package/dist/__tests__/env.test.js +0 -68
- package/dist/__tests__/env.test.js.map +0 -1
- package/dist/__tests__/schema.test.d.ts +0 -2
- package/dist/__tests__/schema.test.d.ts.map +0 -1
- package/dist/__tests__/schema.test.js +0 -71
- package/dist/__tests__/schema.test.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cogitator-ai/config",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.9",
|
|
4
4
|
"description": "Configuration loading for Cogitator (YAML, env)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"@types/node": "^25.0.0",
|
|
19
19
|
"yaml": "^2.3.4",
|
|
20
20
|
"zod": "^3.22.4",
|
|
21
|
-
"@cogitator-ai/types": "0.
|
|
21
|
+
"@cogitator-ai/types": "0.17.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"typescript": "^5.3.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"env.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/env.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import { loadEnvConfig } from '../loaders/env.js';
|
|
3
|
-
describe('loadEnvConfig()', () => {
|
|
4
|
-
const originalEnv = process.env;
|
|
5
|
-
beforeEach(() => {
|
|
6
|
-
vi.resetModules();
|
|
7
|
-
process.env = { ...originalEnv };
|
|
8
|
-
});
|
|
9
|
-
afterEach(() => {
|
|
10
|
-
process.env = originalEnv;
|
|
11
|
-
});
|
|
12
|
-
it('returns empty config when no env vars set', () => {
|
|
13
|
-
const keysToDelete = Object.keys(process.env).filter((key) => key.startsWith('COGITATOR_') ||
|
|
14
|
-
['OPENAI_API_KEY', 'ANTHROPIC_API_KEY', 'OLLAMA_HOST'].includes(key));
|
|
15
|
-
for (const key of keysToDelete) {
|
|
16
|
-
process.env[key] = undefined;
|
|
17
|
-
}
|
|
18
|
-
const config = loadEnvConfig();
|
|
19
|
-
expect(config.llm).toBeUndefined();
|
|
20
|
-
expect(config.limits).toBeUndefined();
|
|
21
|
-
});
|
|
22
|
-
it('loads LLM default provider from env', () => {
|
|
23
|
-
process.env.COGITATOR_LLM_DEFAULT_PROVIDER = 'openai';
|
|
24
|
-
process.env.COGITATOR_LLM_DEFAULT_MODEL = 'gpt-4';
|
|
25
|
-
const config = loadEnvConfig();
|
|
26
|
-
expect(config.llm?.defaultProvider).toBe('openai');
|
|
27
|
-
expect(config.llm?.defaultModel).toBe('gpt-4');
|
|
28
|
-
});
|
|
29
|
-
it('loads Ollama config from COGITATOR_ prefix', () => {
|
|
30
|
-
process.env.COGITATOR_OLLAMA_BASE_URL = 'http://localhost:11434';
|
|
31
|
-
const config = loadEnvConfig();
|
|
32
|
-
expect(config.llm?.providers?.ollama?.baseUrl).toBe('http://localhost:11434');
|
|
33
|
-
});
|
|
34
|
-
it('loads Ollama config from standard OLLAMA_HOST', () => {
|
|
35
|
-
delete process.env.COGITATOR_OLLAMA_BASE_URL;
|
|
36
|
-
process.env.OLLAMA_HOST = 'http://192.168.1.100:11434';
|
|
37
|
-
const config = loadEnvConfig();
|
|
38
|
-
expect(config.llm?.providers?.ollama?.baseUrl).toBe('http://192.168.1.100:11434');
|
|
39
|
-
});
|
|
40
|
-
it('loads OpenAI config from standard OPENAI_API_KEY', () => {
|
|
41
|
-
delete process.env.COGITATOR_OPENAI_API_KEY;
|
|
42
|
-
process.env.OPENAI_API_KEY = 'sk-test-key';
|
|
43
|
-
const config = loadEnvConfig();
|
|
44
|
-
expect(config.llm?.providers?.openai?.apiKey).toBe('sk-test-key');
|
|
45
|
-
});
|
|
46
|
-
it('loads Anthropic config from standard ANTHROPIC_API_KEY', () => {
|
|
47
|
-
delete process.env.COGITATOR_ANTHROPIC_API_KEY;
|
|
48
|
-
process.env.ANTHROPIC_API_KEY = 'sk-ant-test-key';
|
|
49
|
-
const config = loadEnvConfig();
|
|
50
|
-
expect(config.llm?.providers?.anthropic?.apiKey).toBe('sk-ant-test-key');
|
|
51
|
-
});
|
|
52
|
-
it('loads limits from env', () => {
|
|
53
|
-
process.env.COGITATOR_LIMITS_MAX_CONCURRENT_RUNS = '5';
|
|
54
|
-
process.env.COGITATOR_LIMITS_DEFAULT_TIMEOUT = '30000';
|
|
55
|
-
process.env.COGITATOR_LIMITS_MAX_TOKENS_PER_RUN = '100000';
|
|
56
|
-
const config = loadEnvConfig();
|
|
57
|
-
expect(config.limits?.maxConcurrentRuns).toBe(5);
|
|
58
|
-
expect(config.limits?.defaultTimeout).toBe(30000);
|
|
59
|
-
expect(config.limits?.maxTokensPerRun).toBe(100000);
|
|
60
|
-
});
|
|
61
|
-
it('COGITATOR_ prefix takes precedence over standard env vars', () => {
|
|
62
|
-
process.env.OPENAI_API_KEY = 'standard-key';
|
|
63
|
-
process.env.COGITATOR_OPENAI_API_KEY = 'cogitator-key';
|
|
64
|
-
const config = loadEnvConfig();
|
|
65
|
-
expect(config.llm?.providers?.openai?.apiKey).toBe('cogitator-key');
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
//# sourceMappingURL=env.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"env.test.js","sourceRoot":"","sources":["../../src/__tests__/env.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schema.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { CogitatorConfigSchema, LLMProviderSchema } from '../schema.js';
|
|
3
|
-
describe('LLMProviderSchema', () => {
|
|
4
|
-
it('accepts valid providers', () => {
|
|
5
|
-
expect(LLMProviderSchema.parse('ollama')).toBe('ollama');
|
|
6
|
-
expect(LLMProviderSchema.parse('openai')).toBe('openai');
|
|
7
|
-
expect(LLMProviderSchema.parse('anthropic')).toBe('anthropic');
|
|
8
|
-
expect(LLMProviderSchema.parse('google')).toBe('google');
|
|
9
|
-
expect(LLMProviderSchema.parse('vllm')).toBe('vllm');
|
|
10
|
-
});
|
|
11
|
-
it('rejects invalid providers', () => {
|
|
12
|
-
expect(() => LLMProviderSchema.parse('invalid')).toThrow();
|
|
13
|
-
expect(() => LLMProviderSchema.parse('')).toThrow();
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
describe('CogitatorConfigSchema', () => {
|
|
17
|
-
it('accepts empty config', () => {
|
|
18
|
-
const result = CogitatorConfigSchema.parse({});
|
|
19
|
-
expect(result).toEqual({});
|
|
20
|
-
});
|
|
21
|
-
it('accepts full config', () => {
|
|
22
|
-
const config = {
|
|
23
|
-
llm: {
|
|
24
|
-
defaultProvider: 'ollama',
|
|
25
|
-
defaultModel: 'llama3.1:8b',
|
|
26
|
-
providers: {
|
|
27
|
-
ollama: { baseUrl: 'http://localhost:11434' },
|
|
28
|
-
openai: { apiKey: 'sk-xxx', baseUrl: 'https://api.openai.com/v1' },
|
|
29
|
-
anthropic: { apiKey: 'sk-ant-xxx' },
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
limits: {
|
|
33
|
-
maxConcurrentRuns: 10,
|
|
34
|
-
defaultTimeout: 30000,
|
|
35
|
-
maxTokensPerRun: 100000,
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
const result = CogitatorConfigSchema.parse(config);
|
|
39
|
-
expect(result.llm?.defaultProvider).toBe('ollama');
|
|
40
|
-
expect(result.llm?.providers?.ollama?.baseUrl).toBe('http://localhost:11434');
|
|
41
|
-
expect(result.limits?.maxConcurrentRuns).toBe(10);
|
|
42
|
-
});
|
|
43
|
-
it('accepts partial config', () => {
|
|
44
|
-
const config = {
|
|
45
|
-
llm: {
|
|
46
|
-
defaultProvider: 'openai',
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
const result = CogitatorConfigSchema.parse(config);
|
|
50
|
-
expect(result.llm?.defaultProvider).toBe('openai');
|
|
51
|
-
expect(result.llm?.providers).toBeUndefined();
|
|
52
|
-
expect(result.limits).toBeUndefined();
|
|
53
|
-
});
|
|
54
|
-
it('rejects invalid provider', () => {
|
|
55
|
-
const config = {
|
|
56
|
-
llm: {
|
|
57
|
-
defaultProvider: 'invalid-provider',
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
expect(() => CogitatorConfigSchema.parse(config)).toThrow();
|
|
61
|
-
});
|
|
62
|
-
it('rejects negative limits', () => {
|
|
63
|
-
const config = {
|
|
64
|
-
limits: {
|
|
65
|
-
maxConcurrentRuns: -1,
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
expect(() => CogitatorConfigSchema.parse(config)).toThrow();
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=schema.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/__tests__/schema.test.ts"],"names":[],"mappings":"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"}
|