@aiagentflow/cli 0.1.0
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/LICENSE +21 -0
- package/README.md +232 -0
- package/dist/agents/base.d.ts +69 -0
- package/dist/agents/base.d.ts.map +1 -0
- package/dist/agents/base.js +78 -0
- package/dist/agents/base.js.map +1 -0
- package/dist/agents/factory.d.ts +21 -0
- package/dist/agents/factory.d.ts.map +1 -0
- package/dist/agents/factory.js +50 -0
- package/dist/agents/factory.js.map +1 -0
- package/dist/agents/roles/architect.d.ts +23 -0
- package/dist/agents/roles/architect.d.ts.map +1 -0
- package/dist/agents/roles/architect.js +39 -0
- package/dist/agents/roles/architect.js.map +1 -0
- package/dist/agents/roles/coder.d.ts +19 -0
- package/dist/agents/roles/coder.d.ts.map +1 -0
- package/dist/agents/roles/coder.js +38 -0
- package/dist/agents/roles/coder.js.map +1 -0
- package/dist/agents/roles/fixer.d.ts +19 -0
- package/dist/agents/roles/fixer.d.ts.map +1 -0
- package/dist/agents/roles/fixer.js +29 -0
- package/dist/agents/roles/fixer.js.map +1 -0
- package/dist/agents/roles/judge.d.ts +24 -0
- package/dist/agents/roles/judge.d.ts.map +1 -0
- package/dist/agents/roles/judge.js +38 -0
- package/dist/agents/roles/judge.js.map +1 -0
- package/dist/agents/roles/reviewer.d.ts +28 -0
- package/dist/agents/roles/reviewer.d.ts.map +1 -0
- package/dist/agents/roles/reviewer.js +49 -0
- package/dist/agents/roles/reviewer.js.map +1 -0
- package/dist/agents/roles/tester.d.ts +19 -0
- package/dist/agents/roles/tester.d.ts.map +1 -0
- package/dist/agents/roles/tester.js +29 -0
- package/dist/agents/roles/tester.js.map +1 -0
- package/dist/agents/types.d.ts +13 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +25 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +9 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +30 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +12 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +63 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +12 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +231 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.d.ts +11 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +66 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +24 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config/defaults.d.ts +22 -0
- package/dist/core/config/defaults.d.ts.map +1 -0
- package/dist/core/config/defaults.js +60 -0
- package/dist/core/config/defaults.js.map +1 -0
- package/dist/core/config/manager.d.ts +45 -0
- package/dist/core/config/manager.d.ts.map +1 -0
- package/dist/core/config/manager.js +106 -0
- package/dist/core/config/manager.js.map +1 -0
- package/dist/core/config/schema.d.ts +780 -0
- package/dist/core/config/schema.d.ts.map +1 -0
- package/dist/core/config/schema.js +102 -0
- package/dist/core/config/schema.js.map +1 -0
- package/dist/core/config/types.d.ts +24 -0
- package/dist/core/config/types.d.ts.map +1 -0
- package/dist/core/config/types.js +11 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/errors.d.ts +36 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +60 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/workflow/approval.d.ts +22 -0
- package/dist/core/workflow/approval.d.ts.map +1 -0
- package/dist/core/workflow/approval.js +54 -0
- package/dist/core/workflow/approval.js.map +1 -0
- package/dist/core/workflow/engine.d.ts +128 -0
- package/dist/core/workflow/engine.d.ts.map +1 -0
- package/dist/core/workflow/engine.js +159 -0
- package/dist/core/workflow/engine.js.map +1 -0
- package/dist/core/workflow/file-parser.d.ts +41 -0
- package/dist/core/workflow/file-parser.d.ts.map +1 -0
- package/dist/core/workflow/file-parser.js +138 -0
- package/dist/core/workflow/file-parser.js.map +1 -0
- package/dist/core/workflow/qa-policy.d.ts +55 -0
- package/dist/core/workflow/qa-policy.d.ts.map +1 -0
- package/dist/core/workflow/qa-policy.js +119 -0
- package/dist/core/workflow/qa-policy.js.map +1 -0
- package/dist/core/workflow/runner.d.ts +30 -0
- package/dist/core/workflow/runner.d.ts.map +1 -0
- package/dist/core/workflow/runner.js +273 -0
- package/dist/core/workflow/runner.js.map +1 -0
- package/dist/core/workflow/session.d.ts +37 -0
- package/dist/core/workflow/session.d.ts.map +1 -0
- package/dist/core/workflow/session.js +93 -0
- package/dist/core/workflow/session.js.map +1 -0
- package/dist/core/workflow/task-queue.d.ts +46 -0
- package/dist/core/workflow/task-queue.d.ts.map +1 -0
- package/dist/core/workflow/task-queue.js +106 -0
- package/dist/core/workflow/task-queue.js.map +1 -0
- package/dist/core/workflow/test-runner.d.ts +25 -0
- package/dist/core/workflow/test-runner.d.ts.map +1 -0
- package/dist/core/workflow/test-runner.js +50 -0
- package/dist/core/workflow/test-runner.js.map +1 -0
- package/dist/core/workflow/token-tracker.d.ts +54 -0
- package/dist/core/workflow/token-tracker.d.ts.map +1 -0
- package/dist/core/workflow/token-tracker.js +98 -0
- package/dist/core/workflow/token-tracker.js.map +1 -0
- package/dist/git/client.d.ts +47 -0
- package/dist/git/client.d.ts.map +1 -0
- package/dist/git/client.js +109 -0
- package/dist/git/client.js.map +1 -0
- package/dist/prompts/library.d.ts +35 -0
- package/dist/prompts/library.d.ts.map +1 -0
- package/dist/prompts/library.js +238 -0
- package/dist/prompts/library.js.map +1 -0
- package/dist/providers/anthropic.d.ts +55 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +237 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/ollama.d.ts +44 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +211 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/registry.d.ts +36 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +91 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +100 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +12 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/fs.d.ts +30 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +80 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +46 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +87 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +28 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +38 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Claude provider adapter.
|
|
3
|
+
*
|
|
4
|
+
* Uses the Anthropic Messages API directly via fetch() — no SDK dependency.
|
|
5
|
+
* This gives full control over request/response handling and keeps deps minimal.
|
|
6
|
+
*
|
|
7
|
+
* Dependency direction: anthropic.ts → providers/types.ts, core/errors.ts
|
|
8
|
+
* Used by: providers/registry.ts
|
|
9
|
+
*/
|
|
10
|
+
import type { LLMProvider, ChatMessage, ChatOptions, ChatResponse, ChatChunk, ModelInfo } from './types.js';
|
|
11
|
+
/** Configuration required to create an Anthropic provider. */
|
|
12
|
+
export interface AnthropicProviderConfig {
|
|
13
|
+
readonly apiKey: string;
|
|
14
|
+
readonly baseUrl?: string;
|
|
15
|
+
readonly apiVersion?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Anthropic Claude provider implementation.
|
|
19
|
+
*
|
|
20
|
+
* Implements the LLMProvider interface using the Anthropic Messages API.
|
|
21
|
+
* Handles system prompts separately (Anthropic uses a top-level `system` field).
|
|
22
|
+
*/
|
|
23
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
24
|
+
readonly name: "anthropic";
|
|
25
|
+
private readonly apiKey;
|
|
26
|
+
private readonly baseUrl;
|
|
27
|
+
private readonly apiVersion;
|
|
28
|
+
constructor(config: AnthropicProviderConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Send a non-streaming chat completion request.
|
|
31
|
+
*/
|
|
32
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
33
|
+
/**
|
|
34
|
+
* Send a streaming chat completion request.
|
|
35
|
+
*/
|
|
36
|
+
stream(messages: ChatMessage[], options?: ChatOptions): AsyncIterable<ChatChunk>;
|
|
37
|
+
/**
|
|
38
|
+
* List available models (Anthropic doesn't have a models endpoint,
|
|
39
|
+
* so we return a curated list of known models).
|
|
40
|
+
*/
|
|
41
|
+
listModels(): Promise<ModelInfo[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Validate that the Anthropic API connection is working.
|
|
44
|
+
*/
|
|
45
|
+
validateConnection(): Promise<boolean>;
|
|
46
|
+
private getHeaders;
|
|
47
|
+
private request;
|
|
48
|
+
/**
|
|
49
|
+
* Separate system prompt from messages (Anthropic uses a top-level field).
|
|
50
|
+
*/
|
|
51
|
+
private prepareMessages;
|
|
52
|
+
private extractContent;
|
|
53
|
+
private extractUsage;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EAEZ,MAAM,YAAY,CAAC;AAGpB,8DAA8D;AAC9D,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAChC;AAUD;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACjD,SAAgB,IAAI,EAAG,WAAW,CAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,uBAAuB;IAS3C;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAqCjF;;OAEG;IACI,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC;IA8EvF;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IASxC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAqB5C,OAAO,CAAC,UAAU;YAQJ,OAAO;IA2BrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,YAAY;CAQvB"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Claude provider adapter.
|
|
3
|
+
*
|
|
4
|
+
* Uses the Anthropic Messages API directly via fetch() — no SDK dependency.
|
|
5
|
+
* This gives full control over request/response handling and keeps deps minimal.
|
|
6
|
+
*
|
|
7
|
+
* Dependency direction: anthropic.ts → providers/types.ts, core/errors.ts
|
|
8
|
+
* Used by: providers/registry.ts
|
|
9
|
+
*/
|
|
10
|
+
import { ProviderError } from '../core/errors.js';
|
|
11
|
+
import { logger } from '../utils/logger.js';
|
|
12
|
+
/** Default Anthropic API settings. */
|
|
13
|
+
const DEFAULTS = {
|
|
14
|
+
baseUrl: 'https://api.anthropic.com',
|
|
15
|
+
apiVersion: '2023-06-01',
|
|
16
|
+
model: 'claude-sonnet-4-20250514',
|
|
17
|
+
maxTokens: 4096,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Anthropic Claude provider implementation.
|
|
21
|
+
*
|
|
22
|
+
* Implements the LLMProvider interface using the Anthropic Messages API.
|
|
23
|
+
* Handles system prompts separately (Anthropic uses a top-level `system` field).
|
|
24
|
+
*/
|
|
25
|
+
export class AnthropicProvider {
|
|
26
|
+
name = 'anthropic';
|
|
27
|
+
apiKey;
|
|
28
|
+
baseUrl;
|
|
29
|
+
apiVersion;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
if (!config.apiKey) {
|
|
32
|
+
throw new ProviderError('Anthropic API key is required', { provider: 'anthropic' });
|
|
33
|
+
}
|
|
34
|
+
this.apiKey = config.apiKey;
|
|
35
|
+
this.baseUrl = config.baseUrl ?? DEFAULTS.baseUrl;
|
|
36
|
+
this.apiVersion = config.apiVersion ?? DEFAULTS.apiVersion;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Send a non-streaming chat completion request.
|
|
40
|
+
*/
|
|
41
|
+
async chat(messages, options) {
|
|
42
|
+
const { systemPrompt, apiMessages } = this.prepareMessages(messages, options);
|
|
43
|
+
const model = options?.model ?? DEFAULTS.model;
|
|
44
|
+
const maxTokens = options?.maxTokens ?? DEFAULTS.maxTokens;
|
|
45
|
+
const body = {
|
|
46
|
+
model,
|
|
47
|
+
max_tokens: maxTokens,
|
|
48
|
+
messages: apiMessages,
|
|
49
|
+
};
|
|
50
|
+
if (systemPrompt) {
|
|
51
|
+
body.system = systemPrompt;
|
|
52
|
+
}
|
|
53
|
+
if (options?.temperature !== undefined) {
|
|
54
|
+
body.temperature = options.temperature;
|
|
55
|
+
}
|
|
56
|
+
if (options?.stopSequences?.length) {
|
|
57
|
+
body.stop_sequences = options.stopSequences;
|
|
58
|
+
}
|
|
59
|
+
logger.debug(`Anthropic chat request: model=${model}, messages=${apiMessages.length}`);
|
|
60
|
+
const response = await this.request('/v1/messages', body);
|
|
61
|
+
// Extract text content from response
|
|
62
|
+
const content = this.extractContent(response);
|
|
63
|
+
const usage = this.extractUsage(response);
|
|
64
|
+
return {
|
|
65
|
+
content,
|
|
66
|
+
model: response.model ?? model,
|
|
67
|
+
usage,
|
|
68
|
+
finishReason: response.stop_reason ?? 'unknown',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Send a streaming chat completion request.
|
|
73
|
+
*/
|
|
74
|
+
async *stream(messages, options) {
|
|
75
|
+
const { systemPrompt, apiMessages } = this.prepareMessages(messages, options);
|
|
76
|
+
const model = options?.model ?? DEFAULTS.model;
|
|
77
|
+
const maxTokens = options?.maxTokens ?? DEFAULTS.maxTokens;
|
|
78
|
+
const body = {
|
|
79
|
+
model,
|
|
80
|
+
max_tokens: maxTokens,
|
|
81
|
+
messages: apiMessages,
|
|
82
|
+
stream: true,
|
|
83
|
+
};
|
|
84
|
+
if (systemPrompt) {
|
|
85
|
+
body.system = systemPrompt;
|
|
86
|
+
}
|
|
87
|
+
if (options?.temperature !== undefined) {
|
|
88
|
+
body.temperature = options.temperature;
|
|
89
|
+
}
|
|
90
|
+
const response = await fetch(`${this.baseUrl}/v1/messages`, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: this.getHeaders(),
|
|
93
|
+
body: JSON.stringify(body),
|
|
94
|
+
});
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
const errorBody = await response.text();
|
|
97
|
+
throw new ProviderError(`Anthropic streaming request failed: ${response.status} ${response.statusText}`, { status: response.status, body: errorBody, provider: 'anthropic' });
|
|
98
|
+
}
|
|
99
|
+
if (!response.body) {
|
|
100
|
+
throw new ProviderError('Anthropic response has no body', { provider: 'anthropic' });
|
|
101
|
+
}
|
|
102
|
+
const reader = response.body.getReader();
|
|
103
|
+
const decoder = new TextDecoder();
|
|
104
|
+
let buffer = '';
|
|
105
|
+
try {
|
|
106
|
+
while (true) {
|
|
107
|
+
const { done, value } = await reader.read();
|
|
108
|
+
if (done)
|
|
109
|
+
break;
|
|
110
|
+
buffer += decoder.decode(value, { stream: true });
|
|
111
|
+
const lines = buffer.split('\n');
|
|
112
|
+
buffer = lines.pop() ?? '';
|
|
113
|
+
for (const line of lines) {
|
|
114
|
+
if (!line.startsWith('data: '))
|
|
115
|
+
continue;
|
|
116
|
+
const data = line.slice(6).trim();
|
|
117
|
+
if (data === '[DONE]') {
|
|
118
|
+
yield { content: '', done: true };
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const event = JSON.parse(data);
|
|
123
|
+
if (event.type === 'content_block_delta' && event.delta?.text) {
|
|
124
|
+
yield { content: event.delta.text, done: false };
|
|
125
|
+
}
|
|
126
|
+
else if (event.type === 'message_stop') {
|
|
127
|
+
yield { content: '', done: true };
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Skip unparseable lines
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
reader.releaseLock();
|
|
139
|
+
}
|
|
140
|
+
yield { content: '', done: true };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* List available models (Anthropic doesn't have a models endpoint,
|
|
144
|
+
* so we return a curated list of known models).
|
|
145
|
+
*/
|
|
146
|
+
async listModels() {
|
|
147
|
+
return [
|
|
148
|
+
{ id: 'claude-sonnet-4-20250514', name: 'Claude Sonnet 4', provider: 'anthropic', contextWindow: 200000 },
|
|
149
|
+
{ id: 'claude-3-5-sonnet-20241022', name: 'Claude 3.5 Sonnet', provider: 'anthropic', contextWindow: 200000 },
|
|
150
|
+
{ id: 'claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku', provider: 'anthropic', contextWindow: 200000 },
|
|
151
|
+
{ id: 'claude-3-opus-20240229', name: 'Claude 3 Opus', provider: 'anthropic', contextWindow: 200000 },
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Validate that the Anthropic API connection is working.
|
|
156
|
+
*/
|
|
157
|
+
async validateConnection() {
|
|
158
|
+
try {
|
|
159
|
+
const response = await fetch(`${this.baseUrl}/v1/messages`, {
|
|
160
|
+
method: 'POST',
|
|
161
|
+
headers: this.getHeaders(),
|
|
162
|
+
body: JSON.stringify({
|
|
163
|
+
model: DEFAULTS.model,
|
|
164
|
+
max_tokens: 1,
|
|
165
|
+
messages: [{ role: 'user', content: 'ping' }],
|
|
166
|
+
}),
|
|
167
|
+
});
|
|
168
|
+
// A 200 or 400 (bad request but authenticated) means the key works
|
|
169
|
+
return response.status === 200 || response.status === 400;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// ── Private helpers ──
|
|
176
|
+
getHeaders() {
|
|
177
|
+
return {
|
|
178
|
+
'Content-Type': 'application/json',
|
|
179
|
+
'x-api-key': this.apiKey,
|
|
180
|
+
'anthropic-version': this.apiVersion,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async request(path, body) {
|
|
184
|
+
let response;
|
|
185
|
+
try {
|
|
186
|
+
response = await fetch(`${this.baseUrl}${path}`, {
|
|
187
|
+
method: 'POST',
|
|
188
|
+
headers: this.getHeaders(),
|
|
189
|
+
body: JSON.stringify(body),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
throw new ProviderError(`Failed to connect to Anthropic API: ${err instanceof Error ? err.message : String(err)}`, { provider: 'anthropic', baseUrl: this.baseUrl });
|
|
194
|
+
}
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
const errorBody = await response.text();
|
|
197
|
+
throw new ProviderError(`Anthropic API error: ${response.status} ${response.statusText}`, { status: response.status, body: errorBody, provider: 'anthropic' });
|
|
198
|
+
}
|
|
199
|
+
return response.json();
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Separate system prompt from messages (Anthropic uses a top-level field).
|
|
203
|
+
*/
|
|
204
|
+
prepareMessages(messages, options) {
|
|
205
|
+
let systemPrompt = options?.systemPrompt;
|
|
206
|
+
const apiMessages = [];
|
|
207
|
+
for (const msg of messages) {
|
|
208
|
+
if (msg.role === 'system') {
|
|
209
|
+
// Anthropic doesn't support system role in messages array
|
|
210
|
+
systemPrompt = systemPrompt ? `${systemPrompt}\n\n${msg.content}` : msg.content;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
apiMessages.push({ role: msg.role, content: msg.content });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return { systemPrompt, apiMessages };
|
|
217
|
+
}
|
|
218
|
+
extractContent(response) {
|
|
219
|
+
const content = response.content;
|
|
220
|
+
if (Array.isArray(content)) {
|
|
221
|
+
return content
|
|
222
|
+
.filter((block) => block.type === 'text')
|
|
223
|
+
.map((block) => block.text)
|
|
224
|
+
.join('');
|
|
225
|
+
}
|
|
226
|
+
return String(content ?? '');
|
|
227
|
+
}
|
|
228
|
+
extractUsage(response) {
|
|
229
|
+
const usage = response.usage;
|
|
230
|
+
return {
|
|
231
|
+
promptTokens: usage?.input_tokens ?? 0,
|
|
232
|
+
completionTokens: usage?.output_tokens ?? 0,
|
|
233
|
+
totalTokens: (usage?.input_tokens ?? 0) + (usage?.output_tokens ?? 0),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama local model provider adapter.
|
|
3
|
+
*
|
|
4
|
+
* Connects to the Ollama HTTP API (default: http://localhost:11434).
|
|
5
|
+
* Supports chat completion, streaming, model listing, and health checks.
|
|
6
|
+
*
|
|
7
|
+
* Dependency direction: ollama.ts → providers/types.ts, core/errors.ts
|
|
8
|
+
* Used by: providers/registry.ts
|
|
9
|
+
*/
|
|
10
|
+
import type { LLMProvider, ChatMessage, ChatOptions, ChatResponse, ChatChunk, ModelInfo } from './types.js';
|
|
11
|
+
/** Configuration required to create an Ollama provider. */
|
|
12
|
+
export interface OllamaProviderConfig {
|
|
13
|
+
readonly baseUrl?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Ollama local model provider implementation.
|
|
17
|
+
*
|
|
18
|
+
* Implements the LLMProvider interface for locally-running models via Ollama.
|
|
19
|
+
*/
|
|
20
|
+
export declare class OllamaProvider implements LLMProvider {
|
|
21
|
+
readonly name: "ollama";
|
|
22
|
+
private readonly baseUrl;
|
|
23
|
+
constructor(config?: OllamaProviderConfig);
|
|
24
|
+
/**
|
|
25
|
+
* Send a non-streaming chat completion request.
|
|
26
|
+
*/
|
|
27
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
28
|
+
/**
|
|
29
|
+
* Send a streaming chat completion request.
|
|
30
|
+
*/
|
|
31
|
+
stream(messages: ChatMessage[], options?: ChatOptions): AsyncIterable<ChatChunk>;
|
|
32
|
+
/**
|
|
33
|
+
* List available models from the local Ollama instance.
|
|
34
|
+
*/
|
|
35
|
+
listModels(): Promise<ModelInfo[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Validate that Ollama is running and reachable.
|
|
38
|
+
*/
|
|
39
|
+
validateConnection(): Promise<boolean>;
|
|
40
|
+
private prepareMessages;
|
|
41
|
+
private request;
|
|
42
|
+
private extractUsage;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EAEZ,MAAM,YAAY,CAAC;AAGpB,2DAA2D;AAC3D,MAAM,WAAW,oBAAoB;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC7B;AAQD;;;;GAIG;AACH,qBAAa,cAAe,YAAW,WAAW;IAC9C,SAAgB,IAAI,EAAG,QAAQ,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,CAAC,EAAE,oBAAoB;IAIzC;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA6BjF;;OAEG;IACI,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC;IAiFvF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IA4BxC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAW5C,OAAO,CAAC,eAAe;YAkBT,OAAO;IA2CrB,OAAO,CAAC,YAAY;CAOvB"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama local model provider adapter.
|
|
3
|
+
*
|
|
4
|
+
* Connects to the Ollama HTTP API (default: http://localhost:11434).
|
|
5
|
+
* Supports chat completion, streaming, model listing, and health checks.
|
|
6
|
+
*
|
|
7
|
+
* Dependency direction: ollama.ts → providers/types.ts, core/errors.ts
|
|
8
|
+
* Used by: providers/registry.ts
|
|
9
|
+
*/
|
|
10
|
+
import { ProviderError } from '../core/errors.js';
|
|
11
|
+
import { logger } from '../utils/logger.js';
|
|
12
|
+
/** Default Ollama settings. */
|
|
13
|
+
const DEFAULTS = {
|
|
14
|
+
baseUrl: 'http://localhost:11434',
|
|
15
|
+
model: 'llama3.2:latest',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Ollama local model provider implementation.
|
|
19
|
+
*
|
|
20
|
+
* Implements the LLMProvider interface for locally-running models via Ollama.
|
|
21
|
+
*/
|
|
22
|
+
export class OllamaProvider {
|
|
23
|
+
name = 'ollama';
|
|
24
|
+
baseUrl;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.baseUrl = config?.baseUrl ?? DEFAULTS.baseUrl;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Send a non-streaming chat completion request.
|
|
30
|
+
*/
|
|
31
|
+
async chat(messages, options) {
|
|
32
|
+
const model = options?.model ?? DEFAULTS.model;
|
|
33
|
+
const ollamaMessages = this.prepareMessages(messages, options);
|
|
34
|
+
const body = {
|
|
35
|
+
model,
|
|
36
|
+
messages: ollamaMessages,
|
|
37
|
+
stream: false,
|
|
38
|
+
};
|
|
39
|
+
if (options?.temperature !== undefined) {
|
|
40
|
+
body.options = { ...(body.options ?? {}), temperature: options.temperature };
|
|
41
|
+
}
|
|
42
|
+
if (options?.maxTokens !== undefined) {
|
|
43
|
+
body.options = { ...(body.options ?? {}), num_predict: options.maxTokens };
|
|
44
|
+
}
|
|
45
|
+
logger.debug(`Ollama chat request: model=${model}, messages=${ollamaMessages.length}`);
|
|
46
|
+
const response = await this.request('/api/chat', body);
|
|
47
|
+
return {
|
|
48
|
+
content: response.message?.content ?? '',
|
|
49
|
+
model: response.model ?? model,
|
|
50
|
+
usage: this.extractUsage(response),
|
|
51
|
+
finishReason: response.done_reason ?? 'stop',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Send a streaming chat completion request.
|
|
56
|
+
*/
|
|
57
|
+
async *stream(messages, options) {
|
|
58
|
+
const model = options?.model ?? DEFAULTS.model;
|
|
59
|
+
const ollamaMessages = this.prepareMessages(messages, options);
|
|
60
|
+
const body = {
|
|
61
|
+
model,
|
|
62
|
+
messages: ollamaMessages,
|
|
63
|
+
stream: true,
|
|
64
|
+
};
|
|
65
|
+
if (options?.temperature !== undefined) {
|
|
66
|
+
body.options = { ...(body.options ?? {}), temperature: options.temperature };
|
|
67
|
+
}
|
|
68
|
+
if (options?.maxTokens !== undefined) {
|
|
69
|
+
body.options = { ...(body.options ?? {}), num_predict: options.maxTokens };
|
|
70
|
+
}
|
|
71
|
+
let response;
|
|
72
|
+
try {
|
|
73
|
+
response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: { 'Content-Type': 'application/json' },
|
|
76
|
+
body: JSON.stringify(body),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
throw new ProviderError(`Failed to connect to Ollama at ${this.baseUrl}: ${err instanceof Error ? err.message : String(err)}`, { provider: 'ollama', baseUrl: this.baseUrl });
|
|
81
|
+
}
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
const errorBody = await response.text();
|
|
84
|
+
throw new ProviderError(`Ollama streaming request failed: ${response.status} ${response.statusText}`, { status: response.status, body: errorBody, provider: 'ollama' });
|
|
85
|
+
}
|
|
86
|
+
if (!response.body) {
|
|
87
|
+
throw new ProviderError('Ollama response has no body', { provider: 'ollama' });
|
|
88
|
+
}
|
|
89
|
+
const reader = response.body.getReader();
|
|
90
|
+
const decoder = new TextDecoder();
|
|
91
|
+
let buffer = '';
|
|
92
|
+
try {
|
|
93
|
+
while (true) {
|
|
94
|
+
const { done, value } = await reader.read();
|
|
95
|
+
if (done)
|
|
96
|
+
break;
|
|
97
|
+
buffer += decoder.decode(value, { stream: true });
|
|
98
|
+
const lines = buffer.split('\n');
|
|
99
|
+
buffer = lines.pop() ?? '';
|
|
100
|
+
for (const line of lines) {
|
|
101
|
+
if (!line.trim())
|
|
102
|
+
continue;
|
|
103
|
+
try {
|
|
104
|
+
const data = JSON.parse(line);
|
|
105
|
+
const content = data.message?.content ?? '';
|
|
106
|
+
const isDone = data.done === true;
|
|
107
|
+
if (content || isDone) {
|
|
108
|
+
yield { content, done: isDone };
|
|
109
|
+
}
|
|
110
|
+
if (isDone)
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Skip unparseable lines
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
reader.releaseLock();
|
|
121
|
+
}
|
|
122
|
+
yield { content: '', done: true };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* List available models from the local Ollama instance.
|
|
126
|
+
*/
|
|
127
|
+
async listModels() {
|
|
128
|
+
try {
|
|
129
|
+
const response = await fetch(`${this.baseUrl}/api/tags`);
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
throw new ProviderError(`Failed to list Ollama models: ${response.status}`, { provider: 'ollama', status: response.status });
|
|
132
|
+
}
|
|
133
|
+
const data = await response.json();
|
|
134
|
+
const models = data.models ?? [];
|
|
135
|
+
return models.map((m) => ({
|
|
136
|
+
id: String(m.name ?? m.model ?? ''),
|
|
137
|
+
name: String(m.name ?? m.model ?? 'Unknown'),
|
|
138
|
+
provider: 'ollama',
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
if (err instanceof ProviderError)
|
|
143
|
+
throw err;
|
|
144
|
+
throw new ProviderError(`Failed to connect to Ollama at ${this.baseUrl}: ${err instanceof Error ? err.message : String(err)}`, { provider: 'ollama', baseUrl: this.baseUrl });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Validate that Ollama is running and reachable.
|
|
149
|
+
*/
|
|
150
|
+
async validateConnection() {
|
|
151
|
+
try {
|
|
152
|
+
const response = await fetch(`${this.baseUrl}/api/tags`);
|
|
153
|
+
return response.ok;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// ── Private helpers ──
|
|
160
|
+
prepareMessages(messages, options) {
|
|
161
|
+
const result = [];
|
|
162
|
+
// Add system prompt if provided via options
|
|
163
|
+
if (options?.systemPrompt) {
|
|
164
|
+
result.push({ role: 'system', content: options.systemPrompt });
|
|
165
|
+
}
|
|
166
|
+
for (const msg of messages) {
|
|
167
|
+
result.push({ role: msg.role, content: msg.content });
|
|
168
|
+
}
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
async request(path, body, retries = 2) {
|
|
172
|
+
let response;
|
|
173
|
+
let lastError;
|
|
174
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
175
|
+
try {
|
|
176
|
+
response = await fetch(`${this.baseUrl}${path}`, {
|
|
177
|
+
method: 'POST',
|
|
178
|
+
headers: { 'Content-Type': 'application/json' },
|
|
179
|
+
body: JSON.stringify(body),
|
|
180
|
+
signal: AbortSignal.timeout(300_000), // 5 minute timeout
|
|
181
|
+
});
|
|
182
|
+
// Success — continue to response handling below
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
lastError = err;
|
|
187
|
+
if (attempt < retries) {
|
|
188
|
+
logger.debug(`Ollama request failed (attempt ${attempt + 1}/${retries + 1}), retrying...`);
|
|
189
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
throw new ProviderError(`Failed to connect to Ollama at ${this.baseUrl}: ${err instanceof Error ? err.message : String(err)}`, { provider: 'ollama', baseUrl: this.baseUrl });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// TypeScript needs this — response is always assigned if we reach here
|
|
196
|
+
response = response;
|
|
197
|
+
if (!response.ok) {
|
|
198
|
+
const errorBody = await response.text();
|
|
199
|
+
throw new ProviderError(`Ollama API error: ${response.status} ${response.statusText}`, { status: response.status, body: errorBody, provider: 'ollama' });
|
|
200
|
+
}
|
|
201
|
+
return response.json();
|
|
202
|
+
}
|
|
203
|
+
extractUsage(response) {
|
|
204
|
+
return {
|
|
205
|
+
promptTokens: response.prompt_eval_count ?? 0,
|
|
206
|
+
completionTokens: response.eval_count ?? 0,
|
|
207
|
+
totalTokens: (response.prompt_eval_count ?? 0) + (response.eval_count ?? 0),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry — factory that creates the correct provider from config.
|
|
3
|
+
*
|
|
4
|
+
* New providers are added by:
|
|
5
|
+
* 1. Create the adapter file in src/providers/
|
|
6
|
+
* 2. Register it in the PROVIDER_FACTORIES map below
|
|
7
|
+
* 3. Add the name to LLMProviderName type in types.ts
|
|
8
|
+
*
|
|
9
|
+
* Dependency direction: registry.ts → types.ts, anthropic.ts, ollama.ts, errors.ts
|
|
10
|
+
* Used by: workflow engine, CLI doctor command
|
|
11
|
+
*/
|
|
12
|
+
import type { LLMProvider, LLMProviderName } from './types.js';
|
|
13
|
+
import type { ProviderConfig } from '../core/config/types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Create (or return cached) a provider instance by name.
|
|
16
|
+
*
|
|
17
|
+
* @param name - The provider name ('anthropic' | 'ollama')
|
|
18
|
+
* @param config - The providers section of the app config
|
|
19
|
+
* @returns An LLMProvider instance
|
|
20
|
+
* @throws {ProviderError} if the provider name is unknown or config is missing
|
|
21
|
+
*/
|
|
22
|
+
export declare function createProvider(name: LLMProviderName, config: ProviderConfig): LLMProvider;
|
|
23
|
+
/**
|
|
24
|
+
* Clear the provider cache (useful for testing or config changes).
|
|
25
|
+
*/
|
|
26
|
+
export declare function clearProviderCache(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Get all supported provider names.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getSupportedProviders(): LLMProviderName[];
|
|
31
|
+
/**
|
|
32
|
+
* Validate all configured providers can connect.
|
|
33
|
+
* Returns a map of provider name → connection status.
|
|
34
|
+
*/
|
|
35
|
+
export declare function validateAllProviders(config: ProviderConfig): Promise<Record<string, boolean>>;
|
|
36
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AA6B9D;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,GAAG,WAAW,CAiBzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,EAAE,CAEzD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAmBlC"}
|