@curie-agent/providers 0.1.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.
@@ -0,0 +1,259 @@
1
+ import OpenAI from 'openai';
2
+ function effortToReasoning(effort) {
3
+ switch (effort) {
4
+ case 'low': return 'low';
5
+ case 'medium': return 'medium';
6
+ case 'high': return 'high';
7
+ case 'max': return 'high';
8
+ case 'auto':
9
+ default: return undefined;
10
+ }
11
+ }
12
+ const REASONING_MODEL_RE = /^(o1|o3)[-:]?(mini|medium|high|pro)?$/i;
13
+ function isReasoningModel(model) {
14
+ return REASONING_MODEL_RE.test(model);
15
+ }
16
+ export class OpenAIProvider {
17
+ name = 'openai';
18
+ models = [
19
+ 'gpt-4o',
20
+ 'gpt-4o-2024-11-20',
21
+ 'gpt-4o-mini',
22
+ 'gpt-4o-mini-2024-07-18',
23
+ 'o1',
24
+ 'o1-mini',
25
+ 'o1-preview',
26
+ 'o3-mini',
27
+ 'o3-mini-2025-01-31',
28
+ 'gpt-4-turbo',
29
+ ];
30
+ defaultModel = 'gpt-4o';
31
+ client;
32
+ constructor(apiKey, baseUrl) {
33
+ const resolvedKey = (apiKey && apiKey.length > 0)
34
+ ? apiKey
35
+ : process.env.OPENAI_API_KEY;
36
+ if (!resolvedKey) {
37
+ throw new Error('OpenAIProvider: no API key (pass explicitly or set OPENAI_API_KEY).');
38
+ }
39
+ this.client = new OpenAI({
40
+ apiKey: resolvedKey,
41
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
42
+ });
43
+ }
44
+ stream(args) {
45
+ const self = this;
46
+ const model = args.model || this.defaultModel;
47
+ const modelIsReasoning = isReasoningModel(model);
48
+ const reasoningEffort = effortToReasoning(args.effort);
49
+ const maxTokens = modelIsReasoning
50
+ ? args.maxTokens ?? 16_384
51
+ : args.maxTokens;
52
+ const messages = this.mapMessages(args.messages);
53
+ const tools = args.tools ? this.mapTools(args.tools) : undefined;
54
+ const allMessages = args.system
55
+ ? [{ role: 'system', content: args.system }, ...messages]
56
+ : messages;
57
+ const streamParams = {
58
+ model,
59
+ messages: allMessages,
60
+ stream: true,
61
+ ...(tools ? { tools } : {}),
62
+ ...(args.temperature !== undefined ? { temperature: args.temperature } : {}),
63
+ ...(maxTokens ? { max_completion_tokens: maxTokens } : {}),
64
+ ...(modelIsReasoning && reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),
65
+ stream_options: { include_usage: true },
66
+ };
67
+ let sdkStream = null;
68
+ async function* generator() {
69
+ sdkStream = await self.client.chat.completions.create(streamParams);
70
+ const pendingTools = new Map();
71
+ let lastUsage = null;
72
+ if (!sdkStream)
73
+ return;
74
+ for await (const chunk of sdkStream) {
75
+ if (args.signal?.aborted) {
76
+ break;
77
+ }
78
+ if (chunk.usage) {
79
+ lastUsage = chunk.usage;
80
+ }
81
+ const choice = chunk.choices?.[0];
82
+ if (!choice)
83
+ continue;
84
+ // Text deltas
85
+ if (choice.delta?.content) {
86
+ yield { type: 'text-delta', text: choice.delta.content };
87
+ }
88
+ // Tool call deltas
89
+ if (choice.delta?.tool_calls) {
90
+ for (const tc of choice.delta.tool_calls) {
91
+ const idx = tc.index ?? 0;
92
+ if (tc.id) {
93
+ pendingTools.set(idx, { id: tc.id, name: tc.function?.name ?? '', inputStr: '' });
94
+ }
95
+ const pending = pendingTools.get(idx);
96
+ if (pending) {
97
+ pending.inputStr += tc.function?.arguments ?? '';
98
+ }
99
+ }
100
+ }
101
+ }
102
+ // Resolve any pending tool calls
103
+ for (const [, pending] of pendingTools) {
104
+ let input = {};
105
+ try {
106
+ if (pending.inputStr) {
107
+ input = JSON.parse(pending.inputStr);
108
+ }
109
+ }
110
+ catch { /* empty input on parse failure */ }
111
+ yield { type: 'tool-call', id: pending.id, name: pending.name, input };
112
+ }
113
+ // Emit usage
114
+ if (lastUsage) {
115
+ yield {
116
+ type: 'usage',
117
+ inputTokens: lastUsage.prompt_tokens ?? 0,
118
+ outputTokens: lastUsage.completion_tokens ?? 0,
119
+ };
120
+ }
121
+ yield { type: 'stop', reason: args.signal?.aborted ? 'aborted' : 'stop' };
122
+ }
123
+ return {
124
+ iterable: generator(),
125
+ cancel() {
126
+ // The OpenAI Node.js SDK doesn't expose a public cancel method on the
127
+ // async iterable. The signal.aborted check inside the generator loop
128
+ // will break on the next iteration, but there's no way to
129
+ // synchronously abort the underlying HTTP request.
130
+ // The abort signal is still passed through streamParams, so the SDK
131
+ // may honor it internally.
132
+ },
133
+ };
134
+ }
135
+ async check(prompt, args) {
136
+ const model = args?.model || this.defaultModel;
137
+ const messages = [
138
+ { role: 'user', content: prompt },
139
+ ];
140
+ if (args?.system) {
141
+ messages.unshift({ role: 'system', content: args.system });
142
+ }
143
+ const response = await this.client.chat.completions.create({
144
+ model,
145
+ messages,
146
+ max_tokens: 256,
147
+ temperature: 0,
148
+ });
149
+ return response.choices[0]?.message?.content?.trim() ?? '';
150
+ }
151
+ async complete(args) {
152
+ const model = args.model || this.defaultModel;
153
+ const modelIsReasoning = isReasoningModel(model);
154
+ const reasoningEffort = effortToReasoning(args.effort);
155
+ const maxTokens = modelIsReasoning
156
+ ? args.maxTokens ?? 16_384
157
+ : args.maxTokens;
158
+ const messages = this.mapMessages(args.messages);
159
+ const tools = args.tools ? this.mapTools(args.tools) : undefined;
160
+ const allMessages = args.system
161
+ ? [{ role: 'system', content: args.system }, ...messages]
162
+ : messages;
163
+ const response = await this.client.chat.completions.create({
164
+ model,
165
+ messages: allMessages,
166
+ stream: false,
167
+ ...(tools ? { tools } : {}),
168
+ ...(args.temperature !== undefined ? { temperature: args.temperature } : {}),
169
+ ...(maxTokens ? { max_completion_tokens: maxTokens } : {}),
170
+ ...(modelIsReasoning && reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),
171
+ stream_options: { include_usage: true },
172
+ });
173
+ const choice = response.choices[0];
174
+ const text = choice?.message?.content ?? '';
175
+ const toolCalls = choice?.message?.tool_calls?.map(tc => {
176
+ let input = {};
177
+ try {
178
+ if (tc.function?.arguments) {
179
+ input = JSON.parse(tc.function.arguments);
180
+ }
181
+ }
182
+ catch { /* empty input on parse failure */ }
183
+ return {
184
+ id: tc.id ?? '',
185
+ name: tc.function?.name ?? '',
186
+ input,
187
+ };
188
+ }).filter(tc => tc.id) ?? [];
189
+ const usage = response.usage
190
+ ? { inputTokens: response.usage.prompt_tokens, outputTokens: response.usage.completion_tokens }
191
+ : undefined;
192
+ return {
193
+ text: text.trim(),
194
+ stopReason: (choice?.finish_reason === 'stop' || choice?.finish_reason === 'function_call')
195
+ ? 'stop'
196
+ : choice?.finish_reason === 'tool_calls'
197
+ ? 'tool_use'
198
+ : choice?.finish_reason === 'length'
199
+ ? 'length'
200
+ : choice?.finish_reason === 'content_filter'
201
+ ? 'content_filter'
202
+ : 'stop',
203
+ usage,
204
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
205
+ };
206
+ }
207
+ mapMessages(messages) {
208
+ return messages.map((m) => {
209
+ if (m.role === 'tool') {
210
+ return {
211
+ role: 'tool',
212
+ content: m.content,
213
+ tool_call_id: m.toolUseId,
214
+ };
215
+ }
216
+ if (typeof m.content === 'string') {
217
+ return { role: m.role, content: m.content };
218
+ }
219
+ if (Array.isArray(m.content) && m.role === 'user') {
220
+ const textParts = m.content
221
+ .filter((c) => c.type === 'text')
222
+ .map(c => c.text);
223
+ return { role: 'user', content: textParts.join('\n') };
224
+ }
225
+ if (Array.isArray(m.content) && m.role === 'assistant') {
226
+ const textParts = m.content
227
+ .filter((c) => c.type === 'text')
228
+ .map(c => c.text);
229
+ const toolCalls = m.content
230
+ .filter((c) => c.type === 'tool-use')
231
+ .map(c => ({
232
+ id: c.id,
233
+ type: 'function',
234
+ function: {
235
+ name: c.name,
236
+ arguments: JSON.stringify(c.input),
237
+ },
238
+ }));
239
+ return {
240
+ role: 'assistant',
241
+ content: textParts.join('\n') || null,
242
+ ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),
243
+ };
244
+ }
245
+ return { role: m.role, content: JSON.stringify(m.content) };
246
+ });
247
+ }
248
+ mapTools(tools) {
249
+ return tools.map((t) => ({
250
+ type: 'function',
251
+ function: {
252
+ name: t.name,
253
+ description: t.description,
254
+ parameters: t.inputSchema,
255
+ },
256
+ }));
257
+ }
258
+ }
259
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ export interface ToolDefinition {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: 'object';
6
+ properties: Record<string, unknown>;
7
+ required?: string[];
8
+ };
9
+ }
10
+ export type ProviderEvent = {
11
+ type: 'text-delta';
12
+ text: string;
13
+ } | {
14
+ type: 'thinking-block';
15
+ thinking: string;
16
+ signature: string;
17
+ } | {
18
+ type: 'tool-call';
19
+ id: string;
20
+ name: string;
21
+ input: Record<string, unknown>;
22
+ thoughtSignature?: string;
23
+ } | {
24
+ type: 'tool-result-request';
25
+ callId: string;
26
+ } | {
27
+ type: 'usage';
28
+ inputTokens: number;
29
+ outputTokens: number;
30
+ cacheReadTokens?: number;
31
+ cacheWriteTokens?: number;
32
+ } | {
33
+ type: 'stop';
34
+ reason: string;
35
+ };
36
+ export type ReasoningEffort = 'low' | 'medium' | 'high' | 'max' | 'auto';
37
+ export interface ProviderStreamArgs {
38
+ messages: ProviderMessage[];
39
+ tools?: ToolDefinition[];
40
+ signal?: AbortSignal;
41
+ model?: string;
42
+ temperature?: number;
43
+ maxTokens?: number;
44
+ system?: string;
45
+ effort?: ReasoningEffort;
46
+ }
47
+ export interface ProviderCompleteArgs {
48
+ messages: ProviderMessage[];
49
+ tools?: ToolDefinition[];
50
+ signal?: AbortSignal;
51
+ model?: string;
52
+ temperature?: number;
53
+ maxTokens?: number;
54
+ system?: string;
55
+ effort?: ReasoningEffort;
56
+ }
57
+ export interface ProviderCompleteResult {
58
+ text: string;
59
+ stopReason: 'stop' | 'end_turn' | 'tool_use' | 'length' | 'content_filter' | 'aborted';
60
+ usage?: {
61
+ inputTokens: number;
62
+ outputTokens: number;
63
+ };
64
+ toolCalls?: Array<{
65
+ id: string;
66
+ name: string;
67
+ input: Record<string, unknown>;
68
+ }>;
69
+ }
70
+ export type MessageContent = {
71
+ type: 'text';
72
+ text: string;
73
+ } | {
74
+ type: 'thinking';
75
+ thinking: string;
76
+ signature: string;
77
+ } | {
78
+ type: 'image';
79
+ source: {
80
+ media_type: string;
81
+ data: string;
82
+ };
83
+ } | {
84
+ type: 'tool-use';
85
+ id: string;
86
+ name: string;
87
+ input: Record<string, unknown>;
88
+ thoughtSignature?: string;
89
+ } | {
90
+ type: 'tool-result';
91
+ tool_use_id: string;
92
+ content: string;
93
+ };
94
+ export type ProviderMessage = {
95
+ role: 'user';
96
+ content: string | MessageContent[];
97
+ } | {
98
+ role: 'assistant';
99
+ content: string | MessageContent[];
100
+ } | {
101
+ role: 'tool';
102
+ toolUseId: string;
103
+ content: string;
104
+ };
105
+ export interface Provider {
106
+ name: string;
107
+ models: string[];
108
+ defaultModel: string;
109
+ stream(args: ProviderStreamArgs): {
110
+ iterable: AsyncIterable<ProviderEvent>;
111
+ cancel(): void;
112
+ };
113
+ /** Non-streaming call — used for quick evaluations (e.g. harm-check). */
114
+ check(prompt: string, args?: {
115
+ model?: string;
116
+ system?: string;
117
+ signal?: AbortSignal;
118
+ }): Promise<string>;
119
+ /** Non-streaming call with full tool-use support — used for heartbeat and other batch scenarios. */
120
+ complete(args: ProviderCompleteArgs): Promise<ProviderCompleteResult>;
121
+ }
122
+ export interface ProviderRegistry {
123
+ register(provider: Provider): void;
124
+ get(name: string): Provider | undefined;
125
+ list(): Provider[];
126
+ }
127
+ export declare function createRegistry(): ProviderRegistry;
128
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACjH;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvF,KAAK,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CACjF;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACzG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG;QAAE,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;QAAC,MAAM,IAAI,IAAI,CAAA;KAAE,CAAC;IAC7F,yEAAyE;IACzE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzG,oGAAoG;IACpG,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,IAAI,IAAI,QAAQ,EAAE,CAAC;CACpB;AAED,wBAAgB,cAAc,IAAI,gBAAgB,CAOjD"}
@@ -0,0 +1,9 @@
1
+ export function createRegistry() {
2
+ const providers = new Map();
3
+ return {
4
+ register: (p) => providers.set(p.name, p),
5
+ get: (n) => providers.get(n),
6
+ list: () => [...providers.values()],
7
+ };
8
+ }
9
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AA8EA,MAAM,UAAU,cAAc;IAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@curie-agent/providers",
3
+ "version": "0.1.2",
4
+ "publish": true,
5
+ "type": "module",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "main": "./dist/src/index.js",
10
+ "types": "./dist/src/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/src/index.js",
14
+ "types": "./dist/src/index.d.ts"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsc --project tsconfig.json",
19
+ "dev": "tsc --watch --project tsconfig.json",
20
+ "typecheck": "tsc --noEmit --project tsconfig.json",
21
+ "lint": "eslint src/",
22
+ "test": "vitest run",
23
+ "clean": "npx rimraf dist"
24
+ },
25
+ "dependencies": {
26
+ "@anthropic-ai/sdk": "^0.95.1",
27
+ "@google/generative-ai": "^0.24.0",
28
+ "openai": "^4.87.0",
29
+ "zod": "^4.4.3"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^22.0.0",
33
+ "typescript": "^6.0.3"
34
+ }
35
+ }