@grisaiaevy/crafting-agent 0.0.1

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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/image/api.d.ts +3 -0
  4. package/dist/image/api.js +23 -0
  5. package/dist/image/api.js.map +1 -0
  6. package/dist/image/index.d.ts +2 -0
  7. package/dist/image/index.js +19 -0
  8. package/dist/image/index.js.map +1 -0
  9. package/dist/image/types.d.ts +8 -0
  10. package/dist/image/types.js +3 -0
  11. package/dist/image/types.js.map +1 -0
  12. package/dist/index.d.ts +9 -0
  13. package/dist/index.js +28 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/logger/index.d.ts +1 -0
  16. package/dist/logger/index.js +7 -0
  17. package/dist/logger/index.js.map +1 -0
  18. package/dist/logger/logger.d.ts +3 -0
  19. package/dist/logger/logger.js +23 -0
  20. package/dist/logger/logger.js.map +1 -0
  21. package/dist/prompt/index.d.ts +2 -0
  22. package/dist/prompt/index.js +6 -0
  23. package/dist/prompt/index.js.map +1 -0
  24. package/dist/prompt/prompt.d.ts +2 -0
  25. package/dist/prompt/prompt.js +68 -0
  26. package/dist/prompt/prompt.js.map +1 -0
  27. package/dist/providers/doubao.d.ts +10 -0
  28. package/dist/providers/doubao.js +76 -0
  29. package/dist/providers/doubao.js.map +1 -0
  30. package/dist/providers/google.d.ts +12 -0
  31. package/dist/providers/google.js +70 -0
  32. package/dist/providers/google.js.map +1 -0
  33. package/dist/providers/index.d.ts +6 -0
  34. package/dist/providers/index.js +23 -0
  35. package/dist/providers/index.js.map +1 -0
  36. package/dist/providers/message_converer.d.ts +4 -0
  37. package/dist/providers/message_converer.js +206 -0
  38. package/dist/providers/message_converer.js.map +1 -0
  39. package/dist/providers/minimax.d.ts +10 -0
  40. package/dist/providers/minimax.js +120 -0
  41. package/dist/providers/minimax.js.map +1 -0
  42. package/dist/providers/openrouter.d.ts +17 -0
  43. package/dist/providers/openrouter.js +178 -0
  44. package/dist/providers/openrouter.js.map +1 -0
  45. package/dist/providers/stream.d.ts +1 -0
  46. package/dist/providers/stream.js +18 -0
  47. package/dist/providers/stream.js.map +1 -0
  48. package/dist/storage/index.d.ts +1 -0
  49. package/dist/storage/index.js +6 -0
  50. package/dist/storage/index.js.map +1 -0
  51. package/dist/storage/task-storage.d.ts +13 -0
  52. package/dist/storage/task-storage.js +7 -0
  53. package/dist/storage/task-storage.js.map +1 -0
  54. package/dist/task/converter.d.ts +4 -0
  55. package/dist/task/converter.js +66 -0
  56. package/dist/task/converter.js.map +1 -0
  57. package/dist/task/index.d.ts +5 -0
  58. package/dist/task/index.js +11 -0
  59. package/dist/task/index.js.map +1 -0
  60. package/dist/task/task_executor.d.ts +22 -0
  61. package/dist/task/task_executor.js +216 -0
  62. package/dist/task/task_executor.js.map +1 -0
  63. package/dist/task/types.d.ts +1 -0
  64. package/dist/task/types.js +18 -0
  65. package/dist/task/types.js.map +1 -0
  66. package/dist/tools/index.d.ts +6 -0
  67. package/dist/tools/index.js +23 -0
  68. package/dist/tools/index.js.map +1 -0
  69. package/dist/tools/replace_content.d.ts +9 -0
  70. package/dist/tools/replace_content.js +72 -0
  71. package/dist/tools/replace_content.js.map +1 -0
  72. package/dist/tools/tool_converter.d.ts +3 -0
  73. package/dist/tools/tool_converter.js +59 -0
  74. package/dist/tools/tool_converter.js.map +1 -0
  75. package/dist/tools/types.d.ts +1 -0
  76. package/dist/tools/types.js +18 -0
  77. package/dist/tools/types.js.map +1 -0
  78. package/dist/tools/update_todo_list.d.ts +13 -0
  79. package/dist/tools/update_todo_list.js +80 -0
  80. package/dist/tools/update_todo_list.js.map +1 -0
  81. package/dist/tools/web_search.d.ts +9 -0
  82. package/dist/tools/web_search.js +44 -0
  83. package/dist/tools/web_search.js.map +1 -0
  84. package/dist/tools/write_content.d.ts +9 -0
  85. package/dist/tools/write_content.js +49 -0
  86. package/dist/tools/write_content.js.map +1 -0
  87. package/dist/types/common.d.ts +14 -0
  88. package/dist/types/common.js +3 -0
  89. package/dist/types/common.js.map +1 -0
  90. package/dist/types/context.d.ts +10 -0
  91. package/dist/types/context.js +3 -0
  92. package/dist/types/context.js.map +1 -0
  93. package/dist/types/index.d.ts +7 -0
  94. package/dist/types/index.js +24 -0
  95. package/dist/types/index.js.map +1 -0
  96. package/dist/types/prompt.d.ts +5 -0
  97. package/dist/types/prompt.js +3 -0
  98. package/dist/types/prompt.js.map +1 -0
  99. package/dist/types/provider.d.ts +14 -0
  100. package/dist/types/provider.js +372 -0
  101. package/dist/types/provider.js.map +1 -0
  102. package/dist/types/stream.d.ts +59 -0
  103. package/dist/types/stream.js +3 -0
  104. package/dist/types/stream.js.map +1 -0
  105. package/dist/types/task.d.ts +46 -0
  106. package/dist/types/task.js +3 -0
  107. package/dist/types/task.js.map +1 -0
  108. package/dist/types/tools.d.ts +36 -0
  109. package/dist/types/tools.js +30 -0
  110. package/dist/types/tools.js.map +1 -0
  111. package/dist/utils/fetch_html.d.ts +1 -0
  112. package/dist/utils/fetch_html.js +24 -0
  113. package/dist/utils/fetch_html.js.map +1 -0
  114. package/dist/utils/index.d.ts +1 -0
  115. package/dist/utils/index.js +18 -0
  116. package/dist/utils/index.js.map +1 -0
  117. package/package.json +58 -0
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./stream"), exports);
18
+ __exportStar(require("./google"), exports);
19
+ __exportStar(require("./doubao"), exports);
20
+ __exportStar(require("./minimax"), exports);
21
+ __exportStar(require("./openrouter"), exports);
22
+ __exportStar(require("./message_converer"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwB;AACxB,2CAAwB;AACxB,2CAAwB;AACxB,4CAAyB;AACzB,+CAA4B;AAC5B,qDAAkC"}
@@ -0,0 +1,4 @@
1
+ import { Anthropic } from '@anthropic-ai/sdk';
2
+ import OpenAI from 'openai';
3
+ export declare function convertToOpenAiMessages(anthropicMessages: Anthropic.Messages.MessageParam[]): OpenAI.Chat.ChatCompletionMessageParam[];
4
+ export declare function convertToAnthropicMessage(completion: OpenAI.Chat.Completions.ChatCompletion): Anthropic.Messages.Message;
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertToOpenAiMessages = convertToOpenAiMessages;
4
+ exports.convertToAnthropicMessage = convertToAnthropicMessage;
5
+ function convertToOpenAiMessages(anthropicMessages) {
6
+ const openAiMessages = [];
7
+ for (const anthropicMessage of anthropicMessages) {
8
+ if (typeof anthropicMessage.content === 'string') {
9
+ openAiMessages.push({
10
+ role: anthropicMessage.role,
11
+ content: anthropicMessage.content,
12
+ });
13
+ }
14
+ else {
15
+ // image_url.url is base64 encoded image data
16
+ // ensure it contains the content-type of the image: data:image/png;base64,
17
+ /*
18
+ { role: "user", content: "" | { type: "text", text: string } | { type: "image_url", image_url: { url: string } } },
19
+ // content required unless tool_calls is present
20
+ { role: "assistant", content?: "" | null, tool_calls?: [{ id: "", function: { name: "", arguments: "" }, type: "function" }] },
21
+ { role: "tool", tool_call_id: "", content: ""}
22
+ */
23
+ if (anthropicMessage.role === 'user') {
24
+ const { nonToolMessages, toolMessages } = anthropicMessage.content.reduce((acc, part) => {
25
+ if (part.type === 'tool_result') {
26
+ acc.toolMessages.push(part);
27
+ }
28
+ else if (part.type === 'text' || part.type === 'image') {
29
+ acc.nonToolMessages.push(part);
30
+ } // user cannot send tool_use messages
31
+ return acc;
32
+ }, { nonToolMessages: [], toolMessages: [] });
33
+ // Process tool result messages FIRST since they must follow the tool use messages
34
+ const toolResultImages = [];
35
+ toolMessages.forEach((toolMessage) => {
36
+ // The Anthropic SDK allows tool results to be a string or an array of text and image blocks, enabling rich and structured content. In contrast, the OpenAI SDK only supports tool results as a single string, so we map the Anthropic tool result parts into one concatenated string to maintain compatibility.
37
+ let content;
38
+ if (typeof toolMessage.content === 'string') {
39
+ content = toolMessage.content;
40
+ }
41
+ else {
42
+ content =
43
+ toolMessage.content
44
+ ?.map((part) => {
45
+ if (part.type === 'image') {
46
+ toolResultImages.push(part);
47
+ return '(see following user message for image)';
48
+ }
49
+ return part.type === 'text' ? part.text : '';
50
+ })
51
+ .join('\n') ?? '';
52
+ }
53
+ openAiMessages.push({
54
+ role: 'tool',
55
+ tool_call_id: toolMessage.tool_use_id,
56
+ content: content,
57
+ });
58
+ });
59
+ // If tool results contain images, send as a separate user message
60
+ // I ran into an issue where if I gave feedback for one of many tool uses, the request would fail.
61
+ // "Messages following `tool_use` blocks must begin with a matching number of `tool_result` blocks."
62
+ // Therefore we need to send these images after the tool result messages
63
+ // NOTE: it's actually okay to have multiple user messages in a row, the model will treat them as a continuation of the same input (this way works better than combining them into one message, since the tool result specifically mentions (see following user message for image)
64
+ // UPDATE v2.0: we don't use tools anymore, but if we did it's important to note that the openrouter prompt caching mechanism requires one user message at a time, so we would need to add these images to the user content array instead.
65
+ // if (toolResultImages.length > 0) {
66
+ // openAiMessages.push({
67
+ // role: "user",
68
+ // content: toolResultImages.map((part) => ({
69
+ // type: "image_url",
70
+ // image_url: { url: `data:${part.source.media_type};base64,${part.source.data}` },
71
+ // })),
72
+ // })
73
+ // }
74
+ // Process non-tool messages
75
+ if (nonToolMessages.length > 0) {
76
+ openAiMessages.push({
77
+ role: 'user',
78
+ content: nonToolMessages.map((part) => {
79
+ if (part.type === 'image') {
80
+ const url = part.source.type === 'base64'
81
+ ? `data:${part.source.media_type};base64,${part.source.data}`
82
+ : part.source.url;
83
+ return {
84
+ type: 'image_url',
85
+ image_url: { url },
86
+ };
87
+ }
88
+ return { type: 'text', text: part.text };
89
+ }),
90
+ });
91
+ }
92
+ }
93
+ else if (anthropicMessage.role === 'assistant') {
94
+ const { nonToolMessages, toolMessages } = anthropicMessage.content.reduce((acc, part) => {
95
+ if (part.type === 'tool_use') {
96
+ acc.toolMessages.push(part);
97
+ }
98
+ else if (part.type === 'text' || part.type === 'image') {
99
+ acc.nonToolMessages.push(part);
100
+ } // assistant cannot send tool_result messages
101
+ return acc;
102
+ }, { nonToolMessages: [], toolMessages: [] });
103
+ // Process non-tool messages
104
+ let content;
105
+ const reasoningDetails = [];
106
+ if (nonToolMessages.length > 0) {
107
+ nonToolMessages.forEach((part) => {
108
+ // @ts-ignore-next-line
109
+ if (part.type === 'text' && part.reasoning_details) {
110
+ // @ts-ignore-next-line
111
+ reasoningDetails.push(part.reasoning_details);
112
+ }
113
+ });
114
+ content = nonToolMessages
115
+ .map((part) => {
116
+ if (part.type === 'image') {
117
+ return ''; // impossible as the assistant cannot send images
118
+ }
119
+ return part.text;
120
+ })
121
+ .join('\n');
122
+ }
123
+ // Process tool use messages
124
+ const tool_calls = toolMessages.map((toolMessage) => ({
125
+ id: toolMessage.id,
126
+ type: 'function',
127
+ function: {
128
+ name: toolMessage.name,
129
+ // json string
130
+ arguments: JSON.stringify(toolMessage.input),
131
+ },
132
+ }));
133
+ openAiMessages.push({
134
+ role: 'assistant',
135
+ content,
136
+ // Cannot be an empty array. API expects an array with minimum length 1, and will respond with an error if it's empty
137
+ tool_calls: tool_calls.length > 0 ? tool_calls : undefined,
138
+ // @ts-ignore-next-line
139
+ reasoning_details: reasoningDetails.length > 0 ? reasoningDetails : undefined,
140
+ });
141
+ }
142
+ }
143
+ }
144
+ return openAiMessages;
145
+ }
146
+ // Convert OpenAI response to Anthropic format
147
+ function convertToAnthropicMessage(completion) {
148
+ const openAiMessage = completion.choices[0].message;
149
+ const anthropicMessage = {
150
+ id: completion.id,
151
+ type: 'message',
152
+ role: openAiMessage.role, // always "assistant"
153
+ content: [
154
+ {
155
+ type: 'text',
156
+ text: openAiMessage.content || '',
157
+ citations: null,
158
+ },
159
+ ],
160
+ model: completion.model,
161
+ stop_reason: (() => {
162
+ switch (completion.choices[0].finish_reason) {
163
+ case 'stop':
164
+ return 'end_turn';
165
+ case 'length':
166
+ return 'max_tokens';
167
+ case 'tool_calls':
168
+ return 'tool_use';
169
+ case 'content_filter': // Anthropic doesn't have an exact equivalent
170
+ default:
171
+ return null;
172
+ }
173
+ })(),
174
+ stop_sequence: null, // which custom stop_sequence was generated, if any (not applicable if you don't use stop_sequence)
175
+ usage: {
176
+ input_tokens: completion.usage?.prompt_tokens || 0,
177
+ output_tokens: completion.usage?.completion_tokens || 0,
178
+ cache_creation_input_tokens: null,
179
+ cache_read_input_tokens: null,
180
+ cache_creation: null,
181
+ server_tool_use: null,
182
+ service_tier: null,
183
+ },
184
+ };
185
+ if (openAiMessage.tool_calls && openAiMessage.tool_calls.length > 0) {
186
+ anthropicMessage.content.push(...openAiMessage.tool_calls.map((toolCall) => {
187
+ let parsedInput = {};
188
+ if (toolCall.type === 'function') {
189
+ try {
190
+ parsedInput = JSON.parse(toolCall.function.arguments || '{}');
191
+ }
192
+ catch (error) {
193
+ console.error('Failed to parse tool arguments:', error);
194
+ }
195
+ }
196
+ return {
197
+ type: 'tool_use',
198
+ id: toolCall.id,
199
+ name: toolCall.type === 'function' ? toolCall.function.name : '',
200
+ input: parsedInput,
201
+ };
202
+ }));
203
+ }
204
+ return anthropicMessage;
205
+ }
206
+ //# sourceMappingURL=message_converer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message_converer.js","sourceRoot":"","sources":["../../src/providers/message_converer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ApiHandler, ApiStream } from './index';
2
+ import { ProviderConfig, AbstractTool } from '../types';
3
+ import Anthropic from '@anthropic-ai/sdk';
4
+ export declare class MinimaxHandler implements ApiHandler {
5
+ private readonly minimaxConfig;
6
+ private client;
7
+ constructor(minimaxConfig: ProviderConfig);
8
+ private ensureClient;
9
+ chatCompletion(systemPrompt: string, messages: Anthropic.Messages.MessageParam[], tools?: AbstractTool[]): ApiStream;
10
+ }
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MinimaxHandler = void 0;
7
+ const index_1 = require("../tools/index");
8
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
9
+ class MinimaxHandler {
10
+ constructor(minimaxConfig) {
11
+ this.minimaxConfig = minimaxConfig;
12
+ }
13
+ ensureClient() {
14
+ if (!this.client) {
15
+ if (!this.minimaxConfig.apiKey) {
16
+ throw new Error('MiniMax API key is required');
17
+ }
18
+ try {
19
+ this.client = new sdk_1.default({
20
+ baseURL: 'https://api.minimaxi.com/anthropic',
21
+ apiKey: this.minimaxConfig.apiKey,
22
+ });
23
+ }
24
+ catch (error) {
25
+ throw new Error(`Error creating MiniMax client: ${error.message}`);
26
+ }
27
+ }
28
+ return this.client;
29
+ }
30
+ async *chatCompletion(systemPrompt, messages, tools) {
31
+ const client = this.ensureClient();
32
+ const anthropicTools = tools?.map(tool => (0, index_1.convertToAnthropicTool)(tool));
33
+ const stream = await client.messages.create({
34
+ model: this.minimaxConfig.modelName || '',
35
+ max_tokens: this.minimaxConfig.maxTokens || 8192,
36
+ temperature: 1.0,
37
+ system: systemPrompt,
38
+ messages: messages,
39
+ stream: true,
40
+ tools: anthropicTools || undefined,
41
+ tool_choice: { type: 'any' },
42
+ });
43
+ const lastStartedToolCall = { id: '', name: '', arguments: '' };
44
+ for await (const chunk of stream) {
45
+ switch (chunk.type) {
46
+ case 'message_start':
47
+ const usage = chunk.message.usage;
48
+ yield {
49
+ type: 'usage',
50
+ inputTokens: usage.input_tokens || 0,
51
+ outputTokens: usage.output_tokens || 0,
52
+ cacheReadTokens: usage.cache_creation_input_tokens || 0,
53
+ cacheWriteTokens: usage.cache_read_input_tokens || 0,
54
+ };
55
+ break;
56
+ case 'content_block_start':
57
+ switch (chunk.content_block.type) {
58
+ case 'thinking':
59
+ yield {
60
+ type: 'reasoning',
61
+ reasoning: chunk.content_block.thinking || '',
62
+ };
63
+ break;
64
+ case 'tool_use':
65
+ if (chunk.content_block.id && chunk.content_block.name) {
66
+ lastStartedToolCall.id = chunk.content_block.id;
67
+ lastStartedToolCall.name = chunk.content_block.name;
68
+ lastStartedToolCall.arguments = '';
69
+ }
70
+ break;
71
+ case 'text':
72
+ yield {
73
+ type: 'text',
74
+ text: chunk.content_block.text,
75
+ };
76
+ break;
77
+ }
78
+ break;
79
+ case 'content_block_delta':
80
+ switch (chunk.delta.type) {
81
+ case 'thinking_delta':
82
+ yield {
83
+ type: 'reasoning',
84
+ reasoning: chunk.delta.thinking,
85
+ };
86
+ break;
87
+ case 'input_json_delta':
88
+ if (chunk.delta.partial_json) {
89
+ yield {
90
+ type: 'tool_calls',
91
+ tool_call: {
92
+ function: {
93
+ id: lastStartedToolCall.id,
94
+ name: lastStartedToolCall.name,
95
+ arguments: lastStartedToolCall.arguments +
96
+ chunk.delta.partial_json,
97
+ },
98
+ },
99
+ };
100
+ }
101
+ break;
102
+ case 'text_delta':
103
+ yield {
104
+ type: 'text',
105
+ text: chunk.delta.text,
106
+ };
107
+ break;
108
+ }
109
+ break;
110
+ case 'content_block_stop':
111
+ lastStartedToolCall.id = '';
112
+ lastStartedToolCall.name = '';
113
+ lastStartedToolCall.arguments = '';
114
+ break;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ exports.MinimaxHandler = MinimaxHandler;
120
+ //# sourceMappingURL=minimax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax.js","sourceRoot":"","sources":["../../src/providers/minimax.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ApiHandler, GenerateApiHandler, AgentImageConfig, ApiStream, ApiStreamImageChunk } from './index';
2
+ import { ProviderConfig, AbstractTool } from '../types';
3
+ import Anthropic from '@anthropic-ai/sdk';
4
+ import OpenAI from 'openai';
5
+ export declare class OpenRouterHandler implements ApiHandler, GenerateApiHandler {
6
+ private openrouterConfig;
7
+ private client;
8
+ private lastGenerationId;
9
+ constructor(openrouterConfig: ProviderConfig);
10
+ createOpenaiClient(): OpenAI;
11
+ chatCompletion(systemPormpt: string, messages: Anthropic.Messages.MessageParam[], tools?: AbstractTool[]): ApiStream;
12
+ createOpenRouterStream(client: OpenAI, systemPrompt: string, messages: Anthropic.Messages.MessageParam[], tools?: AbstractTool[]): Promise<import("openai/core/streaming").Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {
13
+ _request_id?: string | null;
14
+ } & OpenAI.Chat.Completions.ChatCompletion>;
15
+ generateContent(userInstruction: string, messages: Anthropic.Messages.MessageParam[], config: AgentImageConfig): Promise<ApiStreamImageChunk>;
16
+ private resolveImageSources;
17
+ }
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenRouterHandler = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ const message_converer_1 = require("./message_converer");
9
+ class OpenRouterHandler {
10
+ constructor(openrouterConfig) {
11
+ this.lastGenerationId = null;
12
+ this.openrouterConfig = openrouterConfig;
13
+ if (!this.openrouterConfig.baseUrl) {
14
+ this.openrouterConfig.baseUrl = 'https://openrouter.ai/api/v1';
15
+ }
16
+ }
17
+ createOpenaiClient() {
18
+ if (this.client) {
19
+ return this.client;
20
+ }
21
+ try {
22
+ this.client = new openai_1.default({
23
+ baseURL: this.openrouterConfig.baseUrl,
24
+ apiKey: this.openrouterConfig.apiKey,
25
+ });
26
+ }
27
+ catch (error) {
28
+ throw new Error(`openrouter: error create client: ${error.meesage}`);
29
+ }
30
+ return this.client;
31
+ }
32
+ async *chatCompletion(systemPormpt, messages, tools) {
33
+ const client = this.createOpenaiClient();
34
+ const stream = await this.createOpenRouterStream(client, systemPormpt, messages, tools);
35
+ let didOutputUsage = false;
36
+ for await (const chunk of stream) {
37
+ const choice = chunk.choices?.[0];
38
+ if (choice?.finish_reason === 'error') {
39
+ const choiceWithError = choice;
40
+ if (choiceWithError.error) {
41
+ const error = choiceWithError.error;
42
+ console.error(`OpenRouter Mid-Stream Error: ${error?.code || 'Unknown'} - ${error?.message || 'Unknown error'}`);
43
+ const errorDetails = typeof error === 'object'
44
+ ? JSON.stringify(error, null, 2)
45
+ : String(error);
46
+ throw new Error(`OpenRouter Mid-Stream Error: ${errorDetails}`);
47
+ }
48
+ else {
49
+ throw new Error(`OpenRouter Mid-Stream Error: Stream terminated with error status but no error details provided`);
50
+ }
51
+ }
52
+ if (!this.lastGenerationId && chunk.id) {
53
+ this.lastGenerationId = chunk.id;
54
+ }
55
+ const delta = chunk.choices[0]?.delta;
56
+ if (delta?.content) {
57
+ yield {
58
+ type: 'text',
59
+ text: delta.content,
60
+ };
61
+ }
62
+ if (!didOutputUsage && chunk.usage) {
63
+ yield {
64
+ type: 'usage',
65
+ cacheWriteTokens: 0,
66
+ cacheReadTokens: chunk.usage.prompt_tokens_details?.cached_tokens || 0,
67
+ inputTokens: (chunk.usage.prompt_tokens || 0) -
68
+ (chunk.usage.prompt_tokens_details?.cached_tokens || 0),
69
+ outputTokens: chunk.usage.completion_tokens || 0,
70
+ totalCost: chunk.usage.total_tokens || 0,
71
+ };
72
+ didOutputUsage = true;
73
+ }
74
+ }
75
+ }
76
+ async createOpenRouterStream(client, systemPrompt, messages, tools) {
77
+ const openapiMessages = [
78
+ { role: 'system', content: systemPrompt },
79
+ ...(0, message_converer_1.convertToOpenAiMessages)(messages),
80
+ ];
81
+ return client.chat.completions.create({
82
+ model: this.openrouterConfig.modelName || '',
83
+ messages: openapiMessages,
84
+ stream: true,
85
+ tools: tools,
86
+ // @ts-ignore
87
+ modalities: ['image', 'text']
88
+ });
89
+ }
90
+ async generateContent(userInstruction, messages, config) {
91
+ void config;
92
+ const preparedMessages = await this.resolveImageSources(messages);
93
+ const openaiMessages = (0, message_converer_1.convertToOpenAiMessages)(preparedMessages);
94
+ if (userInstruction) {
95
+ openaiMessages.unshift({
96
+ role: 'user',
97
+ content: [
98
+ {
99
+ type: 'text',
100
+ text: userInstruction,
101
+ },
102
+ ],
103
+ });
104
+ }
105
+ const response = await fetch(`${this.openrouterConfig.baseUrl}/chat/completions`, {
106
+ method: 'POST',
107
+ headers: {
108
+ Authorization: `Bearer ${this.openrouterConfig.apiKey}`,
109
+ 'Content-Type': 'application/json',
110
+ },
111
+ body: JSON.stringify({
112
+ model: this.openrouterConfig.modelName || '',
113
+ messages: openaiMessages,
114
+ modalities: ['image', 'text'],
115
+ imageConfig: {
116
+ aspectRatio: config.aspectRatio,
117
+ imageSize: config.imageSize,
118
+ },
119
+ }),
120
+ });
121
+ if (!response.ok) {
122
+ const errorPayload = await response.text();
123
+ throw new Error(`openrouter: generateContent failed with status ${response.status}: ${errorPayload}`);
124
+ }
125
+ const data = await response.json();
126
+ const result = {
127
+ type: 'image',
128
+ data: [],
129
+ text: undefined,
130
+ thinking: undefined,
131
+ };
132
+ const content = data?.choices?.[0]?.message?.content;
133
+ if (Array.isArray(content)) {
134
+ for (const part of content) {
135
+ if (part.type === 'text' && part.text) {
136
+ result.text = result.text ? `${result.text}\n${part.text}` : part.text;
137
+ }
138
+ else if (part.type === 'image_url' && part.image_url?.url) {
139
+ result.data.push(part.image_url.url);
140
+ }
141
+ }
142
+ }
143
+ else if (typeof content === 'string') {
144
+ result.text = content;
145
+ result.thinking = data?.choices?.[0]?.message?.reasoning;
146
+ }
147
+ const images = data?.choices?.[0]?.message?.images;
148
+ if (Array.isArray(images)) {
149
+ for (const img of images) {
150
+ if (img?.image_url?.url) {
151
+ result.data.push(img.image_url.url);
152
+ }
153
+ }
154
+ }
155
+ return result;
156
+ }
157
+ async resolveImageSources(messages) {
158
+ return Promise.all(messages.map(async (message) => {
159
+ if (!Array.isArray(message.content)) {
160
+ return message;
161
+ }
162
+ const resolvedContent = await Promise.all(message.content.map(async (part) => {
163
+ if (part.type !== 'image' ||
164
+ !part.source ||
165
+ part.source.type !== 'path') {
166
+ return part;
167
+ }
168
+ return part;
169
+ }));
170
+ return {
171
+ ...message,
172
+ content: resolvedContent,
173
+ };
174
+ }));
175
+ }
176
+ }
177
+ exports.OpenRouterHandler = OpenRouterHandler;
178
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from '../types/stream';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("../types/stream"), exports);
18
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/providers/stream.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA+B"}
@@ -0,0 +1 @@
1
+ export { TaskStorage } from './task-storage';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TaskStorage = void 0;
4
+ var task_storage_1 = require("./task-storage");
5
+ Object.defineProperty(exports, "TaskStorage", { enumerable: true, get: function () { return task_storage_1.TaskStorage; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAAnC,2GAAA,WAAW,OAAA"}