@anonx3247/universal-agent-harness 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.
Files changed (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +265 -0
  3. package/dist/agent-harness.d.ts +3 -0
  4. package/dist/agent-harness.d.ts.map +1 -0
  5. package/dist/agent-harness.js +326 -0
  6. package/dist/agent-harness.js.map +1 -0
  7. package/dist/db/index.d.ts +6 -0
  8. package/dist/db/index.d.ts.map +1 -0
  9. package/dist/db/index.js +11 -0
  10. package/dist/db/index.js.map +1 -0
  11. package/dist/db/schema.d.ts +335 -0
  12. package/dist/db/schema.d.ts.map +1 -0
  13. package/dist/db/schema.js +39 -0
  14. package/dist/db/schema.js.map +1 -0
  15. package/dist/index.d.ts +99 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +156 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lib/assert.d.ts +2 -0
  20. package/dist/lib/assert.d.ts.map +1 -0
  21. package/dist/lib/assert.js +4 -0
  22. package/dist/lib/assert.js.map +1 -0
  23. package/dist/lib/async.d.ts +18 -0
  24. package/dist/lib/async.d.ts.map +1 -0
  25. package/dist/lib/async.js +41 -0
  26. package/dist/lib/async.js.map +1 -0
  27. package/dist/lib/error.d.ts +47 -0
  28. package/dist/lib/error.d.ts.map +1 -0
  29. package/dist/lib/error.js +101 -0
  30. package/dist/lib/error.js.map +1 -0
  31. package/dist/lib/fs.d.ts +3 -0
  32. package/dist/lib/fs.d.ts.map +1 -0
  33. package/dist/lib/fs.js +17 -0
  34. package/dist/lib/fs.js.map +1 -0
  35. package/dist/lib/mcp-config.d.ts +62 -0
  36. package/dist/lib/mcp-config.d.ts.map +1 -0
  37. package/dist/lib/mcp-config.js +80 -0
  38. package/dist/lib/mcp-config.js.map +1 -0
  39. package/dist/lib/mcp.d.ts +19 -0
  40. package/dist/lib/mcp.d.ts.map +1 -0
  41. package/dist/lib/mcp.js +105 -0
  42. package/dist/lib/mcp.js.map +1 -0
  43. package/dist/lib/prompts.d.ts +5 -0
  44. package/dist/lib/prompts.d.ts.map +1 -0
  45. package/dist/lib/prompts.js +63 -0
  46. package/dist/lib/prompts.js.map +1 -0
  47. package/dist/lib/utils.d.ts +5 -0
  48. package/dist/lib/utils.d.ts.map +1 -0
  49. package/dist/lib/utils.js +13 -0
  50. package/dist/lib/utils.js.map +1 -0
  51. package/dist/models/anthropic.d.ts +20 -0
  52. package/dist/models/anthropic.d.ts.map +1 -0
  53. package/dist/models/anthropic.js +312 -0
  54. package/dist/models/anthropic.js.map +1 -0
  55. package/dist/models/deepseek/index.d.ts +20 -0
  56. package/dist/models/deepseek/index.d.ts.map +1 -0
  57. package/dist/models/deepseek/index.js +210 -0
  58. package/dist/models/deepseek/index.js.map +1 -0
  59. package/dist/models/gemini.d.ts +20 -0
  60. package/dist/models/gemini.d.ts.map +1 -0
  61. package/dist/models/gemini.js +250 -0
  62. package/dist/models/gemini.js.map +1 -0
  63. package/dist/models/index.d.ts +70 -0
  64. package/dist/models/index.d.ts.map +1 -0
  65. package/dist/models/index.js +30 -0
  66. package/dist/models/index.js.map +1 -0
  67. package/dist/models/mistral.d.ts +19 -0
  68. package/dist/models/mistral.d.ts.map +1 -0
  69. package/dist/models/mistral.js +259 -0
  70. package/dist/models/mistral.js.map +1 -0
  71. package/dist/models/moonshotai.d.ts +20 -0
  72. package/dist/models/moonshotai.d.ts.map +1 -0
  73. package/dist/models/moonshotai.js +220 -0
  74. package/dist/models/moonshotai.js.map +1 -0
  75. package/dist/models/openai.d.ts +21 -0
  76. package/dist/models/openai.d.ts.map +1 -0
  77. package/dist/models/openai.js +302 -0
  78. package/dist/models/openai.js.map +1 -0
  79. package/dist/models/provider.d.ts +19 -0
  80. package/dist/models/provider.d.ts.map +1 -0
  81. package/dist/models/provider.js +95 -0
  82. package/dist/models/provider.js.map +1 -0
  83. package/dist/resources/experiment.d.ts +18 -0
  84. package/dist/resources/experiment.d.ts.map +1 -0
  85. package/dist/resources/experiment.js +55 -0
  86. package/dist/resources/experiment.js.map +1 -0
  87. package/dist/resources/messages.d.ts +23 -0
  88. package/dist/resources/messages.d.ts.map +1 -0
  89. package/dist/resources/messages.js +81 -0
  90. package/dist/resources/messages.js.map +1 -0
  91. package/dist/runner/config.d.ts +4 -0
  92. package/dist/runner/config.d.ts.map +1 -0
  93. package/dist/runner/config.js +2 -0
  94. package/dist/runner/config.js.map +1 -0
  95. package/dist/runner/index.d.ts +41 -0
  96. package/dist/runner/index.d.ts.map +1 -0
  97. package/dist/runner/index.js +370 -0
  98. package/dist/runner/index.js.map +1 -0
  99. package/dist/tools/index.d.ts +2 -0
  100. package/dist/tools/index.d.ts.map +1 -0
  101. package/dist/tools/index.js +4 -0
  102. package/dist/tools/index.js.map +1 -0
  103. package/package.json +57 -0
  104. package/profiles/example/prompt.md +54 -0
  105. package/profiles/example/settings.json +11 -0
  106. package/profiles/example/settings.json.example +38 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAEjE;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,SAAS,CAAC,CAAC,EACzB,GAAG,EAAE,OAAO,EACZ,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GACzB,GAAG,IAAI,CAAC,EAAE,CAEZ;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAEpD"}
@@ -0,0 +1,13 @@
1
+ export function removeNulls(arr) {
2
+ return arr.filter((v) => v !== null && v !== undefined);
3
+ }
4
+ export function newID6() {
5
+ return Math.random().toString(36).substring(2, 8);
6
+ }
7
+ export function isArrayOf(arr, tg) {
8
+ return Array.isArray(arr) && arr.every(tg);
9
+ }
10
+ export function isString(str) {
11
+ return typeof str === "string";
12
+ }
13
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAI,GAA6B;IAC1D,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAU,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,GAAY,EACZ,EAA0B;IAE1B,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC;AACjC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { MessageParam } from "@anthropic-ai/sdk/resources/messages";
2
+ import { LLM, ModelConfig, Message, Tool, TokenUsage } from "./index";
3
+ import { Result } from "@app/lib/error";
4
+ export type AnthropicModel = "claude-opus-4-5" | "claude-sonnet-4-5" | "claude-haiku-4-5";
5
+ export declare function isAnthropicModel(model: string): model is AnthropicModel;
6
+ export declare class AnthropicLLM extends LLM {
7
+ private client;
8
+ private model;
9
+ constructor(config: ModelConfig, model?: AnthropicModel);
10
+ messages(messages: Message[]): MessageParam[];
11
+ run(messages: Message[], prompt: string, tools: Tool[]): Promise<Result<{
12
+ message: Message;
13
+ tokenUsage?: TokenUsage;
14
+ }>>;
15
+ tokens(messages: Message[], prompt: string, tools: Tool[]): Promise<Result<number>>;
16
+ private tokenUsage;
17
+ protected costPerTokenUsage(tokenUsage: TokenUsage): number;
18
+ maxTokens(): number;
19
+ }
20
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/models/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEtE,OAAO,EAAE,MAAM,EAAW,MAAM,gBAAgB,CAAC;AAqCjD,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,CAAC;AACvB,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAIvE;AAED,qBAAa,YAAa,SAAQ,GAAG;IACnC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAiB;gBAG5B,MAAM,EAAE,WAAW,EACnB,KAAK,GAAE,cAAoC;IAS7C,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE;IA6GtB,GAAG,CACP,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IAgH3D,MAAM,CACV,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAmC1B,OAAO,CAAC,UAAU;IAgBlB,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAW3D,SAAS,IAAI,MAAM;CAUpB"}
@@ -0,0 +1,312 @@
1
+ import { LLM } from "./index";
2
+ import Anthropic from "@anthropic-ai/sdk";
3
+ import { err, ok } from "@app/lib/error";
4
+ import { assertNever } from "@app/lib/assert";
5
+ import { removeNulls } from "@app/lib/utils";
6
+ const DEFAULT_TIMEOUT = 600000 * 2; // 20 minutes (double the default)
7
+ const DEFAULT_MAX_TOKENS = 8192;
8
+ const DEFAULT_THINKING_TOKENS = 8192;
9
+ function normalizeTokenPrices(costPerMillionInputTokens, costPerMillionOutputTokens) {
10
+ return {
11
+ baseInput: costPerMillionInputTokens / 1_000_000,
12
+ cache5m: (costPerMillionInputTokens * 1.25) / 1_000_000,
13
+ cache1h: (costPerMillionInputTokens * 2) / 1_000_000,
14
+ cacheHits: (costPerMillionInputTokens * 0.1) / 1_000_000,
15
+ output: costPerMillionOutputTokens / 1_000_000,
16
+ };
17
+ }
18
+ // https://docs.claude.com/en/docs/about-claude/pricing#model-pricing
19
+ const TOKEN_PRICING = {
20
+ "claude-opus-4-5": normalizeTokenPrices(5, 25),
21
+ "claude-sonnet-4-5": normalizeTokenPrices(3, 15),
22
+ "claude-haiku-4-5": normalizeTokenPrices(1, 5),
23
+ };
24
+ export function isAnthropicModel(model) {
25
+ return ["claude-opus-4-5", "claude-sonnet-4-5", "claude-haiku-4-5"].includes(model);
26
+ }
27
+ export class AnthropicLLM extends LLM {
28
+ client;
29
+ model;
30
+ constructor(config, model = "claude-sonnet-4-5") {
31
+ super(config);
32
+ this.client = new Anthropic({
33
+ timeout: DEFAULT_TIMEOUT,
34
+ });
35
+ this.model = model;
36
+ }
37
+ messages(messages) {
38
+ const anthropicMessages = messages.map((msg) => ({
39
+ role: msg.role === "agent" ? "assistant" : "user",
40
+ content: removeNulls(msg.content.map((content) => {
41
+ switch (content.type) {
42
+ case "text":
43
+ return {
44
+ type: "text",
45
+ text: content.text,
46
+ };
47
+ case "tool_use":
48
+ return {
49
+ type: "tool_use",
50
+ id: content.id,
51
+ name: content.name,
52
+ input: content.input,
53
+ };
54
+ case "tool_result":
55
+ return {
56
+ type: "tool_result",
57
+ tool_use_id: content.toolUseId,
58
+ content: content.content.map((content) => {
59
+ switch (content.type) {
60
+ case "text":
61
+ return {
62
+ type: "text",
63
+ text: content.text,
64
+ };
65
+ case "image": {
66
+ return {
67
+ type: "image",
68
+ source: {
69
+ data: content.data,
70
+ media_type: content.mimeType,
71
+ type: "base64",
72
+ },
73
+ };
74
+ }
75
+ case "audio":
76
+ return {
77
+ type: "text",
78
+ text: "(unsupported audio content)",
79
+ };
80
+ case "resource":
81
+ return {
82
+ type: "text",
83
+ text: JSON.stringify(content, null, 2),
84
+ };
85
+ case "resource_link":
86
+ return {
87
+ type: "text",
88
+ text: JSON.stringify(content, null, 2),
89
+ };
90
+ default:
91
+ assertNever(content);
92
+ }
93
+ }),
94
+ is_error: content.isError,
95
+ };
96
+ case "thinking": {
97
+ if (content.provider?.anthropic) {
98
+ switch (content.provider.anthropic.type) {
99
+ case "thinking": {
100
+ return {
101
+ type: "thinking",
102
+ thinking: content.thinking,
103
+ signature: content.provider.anthropic.signature,
104
+ };
105
+ }
106
+ case "redacted_thinking": {
107
+ return {
108
+ type: "redacted_thinking",
109
+ data: content.provider.anthropic.data,
110
+ };
111
+ }
112
+ default:
113
+ return null;
114
+ }
115
+ }
116
+ return null;
117
+ }
118
+ default:
119
+ assertNever(content);
120
+ }
121
+ })),
122
+ }));
123
+ for (let i = anthropicMessages.length - 1; i >= 0; i--) {
124
+ if (anthropicMessages[i].role === "user") {
125
+ let found = false;
126
+ for (let j = anthropicMessages[i].content.length - 1; j >= 0; j--) {
127
+ const c = anthropicMessages[i].content[j];
128
+ if (typeof c !== "string" && c.type === "text") {
129
+ c.cache_control = { type: "ephemeral" };
130
+ found = true;
131
+ break;
132
+ }
133
+ }
134
+ if (found) {
135
+ break;
136
+ }
137
+ }
138
+ }
139
+ return anthropicMessages;
140
+ }
141
+ async run(messages, prompt, tools) {
142
+ try {
143
+ const message = await this.client.beta.messages.create({
144
+ model: this.model,
145
+ max_tokens: this.config.maxTokens ??
146
+ (() => {
147
+ // thinking: true = enabled, false/undefined = disabled
148
+ if (this.config.thinking === false) {
149
+ return DEFAULT_MAX_TOKENS;
150
+ }
151
+ // Default or explicitly enabled: use thinking tokens
152
+ return DEFAULT_THINKING_TOKENS + DEFAULT_MAX_TOKENS;
153
+ })(),
154
+ messages: this.messages(messages),
155
+ system: [
156
+ {
157
+ type: "text",
158
+ text: prompt,
159
+ cache_control: {
160
+ type: "ephemeral",
161
+ },
162
+ },
163
+ ],
164
+ thinking: (() => {
165
+ // thinking: true = enabled, false/undefined = disabled
166
+ if (this.config.thinking === false) {
167
+ return { type: "disabled" };
168
+ }
169
+ // Default or explicitly enabled
170
+ return {
171
+ type: "enabled",
172
+ budget_tokens: DEFAULT_THINKING_TOKENS,
173
+ };
174
+ })(),
175
+ tools: tools.map((tool) => ({
176
+ name: tool.name,
177
+ description: tool.description,
178
+ input_schema: tool.inputSchema,
179
+ })),
180
+ tool_choice: { type: "auto" },
181
+ betas: ["interleaved-thinking-2025-05-14"],
182
+ });
183
+ const tokenUsage = this.tokenUsage(message.usage);
184
+ // console.log(message.usage);
185
+ return ok({
186
+ message: {
187
+ role: message.role === "assistant" ? "agent" : "user",
188
+ content: removeNulls(message.content.map((c) => {
189
+ switch (c.type) {
190
+ case "text":
191
+ return {
192
+ type: "text",
193
+ text: c.text,
194
+ provider: null,
195
+ };
196
+ case "tool_use":
197
+ return {
198
+ type: "tool_use",
199
+ id: c.id,
200
+ name: c.name,
201
+ input: c.input,
202
+ provider: null,
203
+ };
204
+ case "thinking": {
205
+ return {
206
+ type: "thinking",
207
+ thinking: c.thinking,
208
+ provider: {
209
+ anthropic: {
210
+ type: c.type,
211
+ signature: c.signature,
212
+ },
213
+ },
214
+ };
215
+ }
216
+ case "redacted_thinking": {
217
+ return {
218
+ type: "thinking",
219
+ thinking: "<redacted>",
220
+ provider: {
221
+ anthropic: {
222
+ type: c.type,
223
+ data: c.data,
224
+ },
225
+ },
226
+ };
227
+ }
228
+ case "server_tool_use":
229
+ case "mcp_tool_use":
230
+ case "mcp_tool_result":
231
+ case "code_execution_tool_result":
232
+ case "container_upload":
233
+ case "web_search_tool_result": {
234
+ return null;
235
+ }
236
+ default:
237
+ assertNever(c);
238
+ }
239
+ })),
240
+ },
241
+ tokenUsage, // also inlcude cached or input tokens ?
242
+ });
243
+ }
244
+ catch (error) {
245
+ return err("model_error", "Failed to run model", error);
246
+ }
247
+ }
248
+ async tokens(messages, prompt, tools) {
249
+ try {
250
+ const response = await this.client.messages.countTokens({
251
+ model: this.model,
252
+ messages: this.messages(messages),
253
+ system: prompt,
254
+ thinking: (() => {
255
+ // thinking: true = enabled, false/undefined = disabled
256
+ if (this.config.thinking === false) {
257
+ return { type: "disabled" };
258
+ }
259
+ // Default or explicitly enabled
260
+ return {
261
+ type: "enabled",
262
+ budget_tokens: DEFAULT_THINKING_TOKENS,
263
+ };
264
+ })(),
265
+ tools: tools.map((tool) => ({
266
+ name: tool.name,
267
+ description: tool.description,
268
+ input_schema: tool.inputSchema,
269
+ })),
270
+ tool_choice: { type: "auto" },
271
+ });
272
+ return ok(response.input_tokens);
273
+ }
274
+ catch (error) {
275
+ return err("model_error", "Failed to count tokens", error);
276
+ }
277
+ }
278
+ tokenUsage(usage) {
279
+ const input = usage.input_tokens +
280
+ (usage.cache_read_input_tokens ?? 0) +
281
+ (usage.cache_creation?.ephemeral_1h_input_tokens ?? 0) +
282
+ (usage.cache_creation?.ephemeral_5m_input_tokens ?? 0);
283
+ return {
284
+ total: usage.output_tokens + input,
285
+ input,
286
+ output: usage.output_tokens,
287
+ cached: usage.cache_read_input_tokens ?? 0,
288
+ thinking: 0, // Anthropic doesn't give thinking token usage
289
+ };
290
+ }
291
+ costPerTokenUsage(tokenUsage) {
292
+ const pricing = TOKEN_PRICING[this.model];
293
+ // For Anthropic, we use a conservative estimate:
294
+ // baseInput for non-cached tokens, cacheHits for cached tokens
295
+ const nonCachedInput = tokenUsage.input - tokenUsage.cached;
296
+ let c = nonCachedInput * pricing.baseInput;
297
+ c += tokenUsage.cached * pricing.cacheHits;
298
+ c += tokenUsage.output * pricing.output;
299
+ return c;
300
+ }
301
+ maxTokens() {
302
+ switch (this.model) {
303
+ case "claude-opus-4-5":
304
+ case "claude-sonnet-4-5":
305
+ case "claude-haiku-4-5":
306
+ return 200000 - 64000;
307
+ default:
308
+ assertNever(this.model);
309
+ }
310
+ }
311
+ }
312
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/models/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { ChatCompletionMessageParam } from "openai/resources/chat";
2
+ import { LLM, ModelConfig, Message, Tool, TokenUsage } from "../index";
3
+ import { Result } from "@app/lib/error";
4
+ export type DeepseekModel = "deepseek-chat" | "deepseek-reasoner";
5
+ export declare function isDeepseekModel(model: string): model is DeepseekModel;
6
+ export declare class DeepseekLLM extends LLM {
7
+ private client;
8
+ private model;
9
+ constructor(config: ModelConfig, model?: DeepseekModel);
10
+ messages(prompt: string, messages: Message[]): ChatCompletionMessageParam[];
11
+ run(messages: Message[], prompt: string, tools: Tool[]): Promise<Result<{
12
+ message: Message;
13
+ tokenUsage?: TokenUsage;
14
+ }>>;
15
+ private tokenUsage;
16
+ protected costPerTokenUsage(tokenUsage: TokenUsage): number;
17
+ tokens(messages: Message[], prompt: string, tools: Tool[]): Promise<Result<number>>;
18
+ maxTokens(): number;
19
+ }
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/deepseek/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,0BAA0B,EAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,GAAG,EACH,WAAW,EACX,OAAO,EACP,IAAI,EACJ,UAAU,EACX,MAAM,UAAU,CAAC;AAIlB,OAAO,EAAE,MAAM,EAAW,MAAM,gBAAgB,CAAC;AAKjD,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAClE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAErE;AA0BD,qBAAa,WAAY,SAAQ,GAAG;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAgB;gBAEjB,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,aAA+B;IASvE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE;IAiEtC,GAAG,CACP,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IA4FjE,OAAO,CAAC,UAAU;IAUlB,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAUrD,MAAM,CACV,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAgB1B,SAAS,IAAI,MAAM;CAUpB"}
@@ -0,0 +1,210 @@
1
+ import { LLM, } from "../index";
2
+ import { PreTrainedTokenizer } from "@huggingface/transformers";
3
+ import OpenAI from "openai";
4
+ import { err, ok } from "@app/lib/error";
5
+ import { assertNever } from "@app/lib/assert";
6
+ import { removeNulls } from "@app/lib/utils";
7
+ export function isDeepseekModel(model) {
8
+ return ["deepseek-chat", "deepseek-reasoner"].includes(model);
9
+ }
10
+ function normalizeTokenPrices(costPerMillionInputTokens, costPerMillionOutputTokens, costPerMillionCacheTokens) {
11
+ return {
12
+ input: costPerMillionInputTokens / 1_000_000,
13
+ output: costPerMillionOutputTokens / 1_000_000,
14
+ cacheHits: costPerMillionCacheTokens / 1_000_000,
15
+ };
16
+ }
17
+ // https://api-docs.deepseek.com/quick_start/pricing
18
+ const TOKEN_PRICING = {
19
+ "deepseek-chat": normalizeTokenPrices(0.28, 0.42, 0.028),
20
+ "deepseek-reasoner": normalizeTokenPrices(0.28, 0.42, 0.028),
21
+ };
22
+ export class DeepseekLLM extends LLM {
23
+ client;
24
+ model;
25
+ constructor(config, model = "deepseek-chat") {
26
+ super(config);
27
+ this.client = new OpenAI({
28
+ apiKey: process.env.DEEPSEEK_API_KEY,
29
+ baseURL: "https://api.deepseek.com/v1",
30
+ });
31
+ this.model = model;
32
+ }
33
+ messages(prompt, messages) {
34
+ const inputItems = [
35
+ { role: "system", content: prompt },
36
+ ...removeNulls(messages
37
+ .map((msg) => {
38
+ switch (msg.role) {
39
+ case "user":
40
+ return msg.content.map((c) => {
41
+ switch (c.type) {
42
+ case "text":
43
+ return { role: "user", content: c.text };
44
+ case "tool_result":
45
+ return {
46
+ role: "tool",
47
+ name: c.toolUseName,
48
+ tool_call_id: c.toolUseId,
49
+ id: c.toolUseId,
50
+ content: JSON.stringify(c.content),
51
+ };
52
+ default:
53
+ return undefined;
54
+ }
55
+ });
56
+ case "agent":
57
+ const message = {
58
+ role: "assistant",
59
+ content: null,
60
+ };
61
+ msg.content.forEach((c) => {
62
+ switch (c.type) {
63
+ case "text":
64
+ message.content = c.text;
65
+ break;
66
+ case "thinking":
67
+ message.reasoning_content = c.thinking;
68
+ break;
69
+ case "tool_use":
70
+ message.tool_calls = message.tool_calls ?? [];
71
+ message.tool_calls.push({
72
+ type: "function",
73
+ id: c.id,
74
+ function: {
75
+ name: c.name,
76
+ arguments: JSON.stringify(c.input),
77
+ },
78
+ });
79
+ break;
80
+ }
81
+ });
82
+ if (message.tool_calls && message.tool_calls.length > 0 && !message.reasoning_content) {
83
+ message.reasoning_content = "";
84
+ }
85
+ return [message];
86
+ }
87
+ })
88
+ .flat()),
89
+ ];
90
+ return inputItems;
91
+ }
92
+ async run(messages, prompt, tools) {
93
+ try {
94
+ const input = this.messages(prompt, messages);
95
+ const response = await this.client.chat.completions.create({
96
+ model: this.model,
97
+ messages: input,
98
+ tool_choice: "auto",
99
+ tools: tools.map((tool) => ({
100
+ type: "function",
101
+ function: {
102
+ name: tool.name,
103
+ description: tool.description,
104
+ parameters: tool.inputSchema,
105
+ },
106
+ strict: false,
107
+ })),
108
+ }, {});
109
+ const message = response.choices[0].message;
110
+ const textContent = message.content;
111
+ const thinkingContent = "reasoning_content" in message
112
+ ? message.reasoning_content
113
+ : undefined;
114
+ const toolCalls = message.tool_calls;
115
+ const output = [];
116
+ if (textContent) {
117
+ output.push({
118
+ type: "text",
119
+ text: textContent,
120
+ provider: null,
121
+ });
122
+ }
123
+ if (thinkingContent) {
124
+ output.push({
125
+ type: "thinking",
126
+ thinking: thinkingContent,
127
+ provider: null,
128
+ });
129
+ }
130
+ if (toolCalls) {
131
+ output.push(...toolCalls
132
+ .filter((t) => t.type === "function")
133
+ .map((toolCall) => {
134
+ return {
135
+ type: "tool_use",
136
+ id: toolCall.id,
137
+ name: toolCall.function.name,
138
+ input: JSON.parse(toolCall.function.arguments),
139
+ provider: {
140
+ moonshotai: {
141
+ id: toolCall.id,
142
+ },
143
+ },
144
+ };
145
+ }));
146
+ }
147
+ if (!textContent && !toolCalls) {
148
+ output.push({
149
+ type: "text",
150
+ text: "",
151
+ provider: null,
152
+ });
153
+ }
154
+ const tokenUsage = response.usage
155
+ ? this.tokenUsage(response.usage)
156
+ : undefined;
157
+ return ok({
158
+ message: {
159
+ role: "agent",
160
+ content: output,
161
+ },
162
+ tokenUsage,
163
+ });
164
+ }
165
+ catch (error) {
166
+ return err("model_error", "Failed to run model", error);
167
+ }
168
+ }
169
+ tokenUsage(usage) {
170
+ return {
171
+ total: usage.total_tokens,
172
+ input: usage.prompt_tokens,
173
+ output: usage.completion_tokens,
174
+ cached: usage.prompt_tokens_details?.cached_tokens ?? 0,
175
+ thinking: usage.completion_tokens_details?.reasoning_tokens ?? 0,
176
+ };
177
+ }
178
+ costPerTokenUsage(tokenUsage) {
179
+ const pricing = TOKEN_PRICING[this.model];
180
+ const nonCachedInput = tokenUsage.input - tokenUsage.cached;
181
+ const c = nonCachedInput * pricing.input +
182
+ tokenUsage.output * pricing.output +
183
+ tokenUsage.cached * pricing.cacheHits;
184
+ return c;
185
+ }
186
+ async tokens(messages, prompt, tools) {
187
+ const str = [messages, prompt, tools]
188
+ .map((x) => JSON.stringify(x))
189
+ .reduce((acc, cur) => acc + cur);
190
+ try {
191
+ const tokenizer = await PreTrainedTokenizer.from_pretrained(__dirname);
192
+ const encoded = tokenizer.encode(str);
193
+ return ok(encoded.length);
194
+ }
195
+ catch (e) {
196
+ return err("model_error", "Could not tokenize", e);
197
+ }
198
+ }
199
+ maxTokens() {
200
+ switch (this.model) {
201
+ case "deepseek-chat":
202
+ return 128000;
203
+ case "deepseek-reasoner":
204
+ return 128000;
205
+ default:
206
+ assertNever(this.model);
207
+ }
208
+ }
209
+ }
210
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/models/deepseek/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Content } from "@google/genai";
2
+ import { LLM, ModelConfig, Message, Tool, TokenUsage } from "./index";
3
+ import { Result } from "@app/lib/error";
4
+ export type GeminiModel = "gemini-3-pro-preview" | "gemini-2.5-pro" | "gemini-2.5-flash" | "gemini-2.5-flash-lite";
5
+ export declare function isGeminiModel(model: string): model is GeminiModel;
6
+ export declare class GeminiLLM extends LLM {
7
+ private client;
8
+ private model;
9
+ constructor(config: ModelConfig, model?: GeminiModel);
10
+ contents(messages: Message[]): Content[];
11
+ run(messages: Message[], prompt: string, tools: Tool[]): Promise<Result<{
12
+ message: Message;
13
+ tokenUsage?: TokenUsage;
14
+ }>>;
15
+ private tokenUsage;
16
+ protected costPerTokenUsage(tokenUsage: TokenUsage): number;
17
+ tokens(messages: Message[], prompt: string, _tools: Tool[]): Promise<Result<number>>;
18
+ maxTokens(): number;
19
+ }
20
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/models/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAKR,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,GAAG,EACH,WAAW,EACX,OAAO,EACP,IAAI,EAGJ,UAAU,EACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAW,MAAM,gBAAgB,CAAC;AAIjD,MAAM,MAAM,WAAW,GACnB,sBAAsB,GACtB,gBAAgB,GAChB,kBAAkB,GAClB,uBAAuB,CAAC;AAC5B,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,WAAW,CAOjE;AAyBD,qBAAa,SAAU,SAAQ,GAAG;IAChC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAc;gBAGzB,MAAM,EAAE,WAAW,EACnB,KAAK,GAAE,WAAqC;IAO9C,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE;IAuDtB,GAAG,CACP,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IAqHjE,OAAO,CAAC,UAAU;IAUlB,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAQrD,MAAM,CACV,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,EAAE,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IA8B1B,SAAS,IAAI,MAAM;CAYpB"}