@absolutejs/absolute 0.19.0-beta.245 → 0.19.0-beta.247
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/.absolutejs/vue-tsc.tsbuildinfo +1 -1
- package/.claude/settings.local.json +4 -1
- package/dist/ai/index.js +65 -5
- package/dist/ai/index.js.map +6 -6
- package/dist/ai/providers/anthropic.js +17 -1
- package/dist/ai/providers/anthropic.js.map +3 -3
- package/dist/ai/providers/openai.js +25 -2
- package/dist/ai/providers/openai.js.map +3 -3
- package/dist/ai/providers/openaiCompatible.js +25 -2
- package/dist/ai/providers/openaiCompatible.js.map +3 -3
- package/dist/ai-client/angular/ai/index.js +32 -0
- package/dist/ai-client/react/ai/index.js +35 -1
- package/dist/ai-client/vue/ai/index.js +32 -0
- package/dist/angular/ai/index.js +33 -1
- package/dist/angular/ai/index.js.map +5 -5
- package/dist/build.js +3 -1
- package/dist/build.js.map +3 -3
- package/dist/index.js +3 -1
- package/dist/index.js.map +3 -3
- package/dist/react/ai/index.js +36 -2
- package/dist/react/ai/index.js.map +6 -6
- package/dist/src/ai/client/actions.d.ts +13 -0
- package/dist/src/react/ai/useAIStream.d.ts +5 -1
- package/dist/svelte/ai/index.js +33 -1
- package/dist/svelte/ai/index.js.map +5 -5
- package/dist/types/ai.d.ts +46 -2
- package/dist/vue/ai/index.js +33 -1
- package/dist/vue/ai/index.js.map +5 -5
- package/package.json +7 -7
- package/test-upload.png +0 -0
- package/types/ai.ts +40 -1
- package/types/typeGuards.ts +7 -0
|
@@ -260,7 +260,10 @@
|
|
|
260
260
|
"Bash(xargs -r kill -9)",
|
|
261
261
|
"mcp__playwright__browser_type",
|
|
262
262
|
"Bash(ollama list:*)",
|
|
263
|
-
"WebFetch(domain:platform.openai.com)"
|
|
263
|
+
"WebFetch(domain:platform.openai.com)",
|
|
264
|
+
"Bash(bunx absolute:*)",
|
|
265
|
+
"mcp__playwright__browser_file_upload",
|
|
266
|
+
"WebFetch(domain:docs.anthropic.com)"
|
|
264
267
|
]
|
|
265
268
|
}
|
|
266
269
|
}
|
package/dist/ai/index.js
CHANGED
|
@@ -102,6 +102,8 @@ var isValidAIClientMessage = (data) => {
|
|
|
102
102
|
switch (data.type) {
|
|
103
103
|
case "chunk":
|
|
104
104
|
return "content" in data && typeof data.content === "string" && "messageId" in data && "conversationId" in data;
|
|
105
|
+
case "thinking":
|
|
106
|
+
return "content" in data && typeof data.content === "string" && "messageId" in data && "conversationId" in data;
|
|
105
107
|
case "tool_status":
|
|
106
108
|
return "name" in data && "status" in data && "messageId" in data && "conversationId" in data;
|
|
107
109
|
case "complete":
|
|
@@ -201,9 +203,32 @@ var mapToolDefinitions = (tools) => tools.map((tool) => ({
|
|
|
201
203
|
},
|
|
202
204
|
type: "function"
|
|
203
205
|
}));
|
|
206
|
+
var mapOpenAIContent = (msg) => {
|
|
207
|
+
if (typeof msg.content === "string") {
|
|
208
|
+
return msg.content;
|
|
209
|
+
}
|
|
210
|
+
const hasImages = msg.content.some((block) => block.type === "image");
|
|
211
|
+
if (!hasImages) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
const blocks = [];
|
|
215
|
+
for (const block of msg.content) {
|
|
216
|
+
if (block.type === "image") {
|
|
217
|
+
blocks.push({
|
|
218
|
+
image_url: {
|
|
219
|
+
url: `data:${block.source.media_type};base64,${block.source.data}`
|
|
220
|
+
},
|
|
221
|
+
type: "image_url"
|
|
222
|
+
});
|
|
223
|
+
} else if (block.type === "text") {
|
|
224
|
+
blocks.push({ text: block.content, type: "text" });
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return blocks;
|
|
228
|
+
};
|
|
204
229
|
var buildRequestBody = (params) => {
|
|
205
230
|
const messages = convertToolResultMessages(params.messages.map((msg) => ({
|
|
206
|
-
content:
|
|
231
|
+
content: mapOpenAIContent(msg),
|
|
207
232
|
role: msg.role
|
|
208
233
|
})), params);
|
|
209
234
|
const body = {
|
|
@@ -706,11 +731,16 @@ var processToolTurn = async (socket, options, state, messageId, conversationId,
|
|
|
706
731
|
role: "user"
|
|
707
732
|
});
|
|
708
733
|
const toolDefs = options.tools ? buildToolDefinitions(options.tools) : undefined;
|
|
734
|
+
const thinkingConfig = options.thinking ? {
|
|
735
|
+
budget_tokens: typeof options.thinking === "object" ? options.thinking.budgetTokens : 1e4,
|
|
736
|
+
type: "enabled"
|
|
737
|
+
} : undefined;
|
|
709
738
|
const stream = options.provider.stream({
|
|
710
739
|
messages: state.currentMessages,
|
|
711
740
|
model: options.model,
|
|
712
741
|
signal,
|
|
713
742
|
systemPrompt: options.systemPrompt,
|
|
743
|
+
thinking: thinkingConfig,
|
|
714
744
|
tools: toolDefs
|
|
715
745
|
});
|
|
716
746
|
return consumeToolStream(stream, state, options, socket, messageId, conversationId, signal);
|
|
@@ -797,11 +827,16 @@ var processStreamToolUseChunk = async (chunk, socket, options, messages, message
|
|
|
797
827
|
};
|
|
798
828
|
var processStream = async (socket, options, messages, messageId, conversationId, signal, startTime) => {
|
|
799
829
|
const toolDefs = options.tools ? buildToolDefinitions(options.tools) : undefined;
|
|
830
|
+
const thinkingConfig = options.thinking ? {
|
|
831
|
+
budget_tokens: typeof options.thinking === "object" ? options.thinking.budgetTokens : 1e4,
|
|
832
|
+
type: "enabled"
|
|
833
|
+
} : undefined;
|
|
800
834
|
const stream = options.provider.stream({
|
|
801
835
|
messages,
|
|
802
836
|
model: options.model,
|
|
803
837
|
signal,
|
|
804
838
|
systemPrompt: options.systemPrompt,
|
|
839
|
+
thinking: thinkingConfig,
|
|
805
840
|
tools: toolDefs
|
|
806
841
|
});
|
|
807
842
|
const result = await consumeStream(stream, options, socket, messages, messageId, conversationId, signal, startTime);
|
|
@@ -812,6 +847,14 @@ var processStream = async (socket, options, messages, messageId, conversationId,
|
|
|
812
847
|
};
|
|
813
848
|
var consumeStreamChunk = async (chunk, options, socket, messages, messageId, conversationId, signal, fullResponse, startTime) => {
|
|
814
849
|
switch (chunk.type) {
|
|
850
|
+
case "thinking":
|
|
851
|
+
await sendMessage(socket, {
|
|
852
|
+
content: chunk.content,
|
|
853
|
+
conversationId,
|
|
854
|
+
messageId,
|
|
855
|
+
type: "thinking"
|
|
856
|
+
});
|
|
857
|
+
return "";
|
|
815
858
|
case "text":
|
|
816
859
|
return processStreamTextChunk(chunk, options, socket, messageId, conversationId);
|
|
817
860
|
case "tool_use":
|
|
@@ -891,7 +934,7 @@ var aiChat = (config) => {
|
|
|
891
934
|
ws.send(JSON.stringify({ conversationId: newConvId, type: "branched" }));
|
|
892
935
|
}
|
|
893
936
|
};
|
|
894
|
-
const handleUserMessage = async (ws, rawContent, rawConversationId) => {
|
|
937
|
+
const handleUserMessage = async (ws, rawContent, rawConversationId, attachments) => {
|
|
895
938
|
const conversationId = rawConversationId ?? crypto.randomUUID();
|
|
896
939
|
const messageId = crypto.randomUUID();
|
|
897
940
|
const parsed = parseProvider(rawContent);
|
|
@@ -900,6 +943,7 @@ var aiChat = (config) => {
|
|
|
900
943
|
const history = conversations.getHistory(conversationId);
|
|
901
944
|
const controller = conversations.getAbortController(conversationId);
|
|
902
945
|
conversations.appendMessage(conversationId, {
|
|
946
|
+
attachments,
|
|
903
947
|
content,
|
|
904
948
|
conversationId,
|
|
905
949
|
id: messageId,
|
|
@@ -920,11 +964,27 @@ var aiChat = (config) => {
|
|
|
920
964
|
};
|
|
921
965
|
const model = resolveModel();
|
|
922
966
|
const resolvedTools = typeof config.tools === "function" ? config.tools(providerName, model) : config.tools;
|
|
967
|
+
const userMessage = attachments && attachments.length > 0 ? {
|
|
968
|
+
content: [
|
|
969
|
+
...attachments.map((att) => ({
|
|
970
|
+
source: {
|
|
971
|
+
data: att.data,
|
|
972
|
+
media_type: att.media_type,
|
|
973
|
+
type: "base64"
|
|
974
|
+
},
|
|
975
|
+
type: "image"
|
|
976
|
+
})),
|
|
977
|
+
{ content, type: "text" }
|
|
978
|
+
],
|
|
979
|
+
role: "user"
|
|
980
|
+
} : { content, role: "user" };
|
|
981
|
+
const resolvedThinking = typeof config.thinking === "function" ? config.thinking(providerName, model) : config.thinking;
|
|
923
982
|
await streamAI(ws, conversationId, messageId, {
|
|
924
983
|
maxTurns: config.maxTurns,
|
|
925
|
-
messages: [...history,
|
|
984
|
+
messages: [...history, userMessage],
|
|
926
985
|
model,
|
|
927
986
|
provider: config.provider(providerName),
|
|
987
|
+
thinking: resolvedThinking,
|
|
928
988
|
signal: controller.signal,
|
|
929
989
|
systemPrompt: config.systemPrompt,
|
|
930
990
|
tools: resolvedTools,
|
|
@@ -955,7 +1015,7 @@ var aiChat = (config) => {
|
|
|
955
1015
|
return;
|
|
956
1016
|
}
|
|
957
1017
|
if (msg.type === "message") {
|
|
958
|
-
await handleUserMessage(ws, msg.content, msg.conversationId);
|
|
1018
|
+
await handleUserMessage(ws, msg.content, msg.conversationId, msg.attachments);
|
|
959
1019
|
}
|
|
960
1020
|
}
|
|
961
1021
|
}).get(`${path}/conversations`, () => conversations.list()).get(`${path}/conversations/:id`, ({ params }) => {
|
|
@@ -990,5 +1050,5 @@ export {
|
|
|
990
1050
|
aiChat
|
|
991
1051
|
};
|
|
992
1052
|
|
|
993
|
-
//# debugId=
|
|
1053
|
+
//# debugId=0917CFAC1D8BB99A64756E2164756E21
|
|
994
1054
|
//# sourceMappingURL=index.js.map
|
package/dist/ai/index.js.map
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../types/typeGuards.ts", "../src/ai/providers/openai.ts", "../src/ai/providers/openaiCompatible.ts", "../src/plugins/aiChat.ts", "../src/ai/protocol.ts", "../src/ai/conversationManager.ts", "../src/ai/streamAI.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { AIClientMessage, AIServerMessage } from './ai';\nimport type { HMRClientMessage } from './messages';\n\n/* Type guard for AI client messages */\nexport const isValidAIClientMessage = (\n\tdata: unknown\n): data is AIClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'message':\n\t\t\treturn 'content' in data && typeof data.content === 'string';\n\t\tcase 'cancel':\n\t\t\treturn (\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tcase 'branch':\n\t\t\treturn (\n\t\t\t\t'messageId' in data &&\n\t\t\t\ttypeof data.messageId === 'string' &&\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for AI server messages */\nexport const isValidAIServerMessage = (\n\tdata: unknown\n): data is AIServerMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'chunk':\n\t\t\treturn (\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'tool_status':\n\t\t\treturn (\n\t\t\t\t'name' in data &&\n\t\t\t\t'status' in data &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'complete':\n\t\t\treturn 'messageId' in data && 'conversationId' in data;\n\t\tcase 'error':\n\t\t\treturn 'message' in data && typeof data.message === 'string';\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for HMR client messages */\nexport const isValidHMRClientMessage = (\n\tdata: unknown\n): data is HMRClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'ping':\n\t\t\treturn true;\n\t\tcase 'ready':\n\t\t\treturn true;\n\t\tcase 'request-rebuild':\n\t\t\treturn true;\n\t\tcase 'hydration-error':\n\t\t\treturn true;\n\t\tcase 'hmr-timing':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n",
|
|
6
|
-
"import type {\n\tAIProviderConfig,\n\tAIProviderContentBlock,\n\tAIProviderMessage,\n\tAIProviderStreamParams,\n\tAIProviderToolDefinition,\n\tAIUsage\n} from '../../../types/ai';\n\ntype OpenAIConfig = {\n\tapiKey: string;\n\tbaseUrl?: string;\n};\n\ntype OpenAIMessage = {\n\tcontent: string | null;\n\trole: 'user' | 'assistant' | 'system' | 'tool';\n\ttool_call_id?: string;\n\ttool_calls?: Array<{\n\t\tfunction: { arguments: string; name: string };\n\t\tid: string;\n\t\ttype: 'function';\n\t}>;\n};\n\ntype PendingToolCall = {\n\targuments: string;\n\tid: string;\n\tname: string;\n};\n\ntype UsageRef = {\n\tcurrent: AIUsage | undefined;\n};\n\ntype StreamState = {\n\tbuffer: string;\n\tpendingToolCalls: Map<number, PendingToolCall>;\n\tusageRef: UsageRef;\n};\n\nconst DEFAULT_BASE_URL = 'https://api.openai.com';\nconst SSE_DATA_PREFIX_LENGTH = 6;\nconst DONE_SENTINEL = '[DONE]';\nconst NOT_FOUND = -1;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nconst isRecordArray = (\n\tvalue: unknown\n): value is Array<Record<string, unknown>> =>\n\tArray.isArray(value) && value.length > 0 && isRecord(value[0]);\n\nconst isToolResultBlock = (\n\tblock: AIProviderContentBlock\n): block is AIProviderContentBlock & {\n\tcontent: string;\n\ttool_use_id: string;\n\ttype: 'tool_result';\n} => block.type === 'tool_result';\n\nconst hasArrayContent = (\n\tmsg: AIProviderMessage\n): msg is AIProviderMessage & { content: AIProviderContentBlock[] } =>\n\ttypeof msg.content !== 'string' && Array.isArray(msg.content);\n\nconst buildToolMessages = (\n\tblocks: AIProviderContentBlock[]\n) => {\n\tconst toolUseBlocks = blocks.filter((block) => block.type === 'tool_use');\n\tconst toolResultBlocks = blocks.filter((block) => block.type === 'tool_result');\n\tconst messages: OpenAIMessage[] = [];\n\n\tif (toolUseBlocks.length > 0) {\n\t\tmessages.push({\n\t\t\tcontent: null,\n\t\t\trole: 'assistant',\n\t\t\ttool_calls: toolUseBlocks.map((block) => ({\n\t\t\t\tfunction: {\n\t\t\t\t\targuments: typeof block.input === 'string'\n\t\t\t\t\t\t? block.input\n\t\t\t\t\t\t: JSON.stringify(block.input),\n\t\t\t\t\tname: block.name\n\t\t\t\t},\n\t\t\t\tid: block.id,\n\t\t\t\ttype: 'function' as const\n\t\t\t}))\n\t\t});\n\t}\n\n\tfor (const result of toolResultBlocks) {\n\t\tmessages.push({\n\t\t\tcontent: typeof result.content === 'string' ? result.content : '',\n\t\t\trole: 'tool',\n\t\t\ttool_call_id: result.tool_use_id\n\t\t});\n\t}\n\n\treturn messages;\n};\n\nconst processMessageAtIndex = (\n\tresult: OpenAIMessage[],\n\tmsg: AIProviderMessage,\n\tidx: number\n) => {\n\tif (!hasArrayContent(msg)) {\n\t\treturn;\n\t}\n\n\tconst hasToolBlocks = msg.content.some(\n\t\t(block) => block.type === 'tool_use' || block.type === 'tool_result'\n\t);\n\n\tif (!hasToolBlocks) {\n\t\treturn;\n\t}\n\n\tconst toolMessages = buildToolMessages(msg.content);\n\tresult.splice(idx, 1, ...toolMessages);\n};\n\nconst convertSingleMessage = (\n\tresult: OpenAIMessage[],\n\tmsg: AIProviderMessage | undefined,\n\tidx: number\n) => {\n\tif (!msg) {\n\t\treturn;\n\t}\n\n\tprocessMessageAtIndex(result, msg, idx);\n};\n\nconst convertToolResultMessages = (\n\tmessages: OpenAIMessage[],\n\tparams: AIProviderStreamParams\n) => {\n\tconst result = [...messages];\n\n\tfor (let idx = 0; idx < params.messages.length; idx++) {\n\t\tconvertSingleMessage(result, params.messages[idx], idx);\n\t}\n\n\treturn result;\n};\n\nconst mapToolDefinitions = (tools: AIProviderToolDefinition[]) =>\n\ttools.map((tool) => ({\n\t\tfunction: {\n\t\t\tdescription: tool.description,\n\t\t\tname: tool.name,\n\t\t\tparameters: tool.input_schema\n\t\t},\n\t\ttype: 'function'\n\t}));\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n\tconst messages = convertToolResultMessages(\n\t\tparams.messages.map((msg) => ({\n\t\t\tcontent: typeof msg.content === 'string' ? msg.content : null,\n\t\t\trole: msg.role\n\t\t})),\n\t\tparams\n\t);\n\n\tconst body: Record<string, unknown> = {\n\t\tmessages,\n\t\tmodel: params.model,\n\t\tstream: true,\n\t\tstream_options: { include_usage: true }\n\t};\n\n\tif (params.tools && params.tools.length > 0) {\n\t\tbody.tools = mapToolDefinitions(params.tools);\n\t}\n\n\treturn body;\n};\n\nconst parseToolInput = (rawArguments: string) => {\n\ttry {\n\t\treturn JSON.parse(rawArguments);\n\t} catch {\n\t\treturn rawArguments;\n\t}\n};\n\nconst flushPendingToolCalls = function* (\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tfor (const [, tool] of pendingToolCalls) {\n\t\tconst input = parseToolInput(tool.arguments);\n\t\tyield {\n\t\t\tid: tool.id,\n\t\t\tinput,\n\t\t\tname: tool.name,\n\t\t\ttype: 'tool_use' as const\n\t\t};\n\t}\n\n\tpendingToolCalls.clear();\n};\n\nconst extractUsage = (parsedUsage: Record<string, number>) => ({\n\tinputTokens: parsedUsage.prompt_tokens ?? 0,\n\toutputTokens: parsedUsage.completion_tokens ?? 0\n});\n\nconst resolveToolCallIndex = (toolCall: Record<string, unknown>) => {\n\tconst raw = typeof toolCall.index === 'number' ? toolCall.index : NOT_FOUND;\n\n\treturn raw < 0 ? undefined : raw;\n};\n\nconst initPendingToolCall = (\n\ttoolCall: Record<string, unknown>,\n\tfunc: Record<string, unknown> | null,\n\tindex: number,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tif (pendingToolCalls.has(index)) {\n\t\treturn;\n\t}\n\n\tconst toolId = typeof toolCall.id === 'string' ? toolCall.id : '';\n\tconst toolName = func && typeof func.name === 'string' ? func.name : '';\n\n\tpendingToolCalls.set(index, {\n\t\targuments: '',\n\t\tid: toolId,\n\t\tname: toolName\n\t});\n};\n\nconst updatePendingToolCall = (\n\ttoolCall: Record<string, unknown>,\n\tfunc: Record<string, unknown> | null,\n\tpending: PendingToolCall\n) => {\n\tif (typeof toolCall.id === 'string') {\n\t\tpending.id = toolCall.id;\n\t}\n\n\tif (func && typeof func.name === 'string') {\n\t\tpending.name = func.name;\n\t}\n\n\tif (func && typeof func.arguments === 'string') {\n\t\tpending.arguments += func.arguments;\n\t}\n};\n\nconst processToolCallDelta = (\n\ttoolCall: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tconst index = resolveToolCallIndex(toolCall);\n\tif (index === undefined) {\n\t\treturn;\n\t}\n\n\tconst func = isRecord(toolCall.function) ? toolCall.function : null;\n\tinitPendingToolCall(toolCall, func, index, pendingToolCalls);\n\n\tconst pending = pendingToolCalls.get(index);\n\tif (!pending) {\n\t\treturn;\n\t}\n\n\tupdatePendingToolCall(toolCall, func, pending);\n};\n\nconst processToolCallDeltas = (\n\ttoolCalls: Array<Record<string, unknown>>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tfor (const toolCall of toolCalls) {\n\t\tprocessToolCallDelta(toolCall, pendingToolCalls);\n\t}\n};\n\nconst processDelta = function* (\n\tdelta: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tif (typeof delta.content === 'string') {\n\t\tyield { content: delta.content, type: 'text' as const };\n\t}\n\n\tif (isRecordArray(delta.tool_calls)) {\n\t\tprocessToolCallDeltas(delta.tool_calls, pendingToolCalls);\n\t}\n};\n\nconst processChoice = function* (\n\tchoice: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tconst delta = isRecord(choice.delta) ? choice.delta : null;\n\tif (delta) {\n\t\tyield* processDelta(delta, pendingToolCalls);\n\t}\n\n\tif (choice.finish_reason === 'tool_calls') {\n\t\tyield* flushPendingToolCalls(pendingToolCalls);\n\t}\n};\n\nconst narrowUsageRecord = (parsed: Record<string, unknown>) => {\n\tif (!isRecord(parsed.usage)) {\n\t\treturn undefined;\n\t}\n\n\tconst { usage } = parsed;\n\tconst promptTokens =\n\t\ttypeof usage.prompt_tokens === 'number' ? usage.prompt_tokens : 0;\n\tconst completionTokens =\n\t\ttypeof usage.completion_tokens === 'number'\n\t\t\t? usage.completion_tokens\n\t\t\t: 0;\n\n\treturn extractUsage({\n\t\tcompletion_tokens: completionTokens,\n\t\tprompt_tokens: promptTokens\n\t});\n};\n\nconst processSSELine = function* (\n\tline: string,\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tcurrentUsage: AIUsage | undefined\n) {\n\tconst trimmed = line.trim();\n\tif (!trimmed || !trimmed.startsWith('data: ')) {\n\t\treturn;\n\t}\n\n\tconst data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);\n\tif (data === DONE_SENTINEL) {\n\t\tyield* flushPendingToolCalls(pendingToolCalls);\n\t\tyield { type: 'done' as const, usage: currentUsage };\n\n\t\treturn;\n\t}\n\n\tlet parsed: Record<string, unknown>;\n\ttry {\n\t\tparsed = JSON.parse(data);\n\t} catch {\n\t\treturn;\n\t}\n\n\tconst usageUpdate = narrowUsageRecord(parsed);\n\tif (usageUpdate) {\n\t\tyield { type: 'usage_update' as const, usage: usageUpdate };\n\t}\n\n\tconst { choices } = parsed;\n\tif (!isRecordArray(choices)) {\n\t\treturn;\n\t}\n\n\tconst [firstChoice] = choices;\n\tif (!firstChoice) {\n\t\treturn;\n\t}\n\n\tyield* processChoice(firstChoice, pendingToolCalls);\n};\n\nconst isUsageUpdate = (chunk: {\n\ttype: string;\n\tusage?: AIUsage;\n}): chunk is { type: 'usage_update'; usage: AIUsage } =>\n\tchunk.type === 'usage_update';\n\nconst collectYieldableChunks = (\n\tline: string,\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tusageRef: UsageRef\n) => {\n\tconst allChunks = Array.from(\n\t\tprocessSSELine(line, pendingToolCalls, usageRef.current)\n\t);\n\tconst usageChunks = allChunks.filter(isUsageUpdate);\n\tconst lastUsage = usageChunks.at(NOT_FOUND);\n\n\tif (lastUsage) {\n\t\tusageRef.current = lastUsage.usage;\n\t}\n\n\treturn allChunks.filter((chunk) => !isUsageUpdate(chunk));\n};\n\nconst processSSELines = function* (\n\tlines: string[],\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tusageRef: UsageRef\n) {\n\tfor (const line of lines) {\n\t\tyield* collectYieldableChunks(line, pendingToolCalls, usageRef);\n\t}\n};\n\nconst processStreamValue = (\n\tvalue: Uint8Array,\n\tdecoder: TextDecoder,\n\tstate: StreamState\n) => {\n\tstate.buffer += decoder.decode(value, { stream: true });\n\tconst lines = state.buffer.split('\\n');\n\tstate.buffer = lines.pop() ?? '';\n\n\treturn lines;\n};\n\nconst drainReader = async function* (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tstate: StreamState,\n\tsignal?: AbortSignal\n) {\n\t/* eslint-disable no-await-in-loop */\n\tfor (\n\t\tlet result = await reader.read();\n\t\t!result.done && !signal?.aborted;\n\t\tresult = await reader.read()\n\t) {\n\t\t/* eslint-enable no-await-in-loop */\n\t\tconst lines = processStreamValue(result.value, decoder, state);\n\t\tyield* processSSELines(lines, state.pendingToolCalls, state.usageRef);\n\t}\n};\n\nconst parseSSEStream = async function* (\n\tbody: ReadableStream<Uint8Array>,\n\tsignal?: AbortSignal\n) {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tconst state: StreamState = {\n\t\tbuffer: '',\n\t\tpendingToolCalls: new Map<number, PendingToolCall>(),\n\t\tusageRef: { current: undefined }\n\t};\n\n\ttry {\n\t\tyield* drainReader(reader, decoder, state, signal);\n\t\tyield { type: 'done' as const, usage: state.usageRef.current };\n\t} finally {\n\t\treader.releaseLock();\n\t}\n};\n\nconst fetchOpenAIStream = async function* (\n\tbaseUrl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\tsignal?: AbortSignal\n) {\n\tconst response = await fetch(`${baseUrl}/v1/chat/completions`, {\n\t\tbody: JSON.stringify(body),\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t'Content-Type': 'application/json'\n\t\t},\n\t\tmethod: 'POST',\n\t\tsignal\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`OpenAI API error ${response.status}: ${errorText}`);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('OpenAI API returned no response body');\n\t}\n\n\tyield* parseSSEStream(response.body, signal);\n};\n\nexport const openai = (config: OpenAIConfig): AIProviderConfig => {\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n\treturn {\n\t\tstream: (params: AIProviderStreamParams) => {\n\t\t\tconst body = buildRequestBody(params);\n\n\t\t\treturn fetchOpenAIStream(\n\t\t\t\tbaseUrl,\n\t\t\t\tconfig.apiKey,\n\t\t\t\tbody,\n\t\t\t\tparams.signal\n\t\t\t);\n\t\t}\n\t};\n};\n",
|
|
5
|
+
"import type { AIClientMessage, AIServerMessage } from './ai';\nimport type { HMRClientMessage } from './messages';\n\n/* Type guard for AI client messages */\nexport const isValidAIClientMessage = (\n\tdata: unknown\n): data is AIClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'message':\n\t\t\treturn 'content' in data && typeof data.content === 'string';\n\t\tcase 'cancel':\n\t\t\treturn (\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tcase 'branch':\n\t\t\treturn (\n\t\t\t\t'messageId' in data &&\n\t\t\t\ttypeof data.messageId === 'string' &&\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for AI server messages */\nexport const isValidAIServerMessage = (\n\tdata: unknown\n): data is AIServerMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'chunk':\n\t\t\treturn (\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'thinking':\n\t\t\treturn (\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'tool_status':\n\t\t\treturn (\n\t\t\t\t'name' in data &&\n\t\t\t\t'status' in data &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'complete':\n\t\t\treturn 'messageId' in data && 'conversationId' in data;\n\t\tcase 'error':\n\t\t\treturn 'message' in data && typeof data.message === 'string';\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for HMR client messages */\nexport const isValidHMRClientMessage = (\n\tdata: unknown\n): data is HMRClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'ping':\n\t\t\treturn true;\n\t\tcase 'ready':\n\t\t\treturn true;\n\t\tcase 'request-rebuild':\n\t\t\treturn true;\n\t\tcase 'hydration-error':\n\t\t\treturn true;\n\t\tcase 'hmr-timing':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n",
|
|
6
|
+
"import type {\n\tAIProviderConfig,\n\tAIProviderContentBlock,\n\tAIProviderMessage,\n\tAIProviderStreamParams,\n\tAIProviderToolDefinition,\n\tAIUsage\n} from '../../../types/ai';\n\ntype OpenAIConfig = {\n\tapiKey: string;\n\tbaseUrl?: string;\n};\n\ntype OpenAIMessage = {\n\tcontent: string | Array<Record<string, unknown>> | null;\n\trole: 'user' | 'assistant' | 'system' | 'tool';\n\ttool_call_id?: string;\n\ttool_calls?: Array<{\n\t\tfunction: { arguments: string; name: string };\n\t\tid: string;\n\t\ttype: 'function';\n\t}>;\n};\n\ntype PendingToolCall = {\n\targuments: string;\n\tid: string;\n\tname: string;\n};\n\ntype UsageRef = {\n\tcurrent: AIUsage | undefined;\n};\n\ntype StreamState = {\n\tbuffer: string;\n\tpendingToolCalls: Map<number, PendingToolCall>;\n\tusageRef: UsageRef;\n};\n\nconst DEFAULT_BASE_URL = 'https://api.openai.com';\nconst SSE_DATA_PREFIX_LENGTH = 6;\nconst DONE_SENTINEL = '[DONE]';\nconst NOT_FOUND = -1;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nconst isRecordArray = (\n\tvalue: unknown\n): value is Array<Record<string, unknown>> =>\n\tArray.isArray(value) && value.length > 0 && isRecord(value[0]);\n\nconst isToolResultBlock = (\n\tblock: AIProviderContentBlock\n): block is AIProviderContentBlock & {\n\tcontent: string;\n\ttool_use_id: string;\n\ttype: 'tool_result';\n} => block.type === 'tool_result';\n\nconst hasArrayContent = (\n\tmsg: AIProviderMessage\n): msg is AIProviderMessage & { content: AIProviderContentBlock[] } =>\n\ttypeof msg.content !== 'string' && Array.isArray(msg.content);\n\nconst buildToolMessages = (\n\tblocks: AIProviderContentBlock[]\n) => {\n\tconst toolUseBlocks = blocks.filter((block) => block.type === 'tool_use');\n\tconst toolResultBlocks = blocks.filter((block) => block.type === 'tool_result');\n\tconst messages: OpenAIMessage[] = [];\n\n\tif (toolUseBlocks.length > 0) {\n\t\tmessages.push({\n\t\t\tcontent: null,\n\t\t\trole: 'assistant',\n\t\t\ttool_calls: toolUseBlocks.map((block) => ({\n\t\t\t\tfunction: {\n\t\t\t\t\targuments: typeof block.input === 'string'\n\t\t\t\t\t\t? block.input\n\t\t\t\t\t\t: JSON.stringify(block.input),\n\t\t\t\t\tname: block.name\n\t\t\t\t},\n\t\t\t\tid: block.id,\n\t\t\t\ttype: 'function' as const\n\t\t\t}))\n\t\t});\n\t}\n\n\tfor (const result of toolResultBlocks) {\n\t\tmessages.push({\n\t\t\tcontent: typeof result.content === 'string' ? result.content : '',\n\t\t\trole: 'tool',\n\t\t\ttool_call_id: result.tool_use_id\n\t\t});\n\t}\n\n\treturn messages;\n};\n\nconst processMessageAtIndex = (\n\tresult: OpenAIMessage[],\n\tmsg: AIProviderMessage,\n\tidx: number\n) => {\n\tif (!hasArrayContent(msg)) {\n\t\treturn;\n\t}\n\n\tconst hasToolBlocks = msg.content.some(\n\t\t(block) => block.type === 'tool_use' || block.type === 'tool_result'\n\t);\n\n\tif (!hasToolBlocks) {\n\t\treturn;\n\t}\n\n\tconst toolMessages = buildToolMessages(msg.content);\n\tresult.splice(idx, 1, ...toolMessages);\n};\n\nconst convertSingleMessage = (\n\tresult: OpenAIMessage[],\n\tmsg: AIProviderMessage | undefined,\n\tidx: number\n) => {\n\tif (!msg) {\n\t\treturn;\n\t}\n\n\tprocessMessageAtIndex(result, msg, idx);\n};\n\nconst convertToolResultMessages = (\n\tmessages: OpenAIMessage[],\n\tparams: AIProviderStreamParams\n) => {\n\tconst result = [...messages];\n\n\tfor (let idx = 0; idx < params.messages.length; idx++) {\n\t\tconvertSingleMessage(result, params.messages[idx], idx);\n\t}\n\n\treturn result;\n};\n\nconst mapToolDefinitions = (tools: AIProviderToolDefinition[]) =>\n\ttools.map((tool) => ({\n\t\tfunction: {\n\t\t\tdescription: tool.description,\n\t\t\tname: tool.name,\n\t\t\tparameters: tool.input_schema\n\t\t},\n\t\ttype: 'function'\n\t}));\n\nconst mapOpenAIContent = (\n\tmsg: AIProviderStreamParams['messages'][number]\n): string | Array<Record<string, unknown>> | null => {\n\tif (typeof msg.content === 'string') {\n\t\treturn msg.content;\n\t}\n\n\tconst hasImages = msg.content.some((block) => block.type === 'image');\n\n\tif (!hasImages) {\n\t\treturn null;\n\t}\n\n\tconst blocks: Array<Record<string, unknown>> = [];\n\n\tfor (const block of msg.content) {\n\t\tif (block.type === 'image') {\n\t\t\tblocks.push({\n\t\t\t\timage_url: {\n\t\t\t\t\turl: `data:${block.source.media_type};base64,${block.source.data}`\n\t\t\t\t},\n\t\t\t\ttype: 'image_url'\n\t\t\t});\n\t\t} else if (block.type === 'text') {\n\t\t\tblocks.push({ text: block.content, type: 'text' });\n\t\t}\n\t}\n\n\treturn blocks;\n};\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n\tconst messages = convertToolResultMessages(\n\t\tparams.messages.map((msg) => ({\n\t\t\tcontent: mapOpenAIContent(msg),\n\t\t\trole: msg.role\n\t\t})),\n\t\tparams\n\t);\n\n\tconst body: Record<string, unknown> = {\n\t\tmessages,\n\t\tmodel: params.model,\n\t\tstream: true,\n\t\tstream_options: { include_usage: true }\n\t};\n\n\tif (params.tools && params.tools.length > 0) {\n\t\tbody.tools = mapToolDefinitions(params.tools);\n\t}\n\n\treturn body;\n};\n\nconst parseToolInput = (rawArguments: string) => {\n\ttry {\n\t\treturn JSON.parse(rawArguments);\n\t} catch {\n\t\treturn rawArguments;\n\t}\n};\n\nconst flushPendingToolCalls = function* (\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tfor (const [, tool] of pendingToolCalls) {\n\t\tconst input = parseToolInput(tool.arguments);\n\t\tyield {\n\t\t\tid: tool.id,\n\t\t\tinput,\n\t\t\tname: tool.name,\n\t\t\ttype: 'tool_use' as const\n\t\t};\n\t}\n\n\tpendingToolCalls.clear();\n};\n\nconst extractUsage = (parsedUsage: Record<string, number>) => ({\n\tinputTokens: parsedUsage.prompt_tokens ?? 0,\n\toutputTokens: parsedUsage.completion_tokens ?? 0\n});\n\nconst resolveToolCallIndex = (toolCall: Record<string, unknown>) => {\n\tconst raw = typeof toolCall.index === 'number' ? toolCall.index : NOT_FOUND;\n\n\treturn raw < 0 ? undefined : raw;\n};\n\nconst initPendingToolCall = (\n\ttoolCall: Record<string, unknown>,\n\tfunc: Record<string, unknown> | null,\n\tindex: number,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tif (pendingToolCalls.has(index)) {\n\t\treturn;\n\t}\n\n\tconst toolId = typeof toolCall.id === 'string' ? toolCall.id : '';\n\tconst toolName = func && typeof func.name === 'string' ? func.name : '';\n\n\tpendingToolCalls.set(index, {\n\t\targuments: '',\n\t\tid: toolId,\n\t\tname: toolName\n\t});\n};\n\nconst updatePendingToolCall = (\n\ttoolCall: Record<string, unknown>,\n\tfunc: Record<string, unknown> | null,\n\tpending: PendingToolCall\n) => {\n\tif (typeof toolCall.id === 'string') {\n\t\tpending.id = toolCall.id;\n\t}\n\n\tif (func && typeof func.name === 'string') {\n\t\tpending.name = func.name;\n\t}\n\n\tif (func && typeof func.arguments === 'string') {\n\t\tpending.arguments += func.arguments;\n\t}\n};\n\nconst processToolCallDelta = (\n\ttoolCall: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tconst index = resolveToolCallIndex(toolCall);\n\tif (index === undefined) {\n\t\treturn;\n\t}\n\n\tconst func = isRecord(toolCall.function) ? toolCall.function : null;\n\tinitPendingToolCall(toolCall, func, index, pendingToolCalls);\n\n\tconst pending = pendingToolCalls.get(index);\n\tif (!pending) {\n\t\treturn;\n\t}\n\n\tupdatePendingToolCall(toolCall, func, pending);\n};\n\nconst processToolCallDeltas = (\n\ttoolCalls: Array<Record<string, unknown>>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tfor (const toolCall of toolCalls) {\n\t\tprocessToolCallDelta(toolCall, pendingToolCalls);\n\t}\n};\n\nconst processDelta = function* (\n\tdelta: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tif (typeof delta.content === 'string') {\n\t\tyield { content: delta.content, type: 'text' as const };\n\t}\n\n\tif (isRecordArray(delta.tool_calls)) {\n\t\tprocessToolCallDeltas(delta.tool_calls, pendingToolCalls);\n\t}\n};\n\nconst processChoice = function* (\n\tchoice: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tconst delta = isRecord(choice.delta) ? choice.delta : null;\n\tif (delta) {\n\t\tyield* processDelta(delta, pendingToolCalls);\n\t}\n\n\tif (choice.finish_reason === 'tool_calls') {\n\t\tyield* flushPendingToolCalls(pendingToolCalls);\n\t}\n};\n\nconst narrowUsageRecord = (parsed: Record<string, unknown>) => {\n\tif (!isRecord(parsed.usage)) {\n\t\treturn undefined;\n\t}\n\n\tconst { usage } = parsed;\n\tconst promptTokens =\n\t\ttypeof usage.prompt_tokens === 'number' ? usage.prompt_tokens : 0;\n\tconst completionTokens =\n\t\ttypeof usage.completion_tokens === 'number'\n\t\t\t? usage.completion_tokens\n\t\t\t: 0;\n\n\treturn extractUsage({\n\t\tcompletion_tokens: completionTokens,\n\t\tprompt_tokens: promptTokens\n\t});\n};\n\nconst processSSELine = function* (\n\tline: string,\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tcurrentUsage: AIUsage | undefined\n) {\n\tconst trimmed = line.trim();\n\tif (!trimmed || !trimmed.startsWith('data: ')) {\n\t\treturn;\n\t}\n\n\tconst data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);\n\tif (data === DONE_SENTINEL) {\n\t\tyield* flushPendingToolCalls(pendingToolCalls);\n\t\tyield { type: 'done' as const, usage: currentUsage };\n\n\t\treturn;\n\t}\n\n\tlet parsed: Record<string, unknown>;\n\ttry {\n\t\tparsed = JSON.parse(data);\n\t} catch {\n\t\treturn;\n\t}\n\n\tconst usageUpdate = narrowUsageRecord(parsed);\n\tif (usageUpdate) {\n\t\tyield { type: 'usage_update' as const, usage: usageUpdate };\n\t}\n\n\tconst { choices } = parsed;\n\tif (!isRecordArray(choices)) {\n\t\treturn;\n\t}\n\n\tconst [firstChoice] = choices;\n\tif (!firstChoice) {\n\t\treturn;\n\t}\n\n\tyield* processChoice(firstChoice, pendingToolCalls);\n};\n\nconst isUsageUpdate = (chunk: {\n\ttype: string;\n\tusage?: AIUsage;\n}): chunk is { type: 'usage_update'; usage: AIUsage } =>\n\tchunk.type === 'usage_update';\n\nconst collectYieldableChunks = (\n\tline: string,\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tusageRef: UsageRef\n) => {\n\tconst allChunks = Array.from(\n\t\tprocessSSELine(line, pendingToolCalls, usageRef.current)\n\t);\n\tconst usageChunks = allChunks.filter(isUsageUpdate);\n\tconst lastUsage = usageChunks.at(NOT_FOUND);\n\n\tif (lastUsage) {\n\t\tusageRef.current = lastUsage.usage;\n\t}\n\n\treturn allChunks.filter((chunk) => !isUsageUpdate(chunk));\n};\n\nconst processSSELines = function* (\n\tlines: string[],\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tusageRef: UsageRef\n) {\n\tfor (const line of lines) {\n\t\tyield* collectYieldableChunks(line, pendingToolCalls, usageRef);\n\t}\n};\n\nconst processStreamValue = (\n\tvalue: Uint8Array,\n\tdecoder: TextDecoder,\n\tstate: StreamState\n) => {\n\tstate.buffer += decoder.decode(value, { stream: true });\n\tconst lines = state.buffer.split('\\n');\n\tstate.buffer = lines.pop() ?? '';\n\n\treturn lines;\n};\n\nconst drainReader = async function* (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tstate: StreamState,\n\tsignal?: AbortSignal\n) {\n\t/* eslint-disable no-await-in-loop */\n\tfor (\n\t\tlet result = await reader.read();\n\t\t!result.done && !signal?.aborted;\n\t\tresult = await reader.read()\n\t) {\n\t\t/* eslint-enable no-await-in-loop */\n\t\tconst lines = processStreamValue(result.value, decoder, state);\n\t\tyield* processSSELines(lines, state.pendingToolCalls, state.usageRef);\n\t}\n};\n\nconst parseSSEStream = async function* (\n\tbody: ReadableStream<Uint8Array>,\n\tsignal?: AbortSignal\n) {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tconst state: StreamState = {\n\t\tbuffer: '',\n\t\tpendingToolCalls: new Map<number, PendingToolCall>(),\n\t\tusageRef: { current: undefined }\n\t};\n\n\ttry {\n\t\tyield* drainReader(reader, decoder, state, signal);\n\t\tyield { type: 'done' as const, usage: state.usageRef.current };\n\t} finally {\n\t\treader.releaseLock();\n\t}\n};\n\nconst fetchOpenAIStream = async function* (\n\tbaseUrl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\tsignal?: AbortSignal\n) {\n\tconst response = await fetch(`${baseUrl}/v1/chat/completions`, {\n\t\tbody: JSON.stringify(body),\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t'Content-Type': 'application/json'\n\t\t},\n\t\tmethod: 'POST',\n\t\tsignal\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`OpenAI API error ${response.status}: ${errorText}`);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('OpenAI API returned no response body');\n\t}\n\n\tyield* parseSSEStream(response.body, signal);\n};\n\nexport const openai = (config: OpenAIConfig): AIProviderConfig => {\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n\treturn {\n\t\tstream: (params: AIProviderStreamParams) => {\n\t\t\tconst body = buildRequestBody(params);\n\n\t\t\treturn fetchOpenAIStream(\n\t\t\t\tbaseUrl,\n\t\t\t\tconfig.apiKey,\n\t\t\t\tbody,\n\t\t\t\tparams.signal\n\t\t\t);\n\t\t}\n\t};\n};\n",
|
|
7
7
|
"import type { AIProviderConfig } from '../../../types/ai';\nimport { openai } from './openai';\n\n/**\n * Creates a provider for any OpenAI-compatible API.\n * Many providers (Google, xAI, DeepSeek, Mistral, etc.)\n * expose OpenAI-compatible chat completion endpoints.\n */\nexport const openaiCompatible = (config: {\n\tapiKey: string;\n\tbaseUrl: string;\n}): AIProviderConfig => openai({ apiKey: config.apiKey, baseUrl: config.baseUrl });\n\nexport const google = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai'\n\t});\n\nexport const xai = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.x.ai'\n\t});\n\nexport const deepseek = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.deepseek.com'\n\t});\n\nexport const mistralai = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.mistral.ai'\n\t});\n\nexport const alibaba = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://dashscope-intl.aliyuncs.com/compatible-mode'\n\t});\n\nexport const meta = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.llama.com/compat/v1'\n\t});\n\nexport const moonshot = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.moonshot.ai'\n\t});\n",
|
|
8
|
-
"import { Elysia } from 'elysia';\nimport type { AIChatPluginConfig } from '../../types/ai';\nimport { createConversationManager } from '../ai/conversationManager';\nimport { parseAIMessage } from '../ai/protocol';\nimport { streamAI } from '../ai/streamAI';\n\nconst DEFAULT_PATH = '/chat';\nconst MAX_PREFIX_LEN = 12;\n\nconst defaultParseProvider = (content: string) => {\n\tconst colonIdx = content.indexOf(':');\n\tconst hasPrefix = colonIdx > 0 && colonIdx < MAX_PREFIX_LEN;\n\n\treturn {\n\t\tcontent: hasPrefix ? content.slice(colonIdx + 1) : content,\n\t\tproviderName: hasPrefix ? content.slice(0, colonIdx) : 'anthropic'\n\t};\n};\n\nexport const aiChat = (config: AIChatPluginConfig) => {\n\tconst path = config.path ?? DEFAULT_PATH;\n\tconst conversations = createConversationManager();\n\tconst parseProvider = config.parseProvider ?? defaultParseProvider;\n\n\tconst handleCancel = (conversationId: string) => {\n\t\tconversations.abort(conversationId);\n\t};\n\n\tconst handleBranch = (\n\t\tws: { send: (data: string) => void },\n\t\tmessageId: string,\n\t\tconversationId: string\n\t) => {\n\t\tconst newConvId = conversations.branch(messageId, conversationId);\n\n\t\tif (newConvId) {\n\t\t\tws.send(\n\t\t\t\tJSON.stringify({ conversationId: newConvId, type: 'branched' })\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleUserMessage = async (\n\t\tws: { readyState: number; send: (data: string) => void },\n\t\trawContent: string,\n\t\trawConversationId?: string\n\t) => {\n\t\tconst conversationId = rawConversationId ?? crypto.randomUUID();\n\t\tconst messageId = crypto.randomUUID();\n\t\tconst parsed: { content: string; model?: string; providerName: string } =\n\t\t\tparseProvider(rawContent);\n\t\tconst { content, providerName } = parsed;\n\n\t\tconversations.getOrCreate(conversationId);\n\t\tconst history = conversations.getHistory(conversationId);\n\t\tconst controller = conversations.getAbortController(conversationId);\n\n\t\tconversations.appendMessage(conversationId, {\n\t\t\tcontent,\n\t\t\tconversationId,\n\t\t\tid: messageId,\n\t\t\trole: 'user',\n\t\t\ttimestamp: Date.now()\n\t\t});\n\n\t\tconst resolveModel = () => {\n\t\t\tif (parsed.model) {\n\t\t\t\treturn parsed.model;\n\t\t\t}\n\n\t\t\tif (typeof config.model === 'string') {\n\t\t\t\treturn config.model;\n\t\t\t}\n\n\t\t\tif (typeof config.model === 'function') {\n\t\t\t\treturn config.model(providerName);\n\t\t\t}\n\n\t\t\treturn providerName;\n\t\t};\n\n\t\tconst model = resolveModel();\n\n\t\tconst resolvedTools = typeof config.tools === 'function'\n\t\t\t? config.tools(providerName, model)\n\t\t\t: config.tools;\n\n\t\tawait streamAI(ws, conversationId, messageId, {\n\t\t\tmaxTurns: config.maxTurns,\n\t\t\tmessages: [...history,
|
|
8
|
+
"import { Elysia } from 'elysia';\nimport type { AIChatPluginConfig } from '../../types/ai';\nimport { createConversationManager } from '../ai/conversationManager';\nimport { parseAIMessage } from '../ai/protocol';\nimport { streamAI } from '../ai/streamAI';\n\nconst DEFAULT_PATH = '/chat';\nconst MAX_PREFIX_LEN = 12;\n\nconst defaultParseProvider = (content: string) => {\n\tconst colonIdx = content.indexOf(':');\n\tconst hasPrefix = colonIdx > 0 && colonIdx < MAX_PREFIX_LEN;\n\n\treturn {\n\t\tcontent: hasPrefix ? content.slice(colonIdx + 1) : content,\n\t\tproviderName: hasPrefix ? content.slice(0, colonIdx) : 'anthropic'\n\t};\n};\n\nexport const aiChat = (config: AIChatPluginConfig) => {\n\tconst path = config.path ?? DEFAULT_PATH;\n\tconst conversations = createConversationManager();\n\tconst parseProvider = config.parseProvider ?? defaultParseProvider;\n\n\tconst handleCancel = (conversationId: string) => {\n\t\tconversations.abort(conversationId);\n\t};\n\n\tconst handleBranch = (\n\t\tws: { send: (data: string) => void },\n\t\tmessageId: string,\n\t\tconversationId: string\n\t) => {\n\t\tconst newConvId = conversations.branch(messageId, conversationId);\n\n\t\tif (newConvId) {\n\t\t\tws.send(\n\t\t\t\tJSON.stringify({ conversationId: newConvId, type: 'branched' })\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleUserMessage = async (\n\t\tws: { readyState: number; send: (data: string) => void },\n\t\trawContent: string,\n\t\trawConversationId?: string,\n\t\tattachments?: Array<{\n\t\t\tdata: string;\n\t\t\tmedia_type: 'image/png' | 'image/jpeg' | 'image/gif' | 'image/webp';\n\t\t}>\n\t) => {\n\t\tconst conversationId = rawConversationId ?? crypto.randomUUID();\n\t\tconst messageId = crypto.randomUUID();\n\t\tconst parsed: { content: string; model?: string; providerName: string } =\n\t\t\tparseProvider(rawContent);\n\t\tconst { content, providerName } = parsed;\n\n\t\tconversations.getOrCreate(conversationId);\n\t\tconst history = conversations.getHistory(conversationId);\n\t\tconst controller = conversations.getAbortController(conversationId);\n\n\t\tconversations.appendMessage(conversationId, {\n\t\t\tattachments,\n\t\t\tcontent,\n\t\t\tconversationId,\n\t\t\tid: messageId,\n\t\t\trole: 'user',\n\t\t\ttimestamp: Date.now()\n\t\t});\n\n\t\tconst resolveModel = () => {\n\t\t\tif (parsed.model) {\n\t\t\t\treturn parsed.model;\n\t\t\t}\n\n\t\t\tif (typeof config.model === 'string') {\n\t\t\t\treturn config.model;\n\t\t\t}\n\n\t\t\tif (typeof config.model === 'function') {\n\t\t\t\treturn config.model(providerName);\n\t\t\t}\n\n\t\t\treturn providerName;\n\t\t};\n\n\t\tconst model = resolveModel();\n\n\t\tconst resolvedTools = typeof config.tools === 'function'\n\t\t\t? config.tools(providerName, model)\n\t\t\t: config.tools;\n\n\t\tconst userMessage = attachments && attachments.length > 0\n\t\t\t? {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t...attachments.map((att) => ({\n\t\t\t\t\t\t\tsource: {\n\t\t\t\t\t\t\t\tdata: att.data,\n\t\t\t\t\t\t\t\tmedia_type: att.media_type,\n\t\t\t\t\t\t\t\ttype: 'base64' as const\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttype: 'image' as const\n\t\t\t\t\t\t})),\n\t\t\t\t\t\t{ content, type: 'text' as const }\n\t\t\t\t\t],\n\t\t\t\t\trole: 'user' as const\n\t\t\t\t}\n\t\t\t: { content, role: 'user' as const };\n\n\t\tconst resolvedThinking = typeof config.thinking === 'function'\n\t\t\t? config.thinking(providerName, model)\n\t\t\t: config.thinking;\n\n\t\tawait streamAI(ws, conversationId, messageId, {\n\t\t\tmaxTurns: config.maxTurns,\n\t\t\tmessages: [...history, userMessage],\n\t\t\tmodel,\n\t\t\tprovider: config.provider(providerName),\n\t\t\tthinking: resolvedThinking,\n\t\t\tsignal: controller.signal,\n\t\t\tsystemPrompt: config.systemPrompt,\n\t\t\ttools: resolvedTools,\n\t\t\tonComplete: (fullResponse, usage) => {\n\t\t\t\tconversations.appendMessage(conversationId, {\n\t\t\t\t\tcontent: fullResponse,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\ttimestamp: Date.now()\n\t\t\t\t});\n\t\t\t\tconfig.onComplete?.(conversationId, fullResponse, usage);\n\t\t\t}\n\t\t});\n\t};\n\n\treturn new Elysia()\n\t\t.ws(path, {\n\t\t\tmessage: async (ws, raw) => {\n\t\t\t\tconst msg = parseAIMessage(raw);\n\n\t\t\t\tif (!msg) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === 'cancel' && msg.conversationId) {\n\t\t\t\t\thandleCancel(msg.conversationId);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === 'branch') {\n\t\t\t\t\thandleBranch(ws, msg.messageId, msg.conversationId);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === 'message') {\n\t\t\t\t\tawait handleUserMessage(\n\t\t\t\t\t\tws,\n\t\t\t\t\t\tmsg.content,\n\t\t\t\t\t\tmsg.conversationId,\n\t\t\t\t\t\tmsg.attachments\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t.get(`${path}/conversations`, () => conversations.list())\n\t\t.get(`${path}/conversations/:id`, ({ params }) => {\n\t\t\tconst conv = conversations.get(params.id);\n\n\t\t\tif (!conv) {\n\t\t\t\treturn new Response('Not found', { status: 404 });\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: conv.id,\n\t\t\t\tmessages: conv.messages,\n\t\t\t\ttitle: conv.title ?? 'Untitled'\n\t\t\t};\n\t\t})\n\t\t.delete(`${path}/conversations/:id`, ({ params }) => {\n\t\t\tconversations.remove(params.id);\n\n\t\t\treturn { ok: true };\n\t\t});\n};\n",
|
|
9
9
|
"import type { AIServerMessage } from '../../types/ai';\nimport { isValidAIClientMessage } from '../../types/typeGuards';\n\nexport const generateId = () => crypto.randomUUID();\n\nexport const parseAIMessage = (raw: unknown) => {\n\tif (raw === null || raw === undefined) {\n\t\treturn null;\n\t}\n\n\tlet text: string;\n\n\tif (typeof raw === 'string') {\n\t\ttext = raw;\n\t} else if (raw instanceof ArrayBuffer) {\n\t\ttext = new TextDecoder().decode(raw);\n\t} else if (ArrayBuffer.isView(raw)) {\n\t\ttext = new TextDecoder().decode(raw);\n\t} else if (typeof raw === 'object') {\n\t\tif (isValidAIClientMessage(raw)) {\n\t\t\treturn raw;\n\t\t}\n\n\t\treturn null;\n\t} else {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(text);\n\n\t\tif (isValidAIClientMessage(parsed)) {\n\t\t\treturn parsed;\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nexport const serializeAIMessage = (msg: AIServerMessage) => JSON.stringify(msg);\n",
|
|
10
10
|
"import type {\n\tAIConversation,\n\tAIConversationSummary,\n\tAIMessage,\n\tAIProviderMessage\n} from '../../types/ai';\nimport { generateId } from './protocol';\n\nconst NOT_FOUND = -1;\n\nexport const createConversationManager = () => {\n\tconst conversations = new Map<string, AIConversation>();\n\n\tconst getOrCreate = (conversationId?: string) => {\n\t\tconst id = conversationId ?? generateId();\n\t\tlet conversation = conversations.get(id);\n\n\t\tif (!conversation) {\n\t\t\tconversation = { createdAt: Date.now(), id, messages: [] };\n\t\t\tconversations.set(id, conversation);\n\t\t}\n\n\t\treturn conversation;\n\t};\n\n\tconst appendMessage = (conversationId: string, message: AIMessage) => {\n\t\tconst conversation = getOrCreate(conversationId);\n\t\tconversation.messages.push(message);\n\t\tconversation.lastMessageAt = Date.now();\n\n\t\tif (!conversation.title && message.role === 'user') {\n\t\t\tconversation.title = message.content.slice(0, 80);\n\t\t}\n\t};\n\n\tconst branch = (fromMessageId: string, sourceConversationId: string) => {\n\t\tconst source = conversations.get(sourceConversationId);\n\n\t\tif (!source) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst cutoffIndex = source.messages.findIndex(\n\t\t\t(msg) => msg.id === fromMessageId\n\t\t);\n\n\t\tif (cutoffIndex === NOT_FOUND) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst newId = generateId();\n\t\tconst branchedMessages = source.messages\n\t\t\t.slice(0, cutoffIndex + 1)\n\t\t\t.map((msg) => ({ ...msg, conversationId: newId }));\n\n\t\tconst newConversation: AIConversation = {\n\t\t\tcreatedAt: Date.now(),\n\t\t\tid: newId,\n\t\t\tmessages: branchedMessages\n\t\t};\n\t\tconversations.set(newId, newConversation);\n\n\t\treturn newId;\n\t};\n\n\tconst emptyHistory: AIProviderMessage[] = [];\n\n\tconst getHistory = (conversationId: string) => {\n\t\tconst conversation = conversations.get(conversationId);\n\n\t\tif (!conversation) {\n\t\t\treturn emptyHistory;\n\t\t}\n\n\t\tconst history: AIProviderMessage[] = conversation.messages.map(\n\t\t\t(msg) => ({\n\t\t\t\tcontent: msg.content,\n\t\t\t\trole: msg.role\n\t\t\t})\n\t\t);\n\n\t\treturn history;\n\t};\n\n\tconst getAbortController = (conversationId: string) => {\n\t\tconst conversation = getOrCreate(conversationId);\n\t\tconst controller = new AbortController();\n\t\tconversation.activeStreamAbort = controller;\n\n\t\treturn controller;\n\t};\n\n\tconst abort = (conversationId: string) => {\n\t\tconst conversation = conversations.get(conversationId);\n\n\t\tif (conversation?.activeStreamAbort) {\n\t\t\tconversation.activeStreamAbort.abort();\n\t\t\tconversation.activeStreamAbort = undefined;\n\t\t}\n\t};\n\n\tconst get = (conversationId: string) => conversations.get(conversationId);\n\n\tconst remove = (conversationId: string) =>\n\t\tconversations.delete(conversationId);\n\n\tconst list = (): AIConversationSummary[] =>\n\t\tArray.from(conversations.values())\n\t\t\t.map((conv) => ({\n\t\t\t\tcreatedAt: conv.createdAt,\n\t\t\t\tid: conv.id,\n\t\t\t\tlastMessageAt: conv.lastMessageAt,\n\t\t\t\tmessageCount: conv.messages.length,\n\t\t\t\ttitle: conv.title ?? 'Untitled'\n\t\t\t}))\n\t\t\t.sort(\n\t\t\t\t(first, second) =>\n\t\t\t\t\t(second.lastMessageAt ?? second.createdAt) -\n\t\t\t\t\t(first.lastMessageAt ?? first.createdAt)\n\t\t\t);\n\n\tconst getMessages = (conversationId: string) => {\n\t\tconst conversation = conversations.get(conversationId);\n\n\t\tif (!conversation) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn conversation.messages;\n\t};\n\n\treturn {\n\t\tabort,\n\t\tappendMessage,\n\t\tbranch,\n\t\tget,\n\t\tgetAbortController,\n\t\tgetHistory,\n\t\tgetMessages,\n\t\tgetOrCreate,\n\t\tlist,\n\t\tremove\n\t};\n};\n",
|
|
11
|
-
"import type {\n\tAIChunk,\n\tAIProviderMessage,\n\tAIServerMessage,\n\tAITextChunk,\n\tAIToolMap,\n\tAIUsage,\n\tAIWebSocket,\n\tStreamAIOptions\n} from '../../types/ai';\nimport { serializeAIMessage } from './protocol';\n\nconst WS_OPEN = 1;\nconst BACKPRESSURE_THRESHOLD = 1_048_576;\nconst BACKPRESSURE_DELAY = 10;\nconst DEFAULT_MAX_TURNS = 10;\nconst INITIAL_TURN = 0;\n\nconst delay = (milliseconds: number) =>\n\t// eslint-disable-next-line promise/avoid-new\n\tnew Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n\nconst checkBackpressure = async (socket: AIWebSocket) => {\n\tif (!('raw' in socket)) {\n\t\treturn;\n\t}\n\n\tconst { raw } = socket;\n\n\tif (\n\t\traw &&\n\t\ttypeof raw === 'object' &&\n\t\t'bufferedAmount' in raw &&\n\t\ttypeof raw.bufferedAmount === 'number' &&\n\t\traw.bufferedAmount > BACKPRESSURE_THRESHOLD\n\t) {\n\t\tawait delay(BACKPRESSURE_DELAY);\n\t}\n};\n\nconst sendMessage = async (socket: AIWebSocket, msg: AIServerMessage) => {\n\tif (socket.readyState !== WS_OPEN) {\n\t\treturn false;\n\t}\n\n\tawait checkBackpressure(socket);\n\n\tsocket.send(serializeAIMessage(msg));\n\n\treturn true;\n};\n\nconst buildToolDefinitions = (tools: AIToolMap) =>\n\tObject.entries(tools).map(([name, def]) => ({\n\t\tdescription: def.description,\n\t\tinput_schema: def.input,\n\t\tname\n\t}));\n\nconst extractTextContent = (\n\tchunk: AITextChunk,\n\tonChunk?: (chunk: AITextChunk) => AITextChunk | void\n) => {\n\tif (!onChunk) {\n\t\treturn chunk.content;\n\t}\n\n\tconst transformed = onChunk(chunk);\n\n\tif (\n\t\ttransformed &&\n\t\ttypeof transformed === 'object' &&\n\t\t'content' in transformed\n\t) {\n\t\treturn transformed.content;\n\t}\n\n\treturn chunk.content;\n};\n\nconst sendToolRunning = async (\n\tsocket: AIWebSocket,\n\ttoolName: string,\n\ttoolInput: unknown,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tinput: toolInput,\n\t\tmessageId,\n\t\tname: toolName,\n\t\tstatus: 'running',\n\t\ttype: 'tool_status'\n\t});\n\nconst sendToolComplete = async (\n\tsocket: AIWebSocket,\n\ttoolName: string,\n\tresult: string,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tmessageId,\n\t\tname: toolName,\n\t\tresult,\n\t\tstatus: 'complete',\n\t\ttype: 'tool_status'\n\t});\n\nconst executeTool = async (\n\toptions: StreamAIOptions,\n\ttoolName: string,\n\ttoolInput: unknown\n) => {\n\tconst toolDef = options.tools?.[toolName];\n\n\tif (!toolDef) {\n\t\treturn `Error: unknown tool \"${toolName}\"`;\n\t}\n\n\ttry {\n\t\treturn await toolDef.handler(toolInput);\n\t} catch (err) {\n\t\treturn `Error: ${err instanceof Error ? err.message : String(err)}`;\n\t}\n};\n\nconst buildToolUseBlock = (\n\ttoolUseId: string,\n\ttoolName: string,\n\ttoolInput: unknown\n) => [\n\t{\n\t\tid: toolUseId,\n\t\tinput: toolInput,\n\t\tname: toolName,\n\t\ttype: 'tool_use' as const\n\t}\n];\n\nconst buildToolResultBlock = (toolUseId: string, result: string) => [\n\t{\n\t\tcontent: result,\n\t\ttool_use_id: toolUseId,\n\t\ttype: 'tool_result' as const\n\t}\n];\n\nconst serializeToolCall = (name: string, input: unknown) =>\n\t`${name}:${JSON.stringify(input)}`;\n\ntype ToolLoopState = {\n\tcurrentFullResponse: string;\n\tcurrentMessages: AIProviderMessage[];\n\tcurrentToolInput: unknown;\n\tcurrentToolName: string;\n\tcurrentToolUseId: string;\n\tcurrentTurn: number;\n\tcurrentUsage: AIUsage | undefined;\n\tpreviousToolCallKey: string;\n};\n\ntype ToolLoopResult = {\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst handleToolChunkText = (\n\tchunk: AITextChunk,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = extractTextContent(chunk, options.onChunk);\n\tstate.currentFullResponse += textContent;\n\tsendMessage(socket, {\n\t\tcontent: textContent,\n\t\tconversationId,\n\t\tmessageId,\n\t\ttype: 'chunk'\n\t});\n};\n\nconst handleToolChunkToolUse = (\n\tchunk: AIChunk & { type: 'tool_use' },\n\tstate: ToolLoopState\n) => {\n\tstate.currentToolUseId = chunk.id;\n\tstate.currentToolName = chunk.name;\n\tstate.currentToolInput = chunk.input;\n};\n\nconst processToolChunk = (\n\tchunk: AIChunk,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tlet hitAnotherTool = false;\n\n\tswitch (chunk.type) {\n\t\tcase 'text':\n\t\t\thandleToolChunkText(\n\t\t\t\tchunk,\n\t\t\t\tstate,\n\t\t\t\toptions,\n\t\t\t\tsocket,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase 'tool_use':\n\t\t\thandleToolChunkToolUse(chunk, state);\n\t\t\thitAnotherTool = true;\n\t\t\tbreak;\n\n\t\tcase 'done':\n\t\t\tstate.currentUsage = chunk.usage;\n\t\t\tbreak;\n\t}\n\n\treturn hitAnotherTool;\n};\n\nconst processToolTurn = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tstate: ToolLoopState,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal\n) => {\n\tawait sendToolRunning(\n\t\tsocket,\n\t\tstate.currentToolName,\n\t\tstate.currentToolInput,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\tconst result = await executeTool(\n\t\toptions,\n\t\tstate.currentToolName,\n\t\tstate.currentToolInput\n\t);\n\n\tawait sendToolComplete(\n\t\tsocket,\n\t\tstate.currentToolName,\n\t\tresult,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\toptions.onToolUse?.(state.currentToolName, state.currentToolInput, result);\n\n\tstate.currentMessages.push({\n\t\tcontent: buildToolUseBlock(\n\t\t\tstate.currentToolUseId,\n\t\t\tstate.currentToolName,\n\t\t\tstate.currentToolInput\n\t\t),\n\t\trole: 'assistant'\n\t});\n\n\tstate.currentMessages.push({\n\t\tcontent: buildToolResultBlock(state.currentToolUseId, result),\n\t\trole: 'user'\n\t});\n\n\tconst toolDefs = options.tools\n\t\t? buildToolDefinitions(options.tools)\n\t\t: undefined;\n\n\tconst stream = options.provider.stream({\n\t\tmessages: state.currentMessages,\n\t\tmodel: options.model,\n\t\tsignal,\n\t\tsystemPrompt: options.systemPrompt,\n\t\ttools: toolDefs\n\t});\n\n\treturn consumeToolStream(\n\t\tstream,\n\t\tstate,\n\t\toptions,\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal\n\t);\n};\n\nconst consumeToolStream = async (\n\tstream: AsyncIterable<AIChunk>,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal\n) => {\n\tfor await (const chunk of stream) {\n\t\tif (signal.aborted) break;\n\n\t\tconst isToolHit = processToolChunk(\n\t\t\tchunk,\n\t\t\tstate,\n\t\t\toptions,\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId\n\t\t);\n\n\t\tif (isToolHit) return true;\n\t}\n\n\treturn false;\n};\n\nconst shouldContinueToolLoop = (\n\tstate: ToolLoopState,\n\tmaxTurns: number,\n\tsignal: AbortSignal\n) => state.currentTurn < maxTurns && !signal.aborted;\n\nconst executeToolLoop = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\ttoolUseId: string,\n\ttoolName: string,\n\ttoolInput: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tturn: number\n): Promise<ToolLoopResult> => {\n\tconst maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS;\n\n\tconst state: ToolLoopState = {\n\t\tcurrentFullResponse: fullResponse,\n\t\tcurrentMessages: [...messages],\n\t\tcurrentToolInput: toolInput,\n\t\tcurrentToolName: toolName,\n\t\tcurrentToolUseId: toolUseId,\n\t\tcurrentTurn: turn,\n\t\tcurrentUsage: undefined,\n\t\tpreviousToolCallKey: ''\n\t};\n\n\twhile (shouldContinueToolLoop(state, maxTurns, signal)) {\n\t\tconst currentKey = serializeToolCall(\n\t\t\tstate.currentToolName,\n\t\t\tstate.currentToolInput\n\t\t);\n\n\t\tif (currentKey === state.previousToolCallKey) {\n\t\t\tbreak;\n\t\t}\n\n\t\tstate.previousToolCallKey = currentKey;\n\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst hitAnotherTool = await processToolTurn(\n\t\t\tsocket,\n\t\t\toptions,\n\t\t\tstate,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal\n\t\t);\n\n\t\tif (!hitAnotherTool) {\n\t\t\treturn {\n\t\t\t\tfullResponse: state.currentFullResponse,\n\t\t\t\tusage: state.currentUsage\n\t\t\t};\n\t\t}\n\n\t\tstate.currentTurn++;\n\t}\n\n\treturn {\n\t\tfullResponse: state.currentFullResponse,\n\t\tusage: state.currentUsage\n\t};\n};\n\nconst sendComplete = async (\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string,\n\tusage?: AIUsage,\n\tdurationMs?: number,\n\tmodel?: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tdurationMs,\n\t\tmessageId,\n\t\tmodel,\n\t\ttype: 'complete',\n\t\tusage\n\t});\n\nconst sendError = async (\n\tsocket: AIWebSocket,\n\terr: unknown,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\tmessageId,\n\t\ttype: 'error'\n\t});\n\nconst handleTextChunk = async (\n\tchunk: AITextChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = extractTextContent(chunk, options.onChunk);\n\n\tawait sendMessage(socket, {\n\t\tcontent: textContent,\n\t\tconversationId,\n\t\tmessageId,\n\t\ttype: 'chunk'\n\t});\n\n\treturn textContent;\n};\n\nconst handleToolUseChunk = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tchunkId: string,\n\tchunkName: string,\n\tchunkInput: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tconst toolResult = await executeToolLoop(\n\t\tsocket,\n\t\toptions,\n\t\tmessages,\n\t\tchunkId,\n\t\tchunkName,\n\t\tchunkInput,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tfullResponse,\n\t\tINITIAL_TURN\n\t);\n\n\tawait sendComplete(\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId,\n\t\ttoolResult.usage,\n\t\tDate.now() - startTime,\n\t\toptions.model\n\t);\n\toptions.onComplete?.(toolResult.fullResponse, toolResult.usage);\n\n\treturn toolResult;\n};\n\nconst processStreamTextChunk = async (\n\tchunk: AITextChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = await handleTextChunk(\n\t\tchunk,\n\t\toptions,\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\treturn textContent;\n};\n\nconst processStreamToolUseChunk = async (\n\tchunk: AIChunk & { type: 'tool_use' },\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tawait handleToolUseChunk(\n\t\tsocket,\n\t\toptions,\n\t\tmessages,\n\t\tchunk.id,\n\t\tchunk.name,\n\t\tchunk.input,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tfullResponse,\n\t\tstartTime\n\t);\n};\n\nconst processStream = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tconst toolDefs = options.tools\n\t\t? buildToolDefinitions(options.tools)\n\t\t: undefined;\n\n\tconst stream = options.provider.stream({\n\t\tmessages,\n\t\tmodel: options.model,\n\t\tsignal,\n\t\tsystemPrompt: options.systemPrompt,\n\t\ttools: toolDefs\n\t});\n\n\tconst result = await consumeStream(\n\t\tstream,\n\t\toptions,\n\t\tsocket,\n\t\tmessages,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tstartTime\n\t);\n\n\tif (!result.earlyReturn) {\n\t\tawait sendComplete(\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tresult.usage,\n\t\t\tDate.now() - startTime,\n\t\t\toptions.model\n\t\t);\n\t\toptions.onComplete?.(result.fullResponse, result.usage);\n\t}\n};\n\ntype ConsumeStreamResult = {\n\tearlyReturn: boolean;\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst consumeStreamChunk = async (\n\tchunk: AIChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tswitch (chunk.type) {\n\t\tcase 'text':\n\t\t\treturn processStreamTextChunk(\n\t\t\t\tchunk,\n\t\t\t\toptions,\n\t\t\t\tsocket,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId\n\t\t\t);\n\n\t\tcase 'tool_use':\n\t\t\tawait processStreamToolUseChunk(\n\t\t\t\tchunk,\n\t\t\t\tsocket,\n\t\t\t\toptions,\n\t\t\t\tmessages,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId,\n\t\t\t\tsignal,\n\t\t\t\tfullResponse,\n\t\t\t\tstartTime\n\t\t\t);\n\n\t\t\treturn { earlyReturn: true, fullResponse, usage: undefined };\n\n\t\tcase 'done':\n\t\t\treturn { earlyReturn: false, fullResponse, usage: chunk.usage };\n\t}\n\n\treturn '';\n};\n\ntype ConsumeStreamState = {\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst applyStreamChunkResult = (\n\tresult: ConsumeStreamResult | string,\n\tstate: ConsumeStreamState\n) => {\n\tif (typeof result === 'string') {\n\t\tstate.fullResponse += result;\n\n\t\treturn undefined;\n\t}\n\n\tif (result.earlyReturn) return result;\n\n\tstate.usage = result.usage;\n\n\treturn undefined;\n};\n\nconst consumeStream = async (\n\tstream: AsyncIterable<AIChunk>,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tconst state: ConsumeStreamState = { fullResponse: '', usage: undefined };\n\n\tfor await (const chunk of stream) {\n\t\tif (signal.aborted) break;\n\n\t\tconst result = await consumeStreamChunk(\n\t\t\tchunk,\n\t\t\toptions,\n\t\t\tsocket,\n\t\t\tmessages,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstate.fullResponse,\n\t\t\tstartTime\n\t\t);\n\t\tconst earlyExit = applyStreamChunkResult(result, state);\n\n\t\tif (earlyExit) return earlyExit;\n\t}\n\n\tconst finalResult: ConsumeStreamResult = {\n\t\tearlyReturn: false,\n\t\tfullResponse: state.fullResponse,\n\t\tusage: state.usage\n\t};\n\n\treturn finalResult;\n};\n\nexport const streamAI = async (\n\tsocket: AIWebSocket,\n\tconversationId: string,\n\tmessageId: string,\n\toptions: StreamAIOptions\n) => {\n\tconst signal = options.signal ?? new AbortController().signal;\n\tconst startTime = Date.now();\n\n\tconst messages: AIProviderMessage[] = options.messages\n\t\t? [...options.messages]\n\t\t: [];\n\n\ttry {\n\t\tawait processStream(\n\t\t\tsocket,\n\t\t\toptions,\n\t\t\tmessages,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstartTime\n\t\t);\n\t} catch (err) {\n\t\tawait handleStreamError(\n\t\t\tsocket,\n\t\t\terr,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstartTime\n\t\t);\n\t}\n};\n\nconst handleStreamError = async (\n\tsocket: AIWebSocket,\n\terr: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tif (signal.aborted) {\n\t\tawait sendComplete(\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tundefined,\n\t\t\tDate.now() - startTime\n\t\t);\n\n\t\treturn;\n\t}\n\n\tawait sendError(socket, err, messageId, conversationId);\n};\n"
|
|
11
|
+
"import type {\n\tAIChunk,\n\tAIProviderMessage,\n\tAIServerMessage,\n\tAITextChunk,\n\tAIToolMap,\n\tAIUsage,\n\tAIWebSocket,\n\tStreamAIOptions\n} from '../../types/ai';\nimport { serializeAIMessage } from './protocol';\n\nconst WS_OPEN = 1;\nconst BACKPRESSURE_THRESHOLD = 1_048_576;\nconst BACKPRESSURE_DELAY = 10;\nconst DEFAULT_MAX_TURNS = 10;\nconst INITIAL_TURN = 0;\n\nconst delay = (milliseconds: number) =>\n\t// eslint-disable-next-line promise/avoid-new\n\tnew Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n\nconst checkBackpressure = async (socket: AIWebSocket) => {\n\tif (!('raw' in socket)) {\n\t\treturn;\n\t}\n\n\tconst { raw } = socket;\n\n\tif (\n\t\traw &&\n\t\ttypeof raw === 'object' &&\n\t\t'bufferedAmount' in raw &&\n\t\ttypeof raw.bufferedAmount === 'number' &&\n\t\traw.bufferedAmount > BACKPRESSURE_THRESHOLD\n\t) {\n\t\tawait delay(BACKPRESSURE_DELAY);\n\t}\n};\n\nconst sendMessage = async (socket: AIWebSocket, msg: AIServerMessage) => {\n\tif (socket.readyState !== WS_OPEN) {\n\t\treturn false;\n\t}\n\n\tawait checkBackpressure(socket);\n\n\tsocket.send(serializeAIMessage(msg));\n\n\treturn true;\n};\n\nconst buildToolDefinitions = (tools: AIToolMap) =>\n\tObject.entries(tools).map(([name, def]) => ({\n\t\tdescription: def.description,\n\t\tinput_schema: def.input,\n\t\tname\n\t}));\n\nconst extractTextContent = (\n\tchunk: AITextChunk,\n\tonChunk?: (chunk: AITextChunk) => AITextChunk | void\n) => {\n\tif (!onChunk) {\n\t\treturn chunk.content;\n\t}\n\n\tconst transformed = onChunk(chunk);\n\n\tif (\n\t\ttransformed &&\n\t\ttypeof transformed === 'object' &&\n\t\t'content' in transformed\n\t) {\n\t\treturn transformed.content;\n\t}\n\n\treturn chunk.content;\n};\n\nconst sendToolRunning = async (\n\tsocket: AIWebSocket,\n\ttoolName: string,\n\ttoolInput: unknown,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tinput: toolInput,\n\t\tmessageId,\n\t\tname: toolName,\n\t\tstatus: 'running',\n\t\ttype: 'tool_status'\n\t});\n\nconst sendToolComplete = async (\n\tsocket: AIWebSocket,\n\ttoolName: string,\n\tresult: string,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tmessageId,\n\t\tname: toolName,\n\t\tresult,\n\t\tstatus: 'complete',\n\t\ttype: 'tool_status'\n\t});\n\nconst executeTool = async (\n\toptions: StreamAIOptions,\n\ttoolName: string,\n\ttoolInput: unknown\n) => {\n\tconst toolDef = options.tools?.[toolName];\n\n\tif (!toolDef) {\n\t\treturn `Error: unknown tool \"${toolName}\"`;\n\t}\n\n\ttry {\n\t\treturn await toolDef.handler(toolInput);\n\t} catch (err) {\n\t\treturn `Error: ${err instanceof Error ? err.message : String(err)}`;\n\t}\n};\n\nconst buildToolUseBlock = (\n\ttoolUseId: string,\n\ttoolName: string,\n\ttoolInput: unknown\n) => [\n\t{\n\t\tid: toolUseId,\n\t\tinput: toolInput,\n\t\tname: toolName,\n\t\ttype: 'tool_use' as const\n\t}\n];\n\nconst buildToolResultBlock = (toolUseId: string, result: string) => [\n\t{\n\t\tcontent: result,\n\t\ttool_use_id: toolUseId,\n\t\ttype: 'tool_result' as const\n\t}\n];\n\nconst serializeToolCall = (name: string, input: unknown) =>\n\t`${name}:${JSON.stringify(input)}`;\n\ntype ToolLoopState = {\n\tcurrentFullResponse: string;\n\tcurrentMessages: AIProviderMessage[];\n\tcurrentToolInput: unknown;\n\tcurrentToolName: string;\n\tcurrentToolUseId: string;\n\tcurrentTurn: number;\n\tcurrentUsage: AIUsage | undefined;\n\tpreviousToolCallKey: string;\n};\n\ntype ToolLoopResult = {\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst handleToolChunkText = (\n\tchunk: AITextChunk,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = extractTextContent(chunk, options.onChunk);\n\tstate.currentFullResponse += textContent;\n\tsendMessage(socket, {\n\t\tcontent: textContent,\n\t\tconversationId,\n\t\tmessageId,\n\t\ttype: 'chunk'\n\t});\n};\n\nconst handleToolChunkToolUse = (\n\tchunk: AIChunk & { type: 'tool_use' },\n\tstate: ToolLoopState\n) => {\n\tstate.currentToolUseId = chunk.id;\n\tstate.currentToolName = chunk.name;\n\tstate.currentToolInput = chunk.input;\n};\n\nconst processToolChunk = (\n\tchunk: AIChunk,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tlet hitAnotherTool = false;\n\n\tswitch (chunk.type) {\n\t\tcase 'text':\n\t\t\thandleToolChunkText(\n\t\t\t\tchunk,\n\t\t\t\tstate,\n\t\t\t\toptions,\n\t\t\t\tsocket,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase 'tool_use':\n\t\t\thandleToolChunkToolUse(chunk, state);\n\t\t\thitAnotherTool = true;\n\t\t\tbreak;\n\n\t\tcase 'done':\n\t\t\tstate.currentUsage = chunk.usage;\n\t\t\tbreak;\n\t}\n\n\treturn hitAnotherTool;\n};\n\nconst processToolTurn = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tstate: ToolLoopState,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal\n) => {\n\tawait sendToolRunning(\n\t\tsocket,\n\t\tstate.currentToolName,\n\t\tstate.currentToolInput,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\tconst result = await executeTool(\n\t\toptions,\n\t\tstate.currentToolName,\n\t\tstate.currentToolInput\n\t);\n\n\tawait sendToolComplete(\n\t\tsocket,\n\t\tstate.currentToolName,\n\t\tresult,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\toptions.onToolUse?.(state.currentToolName, state.currentToolInput, result);\n\n\tstate.currentMessages.push({\n\t\tcontent: buildToolUseBlock(\n\t\t\tstate.currentToolUseId,\n\t\t\tstate.currentToolName,\n\t\t\tstate.currentToolInput\n\t\t),\n\t\trole: 'assistant'\n\t});\n\n\tstate.currentMessages.push({\n\t\tcontent: buildToolResultBlock(state.currentToolUseId, result),\n\t\trole: 'user'\n\t});\n\n\tconst toolDefs = options.tools\n\t\t? buildToolDefinitions(options.tools)\n\t\t: undefined;\n\n\tconst thinkingConfig = options.thinking\n\t\t? {\n\t\t\t\tbudget_tokens: typeof options.thinking === 'object'\n\t\t\t\t\t? options.thinking.budgetTokens\n\t\t\t\t\t: 10000,\n\t\t\t\ttype: 'enabled'\n\t\t\t}\n\t\t: undefined;\n\n\tconst stream = options.provider.stream({\n\t\tmessages: state.currentMessages,\n\t\tmodel: options.model,\n\t\tsignal,\n\t\tsystemPrompt: options.systemPrompt,\n\t\tthinking: thinkingConfig,\n\t\ttools: toolDefs\n\t});\n\n\treturn consumeToolStream(\n\t\tstream,\n\t\tstate,\n\t\toptions,\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal\n\t);\n};\n\nconst consumeToolStream = async (\n\tstream: AsyncIterable<AIChunk>,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal\n) => {\n\tfor await (const chunk of stream) {\n\t\tif (signal.aborted) break;\n\n\t\tconst isToolHit = processToolChunk(\n\t\t\tchunk,\n\t\t\tstate,\n\t\t\toptions,\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId\n\t\t);\n\n\t\tif (isToolHit) return true;\n\t}\n\n\treturn false;\n};\n\nconst shouldContinueToolLoop = (\n\tstate: ToolLoopState,\n\tmaxTurns: number,\n\tsignal: AbortSignal\n) => state.currentTurn < maxTurns && !signal.aborted;\n\nconst executeToolLoop = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\ttoolUseId: string,\n\ttoolName: string,\n\ttoolInput: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tturn: number\n): Promise<ToolLoopResult> => {\n\tconst maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS;\n\n\tconst state: ToolLoopState = {\n\t\tcurrentFullResponse: fullResponse,\n\t\tcurrentMessages: [...messages],\n\t\tcurrentToolInput: toolInput,\n\t\tcurrentToolName: toolName,\n\t\tcurrentToolUseId: toolUseId,\n\t\tcurrentTurn: turn,\n\t\tcurrentUsage: undefined,\n\t\tpreviousToolCallKey: ''\n\t};\n\n\twhile (shouldContinueToolLoop(state, maxTurns, signal)) {\n\t\tconst currentKey = serializeToolCall(\n\t\t\tstate.currentToolName,\n\t\t\tstate.currentToolInput\n\t\t);\n\n\t\tif (currentKey === state.previousToolCallKey) {\n\t\t\tbreak;\n\t\t}\n\n\t\tstate.previousToolCallKey = currentKey;\n\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst hitAnotherTool = await processToolTurn(\n\t\t\tsocket,\n\t\t\toptions,\n\t\t\tstate,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal\n\t\t);\n\n\t\tif (!hitAnotherTool) {\n\t\t\treturn {\n\t\t\t\tfullResponse: state.currentFullResponse,\n\t\t\t\tusage: state.currentUsage\n\t\t\t};\n\t\t}\n\n\t\tstate.currentTurn++;\n\t}\n\n\treturn {\n\t\tfullResponse: state.currentFullResponse,\n\t\tusage: state.currentUsage\n\t};\n};\n\nconst sendComplete = async (\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string,\n\tusage?: AIUsage,\n\tdurationMs?: number,\n\tmodel?: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tdurationMs,\n\t\tmessageId,\n\t\tmodel,\n\t\ttype: 'complete',\n\t\tusage\n\t});\n\nconst sendError = async (\n\tsocket: AIWebSocket,\n\terr: unknown,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\tmessageId,\n\t\ttype: 'error'\n\t});\n\nconst handleTextChunk = async (\n\tchunk: AITextChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = extractTextContent(chunk, options.onChunk);\n\n\tawait sendMessage(socket, {\n\t\tcontent: textContent,\n\t\tconversationId,\n\t\tmessageId,\n\t\ttype: 'chunk'\n\t});\n\n\treturn textContent;\n};\n\nconst handleToolUseChunk = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tchunkId: string,\n\tchunkName: string,\n\tchunkInput: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tconst toolResult = await executeToolLoop(\n\t\tsocket,\n\t\toptions,\n\t\tmessages,\n\t\tchunkId,\n\t\tchunkName,\n\t\tchunkInput,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tfullResponse,\n\t\tINITIAL_TURN\n\t);\n\n\tawait sendComplete(\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId,\n\t\ttoolResult.usage,\n\t\tDate.now() - startTime,\n\t\toptions.model\n\t);\n\toptions.onComplete?.(toolResult.fullResponse, toolResult.usage);\n\n\treturn toolResult;\n};\n\nconst processStreamTextChunk = async (\n\tchunk: AITextChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = await handleTextChunk(\n\t\tchunk,\n\t\toptions,\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\treturn textContent;\n};\n\nconst processStreamToolUseChunk = async (\n\tchunk: AIChunk & { type: 'tool_use' },\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tawait handleToolUseChunk(\n\t\tsocket,\n\t\toptions,\n\t\tmessages,\n\t\tchunk.id,\n\t\tchunk.name,\n\t\tchunk.input,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tfullResponse,\n\t\tstartTime\n\t);\n};\n\nconst processStream = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tconst toolDefs = options.tools\n\t\t? buildToolDefinitions(options.tools)\n\t\t: undefined;\n\n\tconst thinkingConfig = options.thinking\n\t\t? {\n\t\t\t\tbudget_tokens: typeof options.thinking === 'object'\n\t\t\t\t\t? options.thinking.budgetTokens\n\t\t\t\t\t: 10000,\n\t\t\t\ttype: 'enabled'\n\t\t\t}\n\t\t: undefined;\n\n\tconst stream = options.provider.stream({\n\t\tmessages,\n\t\tmodel: options.model,\n\t\tsignal,\n\t\tsystemPrompt: options.systemPrompt,\n\t\tthinking: thinkingConfig,\n\t\ttools: toolDefs\n\t});\n\n\tconst result = await consumeStream(\n\t\tstream,\n\t\toptions,\n\t\tsocket,\n\t\tmessages,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tstartTime\n\t);\n\n\tif (!result.earlyReturn) {\n\t\tawait sendComplete(\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tresult.usage,\n\t\t\tDate.now() - startTime,\n\t\t\toptions.model\n\t\t);\n\t\toptions.onComplete?.(result.fullResponse, result.usage);\n\t}\n};\n\ntype ConsumeStreamResult = {\n\tearlyReturn: boolean;\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst consumeStreamChunk = async (\n\tchunk: AIChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tswitch (chunk.type) {\n\t\tcase 'thinking':\n\t\t\tawait sendMessage(socket, {\n\t\t\t\tcontent: chunk.content,\n\t\t\t\tconversationId,\n\t\t\t\tmessageId,\n\t\t\t\ttype: 'thinking'\n\t\t\t});\n\n\t\t\treturn '';\n\n\t\tcase 'text':\n\t\t\treturn processStreamTextChunk(\n\t\t\t\tchunk,\n\t\t\t\toptions,\n\t\t\t\tsocket,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId\n\t\t\t);\n\n\t\tcase 'tool_use':\n\t\t\tawait processStreamToolUseChunk(\n\t\t\t\tchunk,\n\t\t\t\tsocket,\n\t\t\t\toptions,\n\t\t\t\tmessages,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId,\n\t\t\t\tsignal,\n\t\t\t\tfullResponse,\n\t\t\t\tstartTime\n\t\t\t);\n\n\t\t\treturn { earlyReturn: true, fullResponse, usage: undefined };\n\n\t\tcase 'done':\n\t\t\treturn { earlyReturn: false, fullResponse, usage: chunk.usage };\n\t}\n\n\treturn '';\n};\n\ntype ConsumeStreamState = {\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst applyStreamChunkResult = (\n\tresult: ConsumeStreamResult | string,\n\tstate: ConsumeStreamState\n) => {\n\tif (typeof result === 'string') {\n\t\tstate.fullResponse += result;\n\n\t\treturn undefined;\n\t}\n\n\tif (result.earlyReturn) return result;\n\n\tstate.usage = result.usage;\n\n\treturn undefined;\n};\n\nconst consumeStream = async (\n\tstream: AsyncIterable<AIChunk>,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tconst state: ConsumeStreamState = { fullResponse: '', usage: undefined };\n\n\tfor await (const chunk of stream) {\n\t\tif (signal.aborted) break;\n\n\t\tconst result = await consumeStreamChunk(\n\t\t\tchunk,\n\t\t\toptions,\n\t\t\tsocket,\n\t\t\tmessages,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstate.fullResponse,\n\t\t\tstartTime\n\t\t);\n\t\tconst earlyExit = applyStreamChunkResult(result, state);\n\n\t\tif (earlyExit) return earlyExit;\n\t}\n\n\tconst finalResult: ConsumeStreamResult = {\n\t\tearlyReturn: false,\n\t\tfullResponse: state.fullResponse,\n\t\tusage: state.usage\n\t};\n\n\treturn finalResult;\n};\n\nexport const streamAI = async (\n\tsocket: AIWebSocket,\n\tconversationId: string,\n\tmessageId: string,\n\toptions: StreamAIOptions\n) => {\n\tconst signal = options.signal ?? new AbortController().signal;\n\tconst startTime = Date.now();\n\n\tconst messages: AIProviderMessage[] = options.messages\n\t\t? [...options.messages]\n\t\t: [];\n\n\ttry {\n\t\tawait processStream(\n\t\t\tsocket,\n\t\t\toptions,\n\t\t\tmessages,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstartTime\n\t\t);\n\t} catch (err) {\n\t\tawait handleStreamError(\n\t\t\tsocket,\n\t\t\terr,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstartTime\n\t\t);\n\t}\n};\n\nconst handleStreamError = async (\n\tsocket: AIWebSocket,\n\terr: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tif (signal.aborted) {\n\t\tawait sendComplete(\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tundefined,\n\t\t\tDate.now() - startTime\n\t\t);\n\n\t\treturn;\n\t}\n\n\tawait sendError(socket, err, messageId, conversationId);\n};\n"
|
|
12
12
|
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "0917CFAC1D8BB99A64756E2164756E21",
|
|
15
15
|
"names": []
|
|
16
16
|
}
|
|
@@ -83,6 +83,12 @@ var DATA_PREFIX_LENGTH = 6;
|
|
|
83
83
|
var EMPTY_CHUNKS = [];
|
|
84
84
|
var isRecord = (val) => typeof val === "object" && val !== null;
|
|
85
85
|
var mapContentBlock = (block) => {
|
|
86
|
+
if (block.type === "image") {
|
|
87
|
+
return {
|
|
88
|
+
source: block.source,
|
|
89
|
+
type: "image"
|
|
90
|
+
};
|
|
91
|
+
}
|
|
86
92
|
if (block.type === "tool_result") {
|
|
87
93
|
return {
|
|
88
94
|
content: block.content,
|
|
@@ -123,6 +129,10 @@ var buildRequestBody = (params) => {
|
|
|
123
129
|
if (params.tools && params.tools.length > 0) {
|
|
124
130
|
body.tools = params.tools.map(mapToolDefinition);
|
|
125
131
|
}
|
|
132
|
+
if (params.thinking) {
|
|
133
|
+
body.thinking = params.thinking;
|
|
134
|
+
body.max_tokens = Math.max(MAX_TOKENS, params.thinking.budget_tokens + MAX_TOKENS);
|
|
135
|
+
}
|
|
126
136
|
return body;
|
|
127
137
|
};
|
|
128
138
|
var classifyLine = (line) => {
|
|
@@ -203,6 +213,12 @@ var handleContentBlockDelta = (parsed, state) => {
|
|
|
203
213
|
if (!delta) {
|
|
204
214
|
return;
|
|
205
215
|
}
|
|
216
|
+
if (delta.type === "thinking_delta") {
|
|
217
|
+
return {
|
|
218
|
+
content: getString(delta, "thinking"),
|
|
219
|
+
type: "thinking"
|
|
220
|
+
};
|
|
221
|
+
}
|
|
206
222
|
if (delta.type === "text_delta") {
|
|
207
223
|
return {
|
|
208
224
|
content: getString(delta, "text"),
|
|
@@ -392,5 +408,5 @@ export {
|
|
|
392
408
|
anthropic
|
|
393
409
|
};
|
|
394
410
|
|
|
395
|
-
//# debugId=
|
|
411
|
+
//# debugId=11F4224A486C49B264756E2164756E21
|
|
396
412
|
//# sourceMappingURL=anthropic.js.map
|