darwin-agents 0.4.9 → 0.5.0-alpha.2
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/CHANGELOG.md +85 -0
- package/dist/agents/analyst.d.ts +11 -0
- package/dist/agents/analyst.d.ts.map +1 -0
- package/dist/agents/analyst.js +78 -0
- package/dist/agents/analyst.js.map +1 -0
- package/dist/agents/blog-writer.d.ts +13 -0
- package/dist/agents/blog-writer.d.ts.map +1 -0
- package/dist/agents/blog-writer.js +59 -0
- package/dist/agents/blog-writer.js.map +1 -0
- package/dist/agents/critic.d.ts +11 -0
- package/dist/agents/critic.d.ts.map +1 -0
- package/dist/agents/critic.js +57 -0
- package/dist/agents/critic.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +31 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/investigator-critic.d.ts +10 -0
- package/dist/agents/investigator-critic.d.ts.map +1 -0
- package/dist/agents/investigator-critic.js +78 -0
- package/dist/agents/investigator-critic.js.map +1 -0
- package/dist/agents/investigator.d.ts +13 -0
- package/dist/agents/investigator.d.ts.map +1 -0
- package/dist/agents/investigator.js +105 -0
- package/dist/agents/investigator.js.map +1 -0
- package/dist/agents/marketing.d.ts +13 -0
- package/dist/agents/marketing.d.ts.map +1 -0
- package/dist/agents/marketing.js +59 -0
- package/dist/agents/marketing.js.map +1 -0
- package/dist/agents/researcher.d.ts +11 -0
- package/dist/agents/researcher.d.ts.map +1 -0
- package/dist/agents/researcher.js +68 -0
- package/dist/agents/researcher.js.map +1 -0
- package/dist/agents/writer.d.ts +9 -0
- package/dist/agents/writer.d.ts.map +1 -0
- package/dist/agents/writer.js +47 -0
- package/dist/agents/writer.js.map +1 -0
- package/dist/cli/create.d.ts +11 -0
- package/dist/cli/create.d.ts.map +1 -0
- package/dist/cli/create.js +104 -0
- package/dist/cli/create.js.map +1 -0
- package/dist/cli/evolve.d.ts +13 -0
- package/dist/cli/evolve.d.ts.map +1 -0
- package/dist/cli/evolve.js +69 -0
- package/dist/cli/evolve.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +84 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +12 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +68 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/run.d.ts +7 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +371 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/status.d.ts +7 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +123 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/core/agent.d.ts +53 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +172 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/runner.d.ts +75 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +255 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/evolution/loop.d.ts +100 -0
- package/dist/evolution/loop.d.ts.map +1 -0
- package/dist/evolution/loop.js +424 -0
- package/dist/evolution/loop.js.map +1 -0
- package/dist/evolution/multi-critic.d.ts +58 -0
- package/dist/evolution/multi-critic.d.ts.map +1 -0
- package/dist/evolution/multi-critic.js +326 -0
- package/dist/evolution/multi-critic.js.map +1 -0
- package/dist/evolution/notifications.d.ts +32 -0
- package/dist/evolution/notifications.d.ts.map +1 -0
- package/dist/evolution/notifications.js +92 -0
- package/dist/evolution/notifications.js.map +1 -0
- package/dist/evolution/optimizer.d.ts +64 -0
- package/dist/evolution/optimizer.d.ts.map +1 -0
- package/dist/evolution/optimizer.js +223 -0
- package/dist/evolution/optimizer.js.map +1 -0
- package/dist/evolution/patterns.d.ts +63 -0
- package/dist/evolution/patterns.d.ts.map +1 -0
- package/dist/evolution/patterns.js +297 -0
- package/dist/evolution/patterns.js.map +1 -0
- package/dist/evolution/safety.d.ts +76 -0
- package/dist/evolution/safety.d.ts.map +1 -0
- package/dist/evolution/safety.js +182 -0
- package/dist/evolution/safety.js.map +1 -0
- package/dist/evolution/tracker.d.ts +48 -0
- package/dist/evolution/tracker.d.ts.map +1 -0
- package/dist/evolution/tracker.js +163 -0
- package/dist/evolution/tracker.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +49 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/postgres-memory.d.ts +52 -0
- package/dist/memory/postgres-memory.d.ts.map +1 -0
- package/dist/memory/postgres-memory.js +515 -0
- package/dist/memory/postgres-memory.js.map +1 -0
- package/dist/memory/sqlite-memory.d.ts +36 -0
- package/dist/memory/sqlite-memory.d.ts.map +1 -0
- package/dist/memory/sqlite-memory.js +380 -0
- package/dist/memory/sqlite-memory.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +82 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/claude-cli.d.ts +35 -0
- package/dist/providers/claude-cli.d.ts.map +1 -0
- package/dist/providers/claude-cli.js +153 -0
- package/dist/providers/claude-cli.js.map +1 -0
- package/dist/providers/index.d.ts +39 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +58 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +17 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +64 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +75 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +62 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +9 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/src/core/trace-capture.d.ts +107 -0
- package/dist/src/core/trace-capture.d.ts.map +1 -0
- package/dist/src/core/trace-capture.js +183 -0
- package/dist/src/core/trace-capture.js.map +1 -0
- package/dist/src/evolution/optimizer-gepa.d.ts +149 -0
- package/dist/src/evolution/optimizer-gepa.d.ts.map +1 -0
- package/dist/src/evolution/optimizer-gepa.js +198 -0
- package/dist/src/evolution/optimizer-gepa.js.map +1 -0
- package/dist/src/evolution/pareto.d.ts +116 -0
- package/dist/src/evolution/pareto.d.ts.map +1 -0
- package/dist/src/evolution/pareto.js +140 -0
- package/dist/src/evolution/pareto.js.map +1 -0
- package/dist/src/evolution/reflector.d.ts +107 -0
- package/dist/src/evolution/reflector.d.ts.map +1 -0
- package/dist/src/evolution/reflector.js +158 -0
- package/dist/src/evolution/reflector.js.map +1 -0
- package/dist/src/evolution/run-prompt-fn.d.ts +11 -0
- package/dist/src/evolution/run-prompt-fn.d.ts.map +1 -0
- package/dist/src/evolution/run-prompt-fn.js +11 -0
- package/dist/src/evolution/run-prompt-fn.js.map +1 -0
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory/postgres-memory.d.ts.map +1 -1
- package/dist/src/memory/postgres-memory.js +38 -3
- package/dist/src/memory/postgres-memory.js.map +1 -1
- package/dist/src/memory/sqlite-memory.d.ts.map +1 -1
- package/dist/src/memory/sqlite-memory.js +47 -2
- package/dist/src/memory/sqlite-memory.js.map +1 -1
- package/dist/src/types.d.ts +136 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/types.d.ts +221 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Claude CLI Provider
|
|
3
|
+
*
|
|
4
|
+
* Spawns `claude` CLI as a child process.
|
|
5
|
+
* The only provider that supports MCP tool use (via --mcp-config).
|
|
6
|
+
* Slower than direct API but enables full tool-augmented agents.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from 'node:child_process';
|
|
9
|
+
const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
|
|
10
|
+
export class ClaudeCliProvider {
|
|
11
|
+
name = 'claude-cli';
|
|
12
|
+
supportsMcp = true;
|
|
13
|
+
defaultModel;
|
|
14
|
+
/** Stashed CLI-specific options — set before run() via setRunOptions() */
|
|
15
|
+
runOptions = {};
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;
|
|
18
|
+
}
|
|
19
|
+
/** Set CLI-specific options for the next run (MCP, tools, etc.) */
|
|
20
|
+
setRunOptions(opts) {
|
|
21
|
+
this.runOptions = opts;
|
|
22
|
+
}
|
|
23
|
+
async run(options) {
|
|
24
|
+
const MAX_RETRIES = 2;
|
|
25
|
+
const MIN_VALID_CHARS = 50;
|
|
26
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
27
|
+
const result = await this.executeOnce(options);
|
|
28
|
+
if (result.output.trim().length >= MIN_VALID_CHARS) {
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
if (attempt < MAX_RETRIES) {
|
|
32
|
+
const delay = 1000 * (attempt + 1);
|
|
33
|
+
console.warn(`[claude-cli] Attempt ${attempt + 1} produced ${result.output.length} chars. Retrying in ${delay}ms...`);
|
|
34
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
return result; // All retries exhausted
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// TypeScript: unreachable but needed for return type
|
|
41
|
+
throw new Error('Unreachable');
|
|
42
|
+
}
|
|
43
|
+
async executeOnce(options) {
|
|
44
|
+
const model = options.model ?? this.defaultModel;
|
|
45
|
+
const timeout = options.timeout ?? 600_000;
|
|
46
|
+
const opts = this.runOptions;
|
|
47
|
+
// Build CLI args
|
|
48
|
+
const args = [
|
|
49
|
+
'-p',
|
|
50
|
+
'--output-format', 'text',
|
|
51
|
+
'--model', model,
|
|
52
|
+
'--max-turns', String(opts.maxTurns ?? 10),
|
|
53
|
+
];
|
|
54
|
+
// MCP config
|
|
55
|
+
if (opts.agent && opts.darwinConfig) {
|
|
56
|
+
const mcpConfig = buildMcpConfig(opts.agent, opts.darwinConfig);
|
|
57
|
+
if (mcpConfig) {
|
|
58
|
+
args.push('--mcp-config', mcpConfig);
|
|
59
|
+
}
|
|
60
|
+
const allowedTools = buildAllowedTools(opts.agent, opts.darwinConfig);
|
|
61
|
+
if (allowedTools) {
|
|
62
|
+
args.push('--allowedTools', allowedTools);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (opts.autonomous) {
|
|
66
|
+
args.push('--permission-mode', 'bypassPermissions');
|
|
67
|
+
}
|
|
68
|
+
// Combine system prompt + task as stdin
|
|
69
|
+
const stdin = `${options.systemPrompt}\n\n---\n\nTask: ${options.userMessage}`;
|
|
70
|
+
const startTime = Date.now();
|
|
71
|
+
// Spawn claude CLI
|
|
72
|
+
const output = await new Promise((resolve, reject) => {
|
|
73
|
+
const cleanEnv = { ...process.env };
|
|
74
|
+
delete cleanEnv.CLAUDECODE;
|
|
75
|
+
// CRITICAL: By default, strip Anthropic API credentials so the spawned
|
|
76
|
+
// Claude CLI uses the user's paid subscription (Claude Pro / Max)
|
|
77
|
+
// instead of billing against the API key environment variables.
|
|
78
|
+
// Without this, users with ANTHROPIC_API_KEY in their shell get
|
|
79
|
+
// surprise-billed for every single Darwin run at full API rates.
|
|
80
|
+
// Opt back in for CI / server-side usage with DARWIN_USE_API_KEY=1.
|
|
81
|
+
if (process.env.DARWIN_USE_API_KEY !== '1') {
|
|
82
|
+
delete cleanEnv.ANTHROPIC_API_KEY;
|
|
83
|
+
delete cleanEnv.ANTHROPIC_AUTH_TOKEN;
|
|
84
|
+
}
|
|
85
|
+
const child = spawn('claude', args, {
|
|
86
|
+
cwd: opts.cwd ?? process.cwd(),
|
|
87
|
+
stdio: ['pipe', 'pipe', 'inherit'],
|
|
88
|
+
timeout,
|
|
89
|
+
env: cleanEnv,
|
|
90
|
+
});
|
|
91
|
+
const chunks = [];
|
|
92
|
+
child.stdout.on('data', (chunk) => {
|
|
93
|
+
chunks.push(chunk);
|
|
94
|
+
});
|
|
95
|
+
child.stdin.write(stdin);
|
|
96
|
+
child.stdin.end();
|
|
97
|
+
child.on('close', (code) => {
|
|
98
|
+
const result = Buffer.concat(chunks).toString('utf-8');
|
|
99
|
+
if (code === 0) {
|
|
100
|
+
resolve(result);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
reject(new Error(`Claude CLI exited with code ${String(code)}: ${result.slice(0, 500)}`));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
child.on('error', (err) => {
|
|
107
|
+
reject(new Error(`Failed to spawn Claude CLI: ${err.message}`));
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
const durationMs = Date.now() - startTime;
|
|
111
|
+
return {
|
|
112
|
+
output,
|
|
113
|
+
durationMs,
|
|
114
|
+
model,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// ─── Helpers (extracted from runner.ts) ───────────
|
|
119
|
+
function buildMcpConfig(agent, config) {
|
|
120
|
+
if (!agent.mcp || agent.mcp.length === 0 || !config.mcp) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const mcpServers = {};
|
|
124
|
+
let hasServers = false;
|
|
125
|
+
for (const serverName of agent.mcp) {
|
|
126
|
+
const serverConfig = config.mcp[serverName];
|
|
127
|
+
if (serverConfig) {
|
|
128
|
+
mcpServers[serverName] = {
|
|
129
|
+
type: 'stdio',
|
|
130
|
+
command: serverConfig.command,
|
|
131
|
+
args: serverConfig.args,
|
|
132
|
+
...(serverConfig.env ? { env: serverConfig.env } : {}),
|
|
133
|
+
};
|
|
134
|
+
hasServers = true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return hasServers ? JSON.stringify({ mcpServers }) : null;
|
|
138
|
+
}
|
|
139
|
+
function buildAllowedTools(agent, config) {
|
|
140
|
+
const patterns = [];
|
|
141
|
+
if (agent.mcp && agent.mcp.length > 0 && config.mcp) {
|
|
142
|
+
for (const serverName of agent.mcp) {
|
|
143
|
+
if (config.mcp[serverName]) {
|
|
144
|
+
patterns.push(`mcp__${serverName}__*`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (agent.tools && agent.tools.length > 0) {
|
|
149
|
+
patterns.push(...agent.tools);
|
|
150
|
+
}
|
|
151
|
+
return patterns.length > 0 ? patterns.join(',') : null;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=claude-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../src/providers/claude-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates the appropriate LLM provider based on configuration.
|
|
5
|
+
* Supports: claude-cli, anthropic-api, openai, ollama.
|
|
6
|
+
*/
|
|
7
|
+
export type { LLMProvider, LLMCallOptions, LLMCallResult, ProviderConfig } from './types.js';
|
|
8
|
+
export { ClaudeCliProvider } from './claude-cli.js';
|
|
9
|
+
export type { ClaudeCliRunOptions } from './claude-cli.js';
|
|
10
|
+
export { AnthropicProvider } from './anthropic.js';
|
|
11
|
+
export { OpenAIProvider } from './openai.js';
|
|
12
|
+
export { OllamaProvider } from './ollama.js';
|
|
13
|
+
import type { LLMProvider, ProviderConfig } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Create an LLM provider from configuration.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // Anthropic API (fastest for non-MCP agents)
|
|
20
|
+
* const provider = createProvider({ type: 'anthropic-api' });
|
|
21
|
+
*
|
|
22
|
+
* // OpenAI-compatible (GPT-4o, Together AI, Groq, etc.)
|
|
23
|
+
* const provider = createProvider({
|
|
24
|
+
* type: 'openai',
|
|
25
|
+
* baseUrl: 'https://api.together.xyz/v1',
|
|
26
|
+
* defaultModel: 'meta-llama/Llama-3.1-70B-Instruct-Turbo',
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Ollama (local, free, offline)
|
|
30
|
+
* const provider = createProvider({ type: 'ollama', defaultModel: 'llama3.1' });
|
|
31
|
+
*
|
|
32
|
+
* // Claude CLI (only option for MCP-enabled agents)
|
|
33
|
+
* const provider = createProvider({ type: 'claude-cli' });
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function createProvider(config: ProviderConfig): LLMProvider;
|
|
37
|
+
/** Default model names per provider */
|
|
38
|
+
export declare const DEFAULT_MODELS: Record<ProviderConfig['type'], string>;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM9D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAalE;AAED,uCAAuC;AACvC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,CAKjE,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates the appropriate LLM provider based on configuration.
|
|
5
|
+
* Supports: claude-cli, anthropic-api, openai, ollama.
|
|
6
|
+
*/
|
|
7
|
+
export { ClaudeCliProvider } from './claude-cli.js';
|
|
8
|
+
export { AnthropicProvider } from './anthropic.js';
|
|
9
|
+
export { OpenAIProvider } from './openai.js';
|
|
10
|
+
export { OllamaProvider } from './ollama.js';
|
|
11
|
+
import { ClaudeCliProvider } from './claude-cli.js';
|
|
12
|
+
import { AnthropicProvider } from './anthropic.js';
|
|
13
|
+
import { OpenAIProvider } from './openai.js';
|
|
14
|
+
import { OllamaProvider } from './ollama.js';
|
|
15
|
+
/**
|
|
16
|
+
* Create an LLM provider from configuration.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* // Anthropic API (fastest for non-MCP agents)
|
|
21
|
+
* const provider = createProvider({ type: 'anthropic-api' });
|
|
22
|
+
*
|
|
23
|
+
* // OpenAI-compatible (GPT-4o, Together AI, Groq, etc.)
|
|
24
|
+
* const provider = createProvider({
|
|
25
|
+
* type: 'openai',
|
|
26
|
+
* baseUrl: 'https://api.together.xyz/v1',
|
|
27
|
+
* defaultModel: 'meta-llama/Llama-3.1-70B-Instruct-Turbo',
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // Ollama (local, free, offline)
|
|
31
|
+
* const provider = createProvider({ type: 'ollama', defaultModel: 'llama3.1' });
|
|
32
|
+
*
|
|
33
|
+
* // Claude CLI (only option for MCP-enabled agents)
|
|
34
|
+
* const provider = createProvider({ type: 'claude-cli' });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function createProvider(config) {
|
|
38
|
+
switch (config.type) {
|
|
39
|
+
case 'claude-cli':
|
|
40
|
+
return new ClaudeCliProvider(config);
|
|
41
|
+
case 'anthropic-api':
|
|
42
|
+
return new AnthropicProvider(config);
|
|
43
|
+
case 'openai':
|
|
44
|
+
return new OpenAIProvider(config);
|
|
45
|
+
case 'ollama':
|
|
46
|
+
return new OllamaProvider(config);
|
|
47
|
+
default:
|
|
48
|
+
throw new Error(`Unknown provider type: ${String(config.type)}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Default model names per provider */
|
|
52
|
+
export const DEFAULT_MODELS = {
|
|
53
|
+
'claude-cli': 'claude-sonnet-4-20250514',
|
|
54
|
+
'anthropic-api': 'claude-sonnet-4-20250514',
|
|
55
|
+
'openai': 'gpt-5.4',
|
|
56
|
+
'ollama': 'llama3.1',
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,eAAe;YAClB,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAE,MAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,MAAM,cAAc,GAA2C;IACpE,YAAY,EAAE,0BAA0B;IACxC,eAAe,EAAE,0BAA0B;IAC3C,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,UAAU;CACrB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Ollama Provider
|
|
3
|
+
*
|
|
4
|
+
* Local LLM inference via Ollama's API.
|
|
5
|
+
* Perfect for development, testing, and cost-free experimentation.
|
|
6
|
+
* No API key needed — runs locally.
|
|
7
|
+
*/
|
|
8
|
+
import type { LLMCallOptions, LLMCallResult, LLMProvider, ProviderConfig } from './types.js';
|
|
9
|
+
export declare class OllamaProvider implements LLMProvider {
|
|
10
|
+
readonly name = "ollama";
|
|
11
|
+
readonly supportsMcp = false;
|
|
12
|
+
private baseUrl;
|
|
13
|
+
private defaultModel;
|
|
14
|
+
constructor(config: ProviderConfig);
|
|
15
|
+
run(options: LLMCallOptions): Promise<LLMCallResult>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmB7F,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,SAAS;IAE7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,cAAc;IAK5B,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAmD3D"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Ollama Provider
|
|
3
|
+
*
|
|
4
|
+
* Local LLM inference via Ollama's API.
|
|
5
|
+
* Perfect for development, testing, and cost-free experimentation.
|
|
6
|
+
* No API key needed — runs locally.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_BASE_URL = 'http://localhost:11434';
|
|
9
|
+
const DEFAULT_MODEL = 'llama3.1';
|
|
10
|
+
export class OllamaProvider {
|
|
11
|
+
name = 'ollama';
|
|
12
|
+
supportsMcp = false;
|
|
13
|
+
baseUrl;
|
|
14
|
+
defaultModel;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.baseUrl = (config.baseUrl ?? process.env.OLLAMA_BASE_URL ?? DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
17
|
+
this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;
|
|
18
|
+
}
|
|
19
|
+
async run(options) {
|
|
20
|
+
const model = options.model ?? this.defaultModel;
|
|
21
|
+
const timeout = options.timeout ?? 600_000; // 10 min for local models (slower)
|
|
22
|
+
const messages = [
|
|
23
|
+
{ role: 'system', content: options.systemPrompt },
|
|
24
|
+
{ role: 'user', content: options.userMessage },
|
|
25
|
+
];
|
|
26
|
+
const body = {
|
|
27
|
+
model,
|
|
28
|
+
messages,
|
|
29
|
+
stream: false,
|
|
30
|
+
...(options.temperature !== undefined ? { options: { temperature: options.temperature } } : {}),
|
|
31
|
+
};
|
|
32
|
+
const startTime = Date.now();
|
|
33
|
+
const controller = new AbortController();
|
|
34
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
35
|
+
try {
|
|
36
|
+
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify(body),
|
|
42
|
+
signal: controller.signal,
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
const errorText = await response.text();
|
|
46
|
+
throw new Error(`Ollama API error ${String(response.status)}: ${errorText}`);
|
|
47
|
+
}
|
|
48
|
+
const data = (await response.json());
|
|
49
|
+
const durationMs = Date.now() - startTime;
|
|
50
|
+
return {
|
|
51
|
+
output: data.message?.content ?? '',
|
|
52
|
+
durationMs,
|
|
53
|
+
inputTokens: data.prompt_eval_count,
|
|
54
|
+
outputTokens: data.eval_count,
|
|
55
|
+
model: data.model,
|
|
56
|
+
meta: data.total_duration ? { totalDurationNs: data.total_duration } : undefined,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
clearTimeout(timer);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# 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,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — OpenAI-Compatible Provider
|
|
3
|
+
*
|
|
4
|
+
* Works with OpenAI, Azure OpenAI, Together AI, Groq,
|
|
5
|
+
* and any other OpenAI-compatible API endpoint.
|
|
6
|
+
* No SDK dependency — uses native fetch (Node 20+).
|
|
7
|
+
*/
|
|
8
|
+
import type { LLMCallOptions, LLMCallResult, LLMProvider, ProviderConfig } from './types.js';
|
|
9
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
10
|
+
readonly name = "openai";
|
|
11
|
+
readonly supportsMcp = false;
|
|
12
|
+
private apiKey;
|
|
13
|
+
private baseUrl;
|
|
14
|
+
private defaultModel;
|
|
15
|
+
private defaultMaxTokens;
|
|
16
|
+
constructor(config: ProviderConfig);
|
|
17
|
+
run(options: LLMCallOptions): Promise<LLMCallResult>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA2B7F,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,SAAS;IAE7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,cAAc;IAW5B,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAsD3D"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — OpenAI-Compatible Provider
|
|
3
|
+
*
|
|
4
|
+
* Works with OpenAI, Azure OpenAI, Together AI, Groq,
|
|
5
|
+
* and any other OpenAI-compatible API endpoint.
|
|
6
|
+
* No SDK dependency — uses native fetch (Node 20+).
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_BASE_URL = 'https://api.openai.com/v1';
|
|
9
|
+
const DEFAULT_MODEL = 'gpt-5.4';
|
|
10
|
+
const DEFAULT_MAX_TOKENS = 8192;
|
|
11
|
+
export class OpenAIProvider {
|
|
12
|
+
name = 'openai';
|
|
13
|
+
supportsMcp = false;
|
|
14
|
+
apiKey;
|
|
15
|
+
baseUrl;
|
|
16
|
+
defaultModel;
|
|
17
|
+
defaultMaxTokens;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
const key = config.apiKey ?? process.env.OPENAI_API_KEY;
|
|
20
|
+
if (!key) {
|
|
21
|
+
throw new Error('OpenAI API key required. Set OPENAI_API_KEY or pass apiKey in config.');
|
|
22
|
+
}
|
|
23
|
+
this.apiKey = key;
|
|
24
|
+
this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
25
|
+
this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;
|
|
26
|
+
this.defaultMaxTokens = config.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;
|
|
27
|
+
}
|
|
28
|
+
async run(options) {
|
|
29
|
+
const model = options.model ?? this.defaultModel;
|
|
30
|
+
const maxTokens = options.maxTokens ?? this.defaultMaxTokens;
|
|
31
|
+
const timeout = options.timeout ?? 300_000;
|
|
32
|
+
const messages = [
|
|
33
|
+
{ role: 'system', content: options.systemPrompt },
|
|
34
|
+
{ role: 'user', content: options.userMessage },
|
|
35
|
+
];
|
|
36
|
+
const body = {
|
|
37
|
+
model,
|
|
38
|
+
max_tokens: maxTokens,
|
|
39
|
+
messages,
|
|
40
|
+
...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
41
|
+
};
|
|
42
|
+
const startTime = Date.now();
|
|
43
|
+
const controller = new AbortController();
|
|
44
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
45
|
+
try {
|
|
46
|
+
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify(body),
|
|
53
|
+
signal: controller.signal,
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
const errorText = await response.text();
|
|
57
|
+
throw new Error(`OpenAI API error ${String(response.status)}: ${errorText}`);
|
|
58
|
+
}
|
|
59
|
+
const data = (await response.json());
|
|
60
|
+
const durationMs = Date.now() - startTime;
|
|
61
|
+
const output = data.choices[0]?.message?.content ?? '';
|
|
62
|
+
return {
|
|
63
|
+
output,
|
|
64
|
+
durationMs,
|
|
65
|
+
inputTokens: data.usage?.prompt_tokens,
|
|
66
|
+
outputTokens: data.usage?.completion_tokens,
|
|
67
|
+
model: data.model,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
clearTimeout(timer);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — LLM Provider Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstraction over different LLM backends.
|
|
5
|
+
* All providers implement the same interface so Darwin can
|
|
6
|
+
* swap models/providers without changing agent or evolution code.
|
|
7
|
+
*/
|
|
8
|
+
/** Options for a single LLM call */
|
|
9
|
+
export interface LLMCallOptions {
|
|
10
|
+
/** Model identifier (provider-specific, e.g. "claude-sonnet-4-20250514") */
|
|
11
|
+
model: string;
|
|
12
|
+
/** System prompt (role/behavior instructions) */
|
|
13
|
+
systemPrompt: string;
|
|
14
|
+
/** User message (the task) */
|
|
15
|
+
userMessage: string;
|
|
16
|
+
/** Max output tokens (default: provider-dependent) */
|
|
17
|
+
maxTokens?: number;
|
|
18
|
+
/** Temperature (0-1, default: provider-dependent) */
|
|
19
|
+
temperature?: number;
|
|
20
|
+
/** Timeout in milliseconds */
|
|
21
|
+
timeout?: number;
|
|
22
|
+
}
|
|
23
|
+
/** Result from an LLM call */
|
|
24
|
+
export interface LLMCallResult {
|
|
25
|
+
/** The generated text output */
|
|
26
|
+
output: string;
|
|
27
|
+
/** Duration of the API call in milliseconds */
|
|
28
|
+
durationMs: number;
|
|
29
|
+
/** Input tokens used (if reported by provider) */
|
|
30
|
+
inputTokens?: number;
|
|
31
|
+
/** Output tokens used (if reported by provider) */
|
|
32
|
+
outputTokens?: number;
|
|
33
|
+
/** Model actually used (may differ from requested) */
|
|
34
|
+
model?: string;
|
|
35
|
+
/** Provider-specific metadata */
|
|
36
|
+
meta?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
/** LLM Provider — implemented by each backend */
|
|
39
|
+
export interface LLMProvider {
|
|
40
|
+
/** Provider name for logging */
|
|
41
|
+
readonly name: string;
|
|
42
|
+
/** Whether this provider supports MCP tool use */
|
|
43
|
+
readonly supportsMcp: boolean;
|
|
44
|
+
/** Run a single LLM call */
|
|
45
|
+
run(options: LLMCallOptions): Promise<LLMCallResult>;
|
|
46
|
+
}
|
|
47
|
+
/** Provider configuration */
|
|
48
|
+
export interface ProviderConfig {
|
|
49
|
+
/** Provider type */
|
|
50
|
+
type: 'claude-cli' | 'anthropic-api' | 'openai' | 'ollama';
|
|
51
|
+
/** API key (for anthropic, openai) */
|
|
52
|
+
apiKey?: string;
|
|
53
|
+
/** Base URL override (for openai-compatible, ollama) */
|
|
54
|
+
baseUrl?: string;
|
|
55
|
+
/** Default model for this provider */
|
|
56
|
+
defaultModel?: string;
|
|
57
|
+
/** Default max tokens */
|
|
58
|
+
defaultMaxTokens?: number;
|
|
59
|
+
/** Default temperature */
|
|
60
|
+
defaultTemperature?: number;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oCAAoC;AACpC,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,4BAA4B;IAC5B,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACtD;AAED,6BAA6B;AAC7B,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,IAAI,EAAE,YAAY,GAAG,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3D,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — LLM Provider Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstraction over different LLM backends.
|
|
5
|
+
* All providers implement the same interface so Darwin can
|
|
6
|
+
* swap models/providers without changing agent or evolution code.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Execution Trace Capture (v0.5 / A1)
|
|
3
|
+
*
|
|
4
|
+
* Pure, transport-agnostic capturer. Knows nothing about Anthropic SDK,
|
|
5
|
+
* Claude CLI, OpenAI, or any specific runtime — the runtime feeds events,
|
|
6
|
+
* the capturer aggregates into an ExecutionTrace.
|
|
7
|
+
*
|
|
8
|
+
* Three event types map to the three industry-standard span types
|
|
9
|
+
* (Braintrust + Langfuse + Strands SDK + OTEL GenAI 2026):
|
|
10
|
+
* - recordToolUse / recordToolResult → Tool spans
|
|
11
|
+
* - recordTextBlock → assistant prose counter (NOT thinking-block)
|
|
12
|
+
* - recordError → Turn-level errors
|
|
13
|
+
* - addTokens → aggregated LLM token usage
|
|
14
|
+
*
|
|
15
|
+
* Pairing rule: each `recordToolUse(id, ...)` MUST be paired with a later
|
|
16
|
+
* `recordToolResult(id, ...)` to compute durationMs. Unpaired uses get
|
|
17
|
+
* `durationMs > 0` (start-to-finalize) and `outcome = 'error'` at
|
|
18
|
+
* finalize-time with errorClass = 'unpaired_call' so we never silently
|
|
19
|
+
* drop hanging tools.
|
|
20
|
+
*
|
|
21
|
+
* Privacy + size: args are passed through as-is — caller's responsibility
|
|
22
|
+
* to truncate sensitive values. resultSummary is truncated to 2000 chars
|
|
23
|
+
* at recordToolResult-time. OTEL note: `gen_ai.tool.call.arguments` is
|
|
24
|
+
* Opt-In in the GenAI spec; Darwin's "always-capture args" stance is
|
|
25
|
+
* acceptable for internal use but MUST be documented when traces touch
|
|
26
|
+
* customer data (V2 will add a Redaction-Layer).
|
|
27
|
+
*
|
|
28
|
+
* Backwards-compat: capturer is opt-in. Existing code paths that don't
|
|
29
|
+
* instantiate it produce DarwinExperiment.trajectory === undefined and
|
|
30
|
+
* the rest of the system behaves identically to pre-A1.
|
|
31
|
+
*/
|
|
32
|
+
import type { ExecutionTrace, TraceTokenUsage } from '../types.js';
|
|
33
|
+
export interface TraceCapture {
|
|
34
|
+
/**
|
|
35
|
+
* Record the start of a tool call. `id` is the SDK's correlation id
|
|
36
|
+
* (Anthropic SDK `tool_use.id`, OpenAI `tool_call.id`, etc.) — used to
|
|
37
|
+
* pair the matching recordToolResult AND persisted on the captured
|
|
38
|
+
* TraceToolCall as `id` for OTEL `gen_ai.tool.call.id` mapping.
|
|
39
|
+
*/
|
|
40
|
+
recordToolUse(id: string, tool: string, args?: Record<string, unknown>): void;
|
|
41
|
+
/**
|
|
42
|
+
* Record the result of a previously-started tool call. If `id` was never
|
|
43
|
+
* passed to recordToolUse, the result is silently dropped (defensive —
|
|
44
|
+
* some SDKs emit tool_result for system tools without tool_use).
|
|
45
|
+
*/
|
|
46
|
+
recordToolResult(id: string, outcome: 'success' | 'error', opts?: {
|
|
47
|
+
resultSummary?: string;
|
|
48
|
+
errorClass?: string;
|
|
49
|
+
errorMessage?: string;
|
|
50
|
+
retryCount?: number;
|
|
51
|
+
}): void;
|
|
52
|
+
/** Mark the start of a new agent turn (1-indexed). Default starts at turn 1. */
|
|
53
|
+
startTurn(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Increment the text-block counter — one per substantial assistant
|
|
56
|
+
* text emission (>50 chars typically, but the caller decides the
|
|
57
|
+
* threshold). Renamed from `recordReasoning` after R1 review for
|
|
58
|
+
* accuracy: this counts ANY assistant prose, NOT only pre-action
|
|
59
|
+
* "thinking" blocks. Use `addTokens` for cost-of-reasoning attribution.
|
|
60
|
+
*/
|
|
61
|
+
recordTextBlock(): void;
|
|
62
|
+
/** Record a turn-level error (e.g. spawn failure, parse error, child crash). */
|
|
63
|
+
recordError(class_: string, message: string): void;
|
|
64
|
+
/**
|
|
65
|
+
* Accumulate LLM token usage into the trajectory aggregate. Call once
|
|
66
|
+
* per LLM round-trip with the usage object the SDK returned. Missing
|
|
67
|
+
* fields are treated as zero for summation. Existing aggregate fields
|
|
68
|
+
* are preserved (additive merge).
|
|
69
|
+
*/
|
|
70
|
+
addTokens(usage: TraceTokenUsage): void;
|
|
71
|
+
/**
|
|
72
|
+
* Build the final ExecutionTrace.
|
|
73
|
+
* Unpaired tool calls (recordToolUse without recordToolResult) get
|
|
74
|
+
* marked as outcome='error', errorClass='unpaired_call' so silent
|
|
75
|
+
* SDK hangs remain visible.
|
|
76
|
+
*/
|
|
77
|
+
finalize(): ExecutionTrace;
|
|
78
|
+
}
|
|
79
|
+
export interface TraceCaptureOptions {
|
|
80
|
+
/**
|
|
81
|
+
* Wallclock provider. Defaults to `Date.now`. Override for tests so
|
|
82
|
+
* durations are deterministic.
|
|
83
|
+
*/
|
|
84
|
+
now?: () => number;
|
|
85
|
+
/**
|
|
86
|
+
* Predicate that classifies a tool name as an MCP-server call (vs a
|
|
87
|
+
* built-in like Read/Bash). Default heuristic: starts with 'mcp__'.
|
|
88
|
+
* Used to populate `mcpInvocations` aggregate.
|
|
89
|
+
*/
|
|
90
|
+
isMcpTool?: (toolName: string) => boolean;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a fresh trace capturer.
|
|
94
|
+
*
|
|
95
|
+
* Usage:
|
|
96
|
+
* ```ts
|
|
97
|
+
* const trace = createTraceCapture();
|
|
98
|
+
* trace.startTurn();
|
|
99
|
+
* trace.recordToolUse('call_1', 'mcp__nex__search', { query: 'foo' });
|
|
100
|
+
* trace.recordToolResult('call_1', 'success', { resultSummary: '3 hits' });
|
|
101
|
+
* trace.recordTextBlock();
|
|
102
|
+
* trace.addTokens({ inputTokens: 1200, outputTokens: 340 });
|
|
103
|
+
* const trajectory = trace.finalize();
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export declare function createTraceCapture(opts?: TraceCaptureOptions): TraceCapture;
|
|
107
|
+
//# sourceMappingURL=trace-capture.d.ts.map
|