@absolutejs/absolute 0.19.0-beta.247 → 0.19.0-beta.249

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 (42) hide show
  1. package/.absolutejs/eslint-cache +1 -1
  2. package/.absolutejs/prettier.cache.json +17 -13
  3. package/.absolutejs/vue-tsc.tsbuildinfo +1 -1
  4. package/.claude/settings.local.json +2 -1
  5. package/.playwright-mcp/page-2026-03-31T16-05-33-392Z.png +0 -0
  6. package/dist/ai/index.js +667 -11
  7. package/dist/ai/index.js.map +10 -8
  8. package/dist/ai/providers/anthropic.js +7 -1
  9. package/dist/ai/providers/anthropic.js.map +3 -3
  10. package/dist/ai/providers/gemini.js +331 -0
  11. package/dist/ai/providers/gemini.js.map +10 -0
  12. package/dist/ai/providers/ollama.js.map +2 -2
  13. package/dist/ai/providers/openai.js +11 -3
  14. package/dist/ai/providers/openai.js.map +3 -3
  15. package/dist/ai/providers/openaiCompatible.js +11 -3
  16. package/dist/ai/providers/openaiCompatible.js.map +4 -4
  17. package/dist/ai/providers/openaiResponses.js +432 -0
  18. package/dist/ai/providers/openaiResponses.js.map +10 -0
  19. package/dist/ai-client/angular/ai/index.js +61 -1
  20. package/dist/ai-client/react/ai/index.js +61 -1
  21. package/dist/ai-client/vue/ai/index.js +61 -1
  22. package/dist/angular/ai/index.js +62 -2
  23. package/dist/angular/ai/index.js.map +5 -5
  24. package/dist/build.js +3 -1
  25. package/dist/build.js.map +3 -3
  26. package/dist/index.js +3 -1
  27. package/dist/index.js.map +3 -3
  28. package/dist/react/ai/index.js +62 -2
  29. package/dist/react/ai/index.js.map +6 -6
  30. package/dist/src/ai/client/actions.d.ts +43 -0
  31. package/dist/src/ai/index.d.ts +2 -0
  32. package/dist/src/ai/providers/gemini.d.ts +7 -0
  33. package/dist/src/ai/providers/openaiResponses.d.ts +10 -0
  34. package/dist/svelte/ai/index.js +62 -2
  35. package/dist/svelte/ai/index.js.map +5 -5
  36. package/dist/types/ai.d.ts +48 -3
  37. package/dist/vue/ai/index.js +62 -2
  38. package/dist/vue/ai/index.js.map +5 -5
  39. package/package.json +9 -1
  40. package/scripts/build.ts +2 -0
  41. package/types/ai.ts +80 -6
  42. package/types/typeGuards.ts +11 -0
@@ -0,0 +1,331 @@
1
+ // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ function __accessProp(key) {
9
+ return this[key];
10
+ }
11
+ var __toESMCache_node;
12
+ var __toESMCache_esm;
13
+ var __toESM = (mod, isNodeMode, target) => {
14
+ var canCache = mod != null && typeof mod === "object";
15
+ if (canCache) {
16
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
17
+ var cached = cache.get(mod);
18
+ if (cached)
19
+ return cached;
20
+ }
21
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
22
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
23
+ for (let key of __getOwnPropNames(mod))
24
+ if (!__hasOwnProp.call(to, key))
25
+ __defProp(to, key, {
26
+ get: __accessProp.bind(mod, key),
27
+ enumerable: true
28
+ });
29
+ if (canCache)
30
+ cache.set(mod, to);
31
+ return to;
32
+ };
33
+ var __toCommonJS = (from) => {
34
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
35
+ if (entry)
36
+ return entry;
37
+ entry = __defProp({}, "__esModule", { value: true });
38
+ if (from && typeof from === "object" || typeof from === "function") {
39
+ for (var key of __getOwnPropNames(from))
40
+ if (!__hasOwnProp.call(entry, key))
41
+ __defProp(entry, key, {
42
+ get: __accessProp.bind(from, key),
43
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
44
+ });
45
+ }
46
+ __moduleCache.set(from, entry);
47
+ return entry;
48
+ };
49
+ var __moduleCache;
50
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
51
+ var __returnValue = (v) => v;
52
+ function __exportSetter(name, newValue) {
53
+ this[name] = __returnValue.bind(null, newValue);
54
+ }
55
+ var __export = (target, all) => {
56
+ for (var name in all)
57
+ __defProp(target, name, {
58
+ get: all[name],
59
+ enumerable: true,
60
+ configurable: true,
61
+ set: __exportSetter.bind(all, name)
62
+ });
63
+ };
64
+ var __legacyDecorateClassTS = function(decorators, target, key, desc) {
65
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
66
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
67
+ r = Reflect.decorate(decorators, target, key, desc);
68
+ else
69
+ for (var i = decorators.length - 1;i >= 0; i--)
70
+ if (d = decorators[i])
71
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
72
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
73
+ };
74
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
75
+ var __require = import.meta.require;
76
+
77
+ // src/ai/providers/gemini.ts
78
+ var DEFAULT_BASE_URL = "https://generativelanguage.googleapis.com";
79
+ var SSE_DATA_PREFIX_LENGTH = 6;
80
+ var isRecord = (value) => typeof value === "object" && value !== null;
81
+ var isRecordArray = (value) => Array.isArray(value) && value.length > 0 && isRecord(value[0]);
82
+ var mapRole = (role) => {
83
+ if (role === "assistant" || role === "system")
84
+ return "model";
85
+ return "user";
86
+ };
87
+ var mapContentBlock = (block) => {
88
+ switch (block.type) {
89
+ case "text":
90
+ return { text: block.content };
91
+ case "image":
92
+ return {
93
+ inlineData: {
94
+ data: block.source.data,
95
+ mimeType: block.source.media_type
96
+ }
97
+ };
98
+ case "document":
99
+ return {
100
+ inlineData: {
101
+ data: block.source.data,
102
+ mimeType: block.source.media_type
103
+ }
104
+ };
105
+ case "tool_use":
106
+ return {
107
+ functionCall: {
108
+ args: typeof block.input === "string" ? JSON.parse(block.input) : block.input,
109
+ name: block.name
110
+ }
111
+ };
112
+ case "tool_result":
113
+ return {
114
+ functionResponse: {
115
+ name: block.tool_use_id,
116
+ response: { result: block.content }
117
+ }
118
+ };
119
+ default:
120
+ return null;
121
+ }
122
+ };
123
+ var convertMessageContent = (content) => {
124
+ if (typeof content === "string") {
125
+ return [{ text: content }];
126
+ }
127
+ const parts = [];
128
+ for (const block of content) {
129
+ const mapped = mapContentBlock(block);
130
+ if (mapped) {
131
+ parts.push(mapped);
132
+ }
133
+ }
134
+ return parts;
135
+ };
136
+ var hasFunctionResponse = (content) => content.some((block) => block.type === "tool_result");
137
+ var convertMessages = (messages) => {
138
+ const contents = [];
139
+ for (const msg of messages) {
140
+ if (typeof msg.content !== "string" && hasFunctionResponse(msg.content)) {
141
+ const parts = convertMessageContent(msg.content);
142
+ contents.push({ parts, role: "user" });
143
+ continue;
144
+ }
145
+ contents.push({
146
+ parts: convertMessageContent(msg.content),
147
+ role: mapRole(msg.role)
148
+ });
149
+ }
150
+ return contents;
151
+ };
152
+ var mapToolDefinitions = (tools) => tools.map((tool) => ({
153
+ description: tool.description,
154
+ name: tool.name,
155
+ parameters: tool.input_schema
156
+ }));
157
+ var buildRequestBody = (params) => {
158
+ const body = {
159
+ contents: convertMessages(params.messages),
160
+ generationConfig: {
161
+ responseModalities: ["TEXT", "IMAGE"]
162
+ }
163
+ };
164
+ if (params.systemPrompt) {
165
+ body.systemInstruction = {
166
+ parts: [{ text: params.systemPrompt }]
167
+ };
168
+ }
169
+ if (params.tools && params.tools.length > 0) {
170
+ body.tools = [
171
+ { functionDeclarations: mapToolDefinitions(params.tools) }
172
+ ];
173
+ }
174
+ return body;
175
+ };
176
+ var extractMimeFormat = (mimeType) => {
177
+ if (typeof mimeType !== "string") {
178
+ return "png";
179
+ }
180
+ if (mimeType.includes("jpeg") || mimeType.includes("jpg"))
181
+ return "jpeg";
182
+ if (mimeType.includes("webp"))
183
+ return "webp";
184
+ return "png";
185
+ };
186
+ var processTextPart = function* (part) {
187
+ if (typeof part.text === "string" && part.text) {
188
+ yield { content: part.text, type: "text" };
189
+ }
190
+ };
191
+ var processInlineDataPart = function* (inlineData) {
192
+ const data = typeof inlineData.data === "string" ? inlineData.data : "";
193
+ const mimeType = inlineData.mimeType;
194
+ if (!data) {
195
+ return;
196
+ }
197
+ yield {
198
+ data,
199
+ format: extractMimeFormat(mimeType),
200
+ isPartial: false,
201
+ type: "image"
202
+ };
203
+ };
204
+ var processFunctionCallPart = function* (functionCall) {
205
+ const name = typeof functionCall.name === "string" ? functionCall.name : "";
206
+ const args = functionCall.args ?? {};
207
+ yield {
208
+ id: `gemini-${name}-${Date.now()}`,
209
+ input: args,
210
+ name,
211
+ type: "tool_use"
212
+ };
213
+ };
214
+ var processPart = function* (part) {
215
+ if ("text" in part) {
216
+ yield* processTextPart(part);
217
+ }
218
+ if (isRecord(part.inlineData)) {
219
+ yield* processInlineDataPart(part.inlineData);
220
+ }
221
+ if (isRecord(part.functionCall)) {
222
+ yield* processFunctionCallPart(part.functionCall);
223
+ }
224
+ };
225
+ var extractUsage = (parsed) => {
226
+ if (!isRecord(parsed.usageMetadata)) {
227
+ return;
228
+ }
229
+ const { usageMetadata } = parsed;
230
+ return {
231
+ inputTokens: typeof usageMetadata.promptTokenCount === "number" ? usageMetadata.promptTokenCount : 0,
232
+ outputTokens: typeof usageMetadata.candidatesTokenCount === "number" ? usageMetadata.candidatesTokenCount : 0
233
+ };
234
+ };
235
+ var processChunk = function* (parsed, state) {
236
+ const usage = extractUsage(parsed);
237
+ if (usage) {
238
+ state.usage = usage;
239
+ }
240
+ if (!isRecordArray(parsed.candidates)) {
241
+ return;
242
+ }
243
+ const candidate = parsed.candidates[0];
244
+ if (!candidate || !isRecord(candidate.content)) {
245
+ return;
246
+ }
247
+ const { content } = candidate;
248
+ if (!isRecordArray(content.parts)) {
249
+ return;
250
+ }
251
+ for (const part of content.parts) {
252
+ yield* processPart(part);
253
+ }
254
+ };
255
+ var processSSELine = function* (line, state) {
256
+ const trimmed = line.trim();
257
+ if (!trimmed || !trimmed.startsWith("data: ")) {
258
+ return;
259
+ }
260
+ const data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);
261
+ let parsed;
262
+ try {
263
+ parsed = JSON.parse(data);
264
+ } catch {
265
+ return;
266
+ }
267
+ yield* processChunk(parsed, state);
268
+ };
269
+ var drainReader = async function* (reader, decoder, state, signal) {
270
+ let textBuffer = "";
271
+ for (let result = await reader.read();!result.done && !signal?.aborted; result = await reader.read()) {
272
+ textBuffer += decoder.decode(result.value, { stream: true });
273
+ const lines = textBuffer.split(`
274
+ `);
275
+ textBuffer = lines.pop() ?? "";
276
+ for (const line of lines) {
277
+ yield* processSSELine(line, state);
278
+ }
279
+ }
280
+ if (textBuffer.trim()) {
281
+ yield* processSSELine(textBuffer, state);
282
+ }
283
+ yield { type: "done", usage: state.usage };
284
+ };
285
+ var parseSSEStream = async function* (body, signal) {
286
+ const reader = body.getReader();
287
+ const decoder = new TextDecoder;
288
+ const state = {
289
+ buffer: "",
290
+ usage: undefined
291
+ };
292
+ try {
293
+ yield* drainReader(reader, decoder, state, signal);
294
+ } finally {
295
+ reader.releaseLock();
296
+ }
297
+ };
298
+ var fetchGeminiStream = async function* (baseUrl, apiKey, model, body, signal) {
299
+ const url = `${baseUrl}/v1beta/models/${model}:streamGenerateContent?alt=sse&key=${apiKey}`;
300
+ const response = await fetch(url, {
301
+ body: JSON.stringify(body),
302
+ headers: {
303
+ "Content-Type": "application/json"
304
+ },
305
+ method: "POST",
306
+ signal
307
+ });
308
+ if (!response.ok) {
309
+ const errorText = await response.text();
310
+ throw new Error(`Gemini API error ${response.status}: ${errorText}`);
311
+ }
312
+ if (!response.body) {
313
+ throw new Error("Gemini API returned no response body");
314
+ }
315
+ yield* parseSSEStream(response.body, signal);
316
+ };
317
+ var gemini = (config) => {
318
+ const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
319
+ return {
320
+ stream: (params) => {
321
+ const body = buildRequestBody(params);
322
+ return fetchGeminiStream(baseUrl, config.apiKey, params.model, body, params.signal);
323
+ }
324
+ };
325
+ };
326
+ export {
327
+ gemini
328
+ };
329
+
330
+ //# debugId=4D7EA059A071BAEE64756E2164756E21
331
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ai/providers/gemini.ts"],
4
+ "sourcesContent": [
5
+ "import type {\n\tAIChunk,\n\tAIProviderConfig,\n\tAIProviderContentBlock,\n\tAIProviderMessage,\n\tAIProviderStreamParams,\n\tAIProviderToolDefinition,\n\tAIUsage\n} from '../../../types/ai';\n\ntype GeminiConfig = {\n\tapiKey: string;\n\tbaseUrl?: string;\n};\n\ntype StreamState = {\n\tbuffer: string;\n\tusage: AIUsage | undefined;\n};\n\nconst DEFAULT_BASE_URL = 'https://generativelanguage.googleapis.com';\nconst SSE_DATA_PREFIX_LENGTH = 6;\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\n/* ─── Message conversion ─── */\n\nconst mapRole = (role: string) => {\n\tif (role === 'assistant' || role === 'system') return 'model';\n\n\treturn 'user';\n};\n\nconst mapContentBlock = (\n\tblock: AIProviderContentBlock\n): Record<string, unknown> | null => {\n\tswitch (block.type) {\n\t\tcase 'text':\n\t\t\treturn { text: block.content };\n\t\tcase 'image':\n\t\t\treturn {\n\t\t\t\tinlineData: {\n\t\t\t\t\tdata: block.source.data,\n\t\t\t\t\tmimeType: block.source.media_type\n\t\t\t\t}\n\t\t\t};\n\t\tcase 'document':\n\t\t\treturn {\n\t\t\t\tinlineData: {\n\t\t\t\t\tdata: block.source.data,\n\t\t\t\t\tmimeType: block.source.media_type\n\t\t\t\t}\n\t\t\t};\n\t\tcase 'tool_use':\n\t\t\treturn {\n\t\t\t\tfunctionCall: {\n\t\t\t\t\targs:\n\t\t\t\t\t\ttypeof block.input === 'string'\n\t\t\t\t\t\t\t? JSON.parse(block.input)\n\t\t\t\t\t\t\t: block.input,\n\t\t\t\t\tname: block.name\n\t\t\t\t}\n\t\t\t};\n\t\tcase 'tool_result':\n\t\t\treturn {\n\t\t\t\tfunctionResponse: {\n\t\t\t\t\tname: block.tool_use_id,\n\t\t\t\t\tresponse: { result: block.content }\n\t\t\t\t}\n\t\t\t};\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n\nconst convertMessageContent = (\n\tcontent: string | AIProviderContentBlock[]\n): Array<Record<string, unknown>> => {\n\tif (typeof content === 'string') {\n\t\treturn [{ text: content }];\n\t}\n\n\tconst parts: Array<Record<string, unknown>> = [];\n\n\tfor (const block of content) {\n\t\tconst mapped = mapContentBlock(block);\n\n\t\tif (mapped) {\n\t\t\tparts.push(mapped);\n\t\t}\n\t}\n\n\treturn parts;\n};\n\nconst hasFunctionResponse = (content: AIProviderContentBlock[]) =>\n\tcontent.some((block) => block.type === 'tool_result');\n\nconst convertMessages = (messages: AIProviderMessage[]) => {\n\tconst contents: Array<Record<string, unknown>> = [];\n\n\tfor (const msg of messages) {\n\t\tif (\n\t\t\ttypeof msg.content !== 'string' &&\n\t\t\thasFunctionResponse(msg.content)\n\t\t) {\n\t\t\tconst parts = convertMessageContent(msg.content);\n\n\t\t\tcontents.push({ parts, role: 'user' });\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontents.push({\n\t\t\tparts: convertMessageContent(msg.content),\n\t\t\trole: mapRole(msg.role)\n\t\t});\n\t}\n\n\treturn contents;\n};\n\nconst mapToolDefinitions = (tools: AIProviderToolDefinition[]) =>\n\ttools.map((tool) => ({\n\t\tdescription: tool.description,\n\t\tname: tool.name,\n\t\tparameters: tool.input_schema\n\t}));\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n\tconst body: Record<string, unknown> = {\n\t\tcontents: convertMessages(params.messages),\n\t\tgenerationConfig: {\n\t\t\tresponseModalities: ['TEXT', 'IMAGE']\n\t\t}\n\t};\n\n\tif (params.systemPrompt) {\n\t\tbody.systemInstruction = {\n\t\t\tparts: [{ text: params.systemPrompt }]\n\t\t};\n\t}\n\n\tif (params.tools && params.tools.length > 0) {\n\t\tbody.tools = [\n\t\t\t{ functionDeclarations: mapToolDefinitions(params.tools) }\n\t\t];\n\t}\n\n\treturn body;\n};\n\n/* ─── SSE parsing ─── */\n\nconst extractMimeFormat = (mimeType: unknown) => {\n\tif (typeof mimeType !== 'string') {\n\t\treturn 'png';\n\t}\n\n\tif (mimeType.includes('jpeg') || mimeType.includes('jpg')) return 'jpeg';\n\tif (mimeType.includes('webp')) return 'webp';\n\n\treturn 'png';\n};\n\nconst processTextPart = function* (part: Record<string, unknown>) {\n\tif (typeof part.text === 'string' && part.text) {\n\t\tyield { content: part.text, type: 'text' as const };\n\t}\n};\n\nconst processInlineDataPart = function* (inlineData: Record<string, unknown>) {\n\tconst data = typeof inlineData.data === 'string' ? inlineData.data : '';\n\tconst mimeType = inlineData.mimeType;\n\n\tif (!data) {\n\t\treturn;\n\t}\n\n\tyield {\n\t\tdata,\n\t\tformat: extractMimeFormat(mimeType),\n\t\tisPartial: false,\n\t\ttype: 'image' as const\n\t};\n};\n\nconst processFunctionCallPart = function* (\n\tfunctionCall: Record<string, unknown>\n) {\n\tconst name = typeof functionCall.name === 'string' ? functionCall.name : '';\n\tconst args = functionCall.args ?? {};\n\n\tyield {\n\t\tid: `gemini-${name}-${Date.now()}`,\n\t\tinput: args,\n\t\tname,\n\t\ttype: 'tool_use' as const\n\t};\n};\n\nconst processPart = function* (part: Record<string, unknown>) {\n\tif ('text' in part) {\n\t\tyield* processTextPart(part);\n\t}\n\n\tif (isRecord(part.inlineData)) {\n\t\tyield* processInlineDataPart(part.inlineData);\n\t}\n\n\tif (isRecord(part.functionCall)) {\n\t\tyield* processFunctionCallPart(part.functionCall);\n\t}\n};\n\nconst extractUsage = (parsed: Record<string, unknown>): AIUsage | undefined => {\n\tif (!isRecord(parsed.usageMetadata)) {\n\t\treturn undefined;\n\t}\n\n\tconst { usageMetadata } = parsed;\n\n\treturn {\n\t\tinputTokens:\n\t\t\ttypeof usageMetadata.promptTokenCount === 'number'\n\t\t\t\t? usageMetadata.promptTokenCount\n\t\t\t\t: 0,\n\t\toutputTokens:\n\t\t\ttypeof usageMetadata.candidatesTokenCount === 'number'\n\t\t\t\t? usageMetadata.candidatesTokenCount\n\t\t\t\t: 0\n\t};\n};\n\nconst processChunk = function* (\n\tparsed: Record<string, unknown>,\n\tstate: StreamState\n): Generator<AIChunk> {\n\tconst usage = extractUsage(parsed);\n\n\tif (usage) {\n\t\tstate.usage = usage;\n\t}\n\n\tif (!isRecordArray(parsed.candidates)) {\n\t\treturn;\n\t}\n\n\tconst candidate = parsed.candidates[0];\n\n\tif (!candidate || !isRecord(candidate.content)) {\n\t\treturn;\n\t}\n\n\tconst { content } = candidate;\n\n\tif (!isRecordArray(content.parts)) {\n\t\treturn;\n\t}\n\n\tfor (const part of content.parts) {\n\t\tyield* processPart(part);\n\t}\n};\n\nconst processSSELine = function* (\n\tline: string,\n\tstate: StreamState\n): Generator<AIChunk> {\n\tconst trimmed = line.trim();\n\n\tif (!trimmed || !trimmed.startsWith('data: ')) {\n\t\treturn;\n\t}\n\n\tconst data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);\n\n\tlet parsed: Record<string, unknown>;\n\n\ttry {\n\t\tparsed = JSON.parse(data);\n\t} catch {\n\t\treturn;\n\t}\n\n\tyield* processChunk(parsed, state);\n};\n\nconst drainReader = async function* (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tstate: StreamState,\n\tsignal?: AbortSignal\n): AsyncGenerator<AIChunk> {\n\tlet textBuffer = '';\n\n\tfor (\n\t\tlet result = await reader.read();\n\t\t!result.done && !signal?.aborted;\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tresult = await reader.read()\n\t) {\n\t\ttextBuffer += decoder.decode(result.value, { stream: true });\n\t\tconst lines = textBuffer.split('\\n');\n\t\ttextBuffer = lines.pop() ?? '';\n\n\t\tfor (const line of lines) {\n\t\t\tyield* processSSELine(line, state);\n\t\t}\n\t}\n\n\tif (textBuffer.trim()) {\n\t\tyield* processSSELine(textBuffer, state);\n\t}\n\n\tyield { type: 'done' as const, usage: state.usage };\n};\n\nconst parseSSEStream = async function* (\n\tbody: ReadableStream<Uint8Array>,\n\tsignal?: AbortSignal\n): AsyncGenerator<AIChunk> {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tconst state: StreamState = {\n\t\tbuffer: '',\n\t\tusage: undefined\n\t};\n\n\ttry {\n\t\tyield* drainReader(reader, decoder, state, signal);\n\t} finally {\n\t\treader.releaseLock();\n\t}\n};\n\nconst fetchGeminiStream = async function* (\n\tbaseUrl: string,\n\tapiKey: string,\n\tmodel: string,\n\tbody: Record<string, unknown>,\n\tsignal?: AbortSignal\n): AsyncGenerator<AIChunk> {\n\tconst url = `${baseUrl}/v1beta/models/${model}:streamGenerateContent?alt=sse&key=${apiKey}`;\n\n\tconst response = await fetch(url, {\n\t\tbody: JSON.stringify(body),\n\t\theaders: {\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(`Gemini API error ${response.status}: ${errorText}`);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('Gemini API returned no response body');\n\t}\n\n\tyield* parseSSEStream(response.body, signal);\n};\n\nexport const gemini = (config: GeminiConfig): 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 fetchGeminiStream(\n\t\t\t\tbaseUrl,\n\t\t\t\tconfig.apiKey,\n\t\t\t\tparams.model,\n\t\t\t\tbody,\n\t\t\t\tparams.signal\n\t\t\t);\n\t\t}\n\t};\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "4D7EA059A071BAEE64756E2164756E21",
9
+ "names": []
10
+ }
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/ai/providers/ollama.ts"],
4
4
  "sourcesContent": [
5
- "import type {\n\tAIChunk,\n\tAIDoneChunk,\n\tAIProviderConfig,\n\tAIProviderStreamParams,\n\tAIProviderToolDefinition\n} from '../../../types/ai';\n\ntype OllamaConfig = {\n\tbaseUrl?: string;\n};\n\ntype OllamaMessage = {\n\tcontent: string;\n\trole: 'assistant' | 'system' | 'tool' | 'user';\n\ttool_calls?: Array<{\n\t\tfunction: { arguments: Record<string, unknown>; name: string };\n\t}>;\n};\n\nconst DEFAULT_BASE_URL = 'http://localhost:11434';\nconst ZERO_TOKENS = 0;\n\nconst DONE_CHUNK: AIChunk = { type: 'done' };\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 convertMessage = (msg: AIProviderStreamParams['messages'][number]): OllamaMessage[] => {\n\tif (typeof msg.content === 'string') {\n\t\treturn [{ content: msg.content, role: msg.role }];\n\t}\n\n\tconst results: OllamaMessage[] = [];\n\tconst toolUseBlocks = msg.content.filter((block) => block.type === 'tool_use');\n\tconst toolResultBlocks = msg.content.filter((block) => block.type === 'tool_result');\n\n\tif (toolUseBlocks.length > 0) {\n\t\tresults.push({\n\t\t\tcontent: '',\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 === 'object' && block.input !== null\n\t\t\t\t\t\t? block.input as Record<string, unknown>\n\t\t\t\t\t\t: {},\n\t\t\t\t\tname: block.name\n\t\t\t\t}\n\t\t\t}))\n\t\t});\n\t}\n\n\tfor (const block of toolResultBlocks) {\n\t\tresults.push({\n\t\t\tcontent: typeof block.content === 'string' ? block.content : '',\n\t\t\trole: 'tool'\n\t\t});\n\t}\n\n\treturn results;\n};\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n\tconst messages: OllamaMessage[] = params.messages.flatMap(convertMessage);\n\n\tif (params.systemPrompt) {\n\t\tmessages.unshift({ content: params.systemPrompt, role: 'system' });\n\t}\n\n\tconst body: Record<string, unknown> = {\n\t\tmessages,\n\t\tmodel: params.model,\n\t\tstream: 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 isRecord = (val: unknown): val is Record<string, unknown> =>\n\tval !== null && typeof val === 'object' && !Array.isArray(val);\n\nconst tryParseJSON = (text: string) => {\n\ttry {\n\t\tconst result: unknown = JSON.parse(text);\n\t\tif (isRecord(result)) {\n\t\t\treturn result;\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nconst buildDoneChunk = (parsed: Record<string, unknown>): AIDoneChunk => {\n\tconst promptEvalCount =\n\t\ttypeof parsed.prompt_eval_count === 'number'\n\t\t\t? parsed.prompt_eval_count\n\t\t\t: undefined;\n\tconst evalCount =\n\t\ttypeof parsed.eval_count === 'number' ? parsed.eval_count : undefined;\n\tconst totalDuration =\n\t\ttypeof parsed.total_duration === 'number'\n\t\t\t? parsed.total_duration\n\t\t\t: undefined;\n\n\tconst hasTokenCounts =\n\t\tpromptEvalCount !== undefined || evalCount !== undefined;\n\tif (hasTokenCounts) {\n\t\treturn {\n\t\t\ttype: 'done',\n\t\t\tusage: {\n\t\t\t\tinputTokens: promptEvalCount ?? ZERO_TOKENS,\n\t\t\t\toutputTokens: evalCount ?? ZERO_TOKENS\n\t\t\t}\n\t\t};\n\t}\n\n\tif (totalDuration !== undefined) {\n\t\treturn {\n\t\t\ttype: 'done',\n\t\t\tusage: { inputTokens: ZERO_TOKENS, outputTokens: ZERO_TOKENS }\n\t\t};\n\t}\n\n\treturn { type: 'done' };\n};\n\nconst buildTextChunk = (content: string): AIChunk => ({\n\tcontent,\n\ttype: 'text'\n});\n\nconst extractToolCalls = (message: Record<string, unknown>): AIChunk[] => {\n\tconst toolCalls = message.tool_calls;\n\n\tif (!Array.isArray(toolCalls) || toolCalls.length === 0) {\n\t\treturn [];\n\t}\n\n\treturn toolCalls\n\t\t.filter(isRecord)\n\t\t.filter((tc) => isRecord(tc.function))\n\t\t.map((tc) => {\n\t\t\tconst func = tc.function as Record<string, unknown>;\n\n\t\t\treturn {\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tinput: func.arguments ?? {},\n\t\t\t\tname: typeof func.name === 'string' ? func.name : '',\n\t\t\t\ttype: 'tool_use' as const\n\t\t\t};\n\t\t});\n};\n\nconst extractChunks = (parsed: Record<string, unknown>): AIChunk[] => {\n\tconst { message } = parsed;\n\n\tif (!isRecord(message)) {\n\t\treturn [];\n\t}\n\n\tconst toolChunks = extractToolCalls(message);\n\n\tif (toolChunks.length > 0) {\n\t\treturn toolChunks;\n\t}\n\n\tconst { content } = message;\n\n\tif (typeof content !== 'string' || !content) {\n\t\treturn [];\n\t}\n\n\treturn [buildTextChunk(content)];\n};\n\nconst extractTextChunk = (parsed: Record<string, unknown>) => {\n\tconst { message } = parsed;\n\tif (!isRecord(message)) {\n\t\treturn null;\n\t}\n\n\tconst { content } = message;\n\tif (typeof content !== 'string' || !content) {\n\t\treturn null;\n\t}\n\n\treturn buildTextChunk(content);\n};\n\nconst processLine = (line: string): AIChunk[] => {\n\tconst trimmed = line.trim();\n\n\tif (!trimmed) {\n\t\treturn [];\n\t}\n\n\tconst parsed = tryParseJSON(trimmed);\n\n\tif (!parsed) {\n\t\treturn [];\n\t}\n\n\tif (parsed.done === true) {\n\t\treturn [buildDoneChunk(parsed)];\n\t}\n\n\treturn extractChunks(parsed);\n};\n\nconst processBufferedLines = (lines: string[]) =>\n\tlines.flatMap(processLine);\n\nconst readStreamChunks = async (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tbuffer: string,\n\tsignal?: AbortSignal\n) => {\n\tconst emptyChunks: AIChunk[] = [];\n\n\tif (signal?.aborted) {\n\t\treturn {\n\t\t\tallChunks: emptyChunks,\n\t\t\tcurrentBuffer: buffer,\n\t\t\tfinished: true\n\t\t};\n\t}\n\n\tconst result = await reader.read();\n\tconst { done, value } = result;\n\n\tif (done) {\n\t\treturn {\n\t\t\tallChunks: emptyChunks,\n\t\t\tcurrentBuffer: buffer,\n\t\t\tfinished: true\n\t\t};\n\t}\n\n\tconst currentBuffer = buffer + decoder.decode(value, { stream: true });\n\tconst lines = currentBuffer.split('\\n');\n\tconst remainder = lines.pop() ?? '';\n\tconst allChunks = processBufferedLines(lines);\n\tconst finished = allChunks.some((c) => c.type === 'done');\n\n\treturn { allChunks, currentBuffer: remainder, finished };\n};\n\nconst parseNDJSONStream = async function* (\n\tbody: ReadableStream<Uint8Array>,\n\tsignal?: AbortSignal\n) {\n\tconst reader = body.getReader();\n\n\ttry {\n\t\tyield* parseNDJSONStreamInner(reader, signal);\n\t} finally {\n\t\treader.releaseLock();\n\t}\n};\n\nconst parseNDJSONStreamInner = async function* (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tsignal?: AbortSignal\n) {\n\tconst decoder = new TextDecoder();\n\tlet buffer = '';\n\tlet done = false;\n\n\twhile (!done) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst result = await readStreamChunks(reader, decoder, buffer, signal);\n\t\tbuffer = result.currentBuffer;\n\t\tdone = result.finished;\n\n\t\tyield* result.allChunks;\n\t}\n\n\tyield DONE_CHUNK;\n};\n\nconst fetchAndStream = async function* (\n\tbaseUrl: string,\n\tparams: AIProviderStreamParams\n) {\n\tconst requestBody = buildRequestBody(params);\n\n\tconst response = await fetch(`${baseUrl}/api/chat`, {\n\t\tbody: JSON.stringify(requestBody),\n\t\theaders: { 'Content-Type': 'application/json' },\n\t\tmethod: 'POST',\n\t\tsignal: params.signal\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`Ollama API error ${response.status}: ${errorText}`);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('Ollama API returned no response body');\n\t}\n\n\tyield* parseNDJSONStream(response.body, params.signal);\n};\n\nexport const ollama = (config: OllamaConfig = {}): AIProviderConfig => {\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n\treturn {\n\t\tstream: (params: AIProviderStreamParams) =>\n\t\t\tfetchAndStream(baseUrl, params)\n\t};\n};\n"
5
+ "import type {\n\tAIChunk,\n\tAIDoneChunk,\n\tAIProviderConfig,\n\tAIProviderStreamParams,\n\tAIProviderToolDefinition\n} from '../../../types/ai';\n\ntype OllamaConfig = {\n\tbaseUrl?: string;\n};\n\ntype OllamaMessage = {\n\tcontent: string;\n\trole: 'assistant' | 'system' | 'tool' | 'user';\n\ttool_calls?: Array<{\n\t\tfunction: { arguments: Record<string, unknown>; name: string };\n\t}>;\n};\n\nconst DEFAULT_BASE_URL = 'http://localhost:11434';\nconst ZERO_TOKENS = 0;\n\nconst DONE_CHUNK: AIChunk = { type: 'done' };\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 convertMessage = (\n\tmsg: AIProviderStreamParams['messages'][number]\n): OllamaMessage[] => {\n\tif (typeof msg.content === 'string') {\n\t\treturn [{ content: msg.content, role: msg.role }];\n\t}\n\n\tconst results: OllamaMessage[] = [];\n\tconst toolUseBlocks = msg.content.filter(\n\t\t(block) => block.type === 'tool_use'\n\t);\n\tconst toolResultBlocks = msg.content.filter(\n\t\t(block) => block.type === 'tool_result'\n\t);\n\n\tif (toolUseBlocks.length > 0) {\n\t\tresults.push({\n\t\t\tcontent: '',\n\t\t\trole: 'assistant',\n\t\t\ttool_calls: toolUseBlocks.map((block) => ({\n\t\t\t\tfunction: {\n\t\t\t\t\targuments:\n\t\t\t\t\t\ttypeof block.input === 'object' && block.input !== null\n\t\t\t\t\t\t\t? (block.input as Record<string, unknown>)\n\t\t\t\t\t\t\t: {},\n\t\t\t\t\tname: block.name\n\t\t\t\t}\n\t\t\t}))\n\t\t});\n\t}\n\n\tfor (const block of toolResultBlocks) {\n\t\tresults.push({\n\t\t\tcontent: typeof block.content === 'string' ? block.content : '',\n\t\t\trole: 'tool'\n\t\t});\n\t}\n\n\treturn results;\n};\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n\tconst messages: OllamaMessage[] = params.messages.flatMap(convertMessage);\n\n\tif (params.systemPrompt) {\n\t\tmessages.unshift({ content: params.systemPrompt, role: 'system' });\n\t}\n\n\tconst body: Record<string, unknown> = {\n\t\tmessages,\n\t\tmodel: params.model,\n\t\tstream: 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 isRecord = (val: unknown): val is Record<string, unknown> =>\n\tval !== null && typeof val === 'object' && !Array.isArray(val);\n\nconst tryParseJSON = (text: string) => {\n\ttry {\n\t\tconst result: unknown = JSON.parse(text);\n\t\tif (isRecord(result)) {\n\t\t\treturn result;\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nconst buildDoneChunk = (parsed: Record<string, unknown>): AIDoneChunk => {\n\tconst promptEvalCount =\n\t\ttypeof parsed.prompt_eval_count === 'number'\n\t\t\t? parsed.prompt_eval_count\n\t\t\t: undefined;\n\tconst evalCount =\n\t\ttypeof parsed.eval_count === 'number' ? parsed.eval_count : undefined;\n\tconst totalDuration =\n\t\ttypeof parsed.total_duration === 'number'\n\t\t\t? parsed.total_duration\n\t\t\t: undefined;\n\n\tconst hasTokenCounts =\n\t\tpromptEvalCount !== undefined || evalCount !== undefined;\n\tif (hasTokenCounts) {\n\t\treturn {\n\t\t\ttype: 'done',\n\t\t\tusage: {\n\t\t\t\tinputTokens: promptEvalCount ?? ZERO_TOKENS,\n\t\t\t\toutputTokens: evalCount ?? ZERO_TOKENS\n\t\t\t}\n\t\t};\n\t}\n\n\tif (totalDuration !== undefined) {\n\t\treturn {\n\t\t\ttype: 'done',\n\t\t\tusage: { inputTokens: ZERO_TOKENS, outputTokens: ZERO_TOKENS }\n\t\t};\n\t}\n\n\treturn { type: 'done' };\n};\n\nconst buildTextChunk = (content: string): AIChunk => ({\n\tcontent,\n\ttype: 'text'\n});\n\nconst extractToolCalls = (message: Record<string, unknown>): AIChunk[] => {\n\tconst toolCalls = message.tool_calls;\n\n\tif (!Array.isArray(toolCalls) || toolCalls.length === 0) {\n\t\treturn [];\n\t}\n\n\treturn toolCalls\n\t\t.filter(isRecord)\n\t\t.filter((tc) => isRecord(tc.function))\n\t\t.map((tc) => {\n\t\t\tconst func = tc.function as Record<string, unknown>;\n\n\t\t\treturn {\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tinput: func.arguments ?? {},\n\t\t\t\tname: typeof func.name === 'string' ? func.name : '',\n\t\t\t\ttype: 'tool_use' as const\n\t\t\t};\n\t\t});\n};\n\nconst extractChunks = (parsed: Record<string, unknown>): AIChunk[] => {\n\tconst { message } = parsed;\n\n\tif (!isRecord(message)) {\n\t\treturn [];\n\t}\n\n\tconst toolChunks = extractToolCalls(message);\n\n\tif (toolChunks.length > 0) {\n\t\treturn toolChunks;\n\t}\n\n\tconst { content } = message;\n\n\tif (typeof content !== 'string' || !content) {\n\t\treturn [];\n\t}\n\n\treturn [buildTextChunk(content)];\n};\n\nconst extractTextChunk = (parsed: Record<string, unknown>) => {\n\tconst { message } = parsed;\n\tif (!isRecord(message)) {\n\t\treturn null;\n\t}\n\n\tconst { content } = message;\n\tif (typeof content !== 'string' || !content) {\n\t\treturn null;\n\t}\n\n\treturn buildTextChunk(content);\n};\n\nconst processLine = (line: string): AIChunk[] => {\n\tconst trimmed = line.trim();\n\n\tif (!trimmed) {\n\t\treturn [];\n\t}\n\n\tconst parsed = tryParseJSON(trimmed);\n\n\tif (!parsed) {\n\t\treturn [];\n\t}\n\n\tif (parsed.done === true) {\n\t\treturn [buildDoneChunk(parsed)];\n\t}\n\n\treturn extractChunks(parsed);\n};\n\nconst processBufferedLines = (lines: string[]) => lines.flatMap(processLine);\n\nconst readStreamChunks = async (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tbuffer: string,\n\tsignal?: AbortSignal\n) => {\n\tconst emptyChunks: AIChunk[] = [];\n\n\tif (signal?.aborted) {\n\t\treturn {\n\t\t\tallChunks: emptyChunks,\n\t\t\tcurrentBuffer: buffer,\n\t\t\tfinished: true\n\t\t};\n\t}\n\n\tconst result = await reader.read();\n\tconst { done, value } = result;\n\n\tif (done) {\n\t\treturn {\n\t\t\tallChunks: emptyChunks,\n\t\t\tcurrentBuffer: buffer,\n\t\t\tfinished: true\n\t\t};\n\t}\n\n\tconst currentBuffer = buffer + decoder.decode(value, { stream: true });\n\tconst lines = currentBuffer.split('\\n');\n\tconst remainder = lines.pop() ?? '';\n\tconst allChunks = processBufferedLines(lines);\n\tconst finished = allChunks.some((c) => c.type === 'done');\n\n\treturn { allChunks, currentBuffer: remainder, finished };\n};\n\nconst parseNDJSONStream = async function* (\n\tbody: ReadableStream<Uint8Array>,\n\tsignal?: AbortSignal\n) {\n\tconst reader = body.getReader();\n\n\ttry {\n\t\tyield* parseNDJSONStreamInner(reader, signal);\n\t} finally {\n\t\treader.releaseLock();\n\t}\n};\n\nconst parseNDJSONStreamInner = async function* (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tsignal?: AbortSignal\n) {\n\tconst decoder = new TextDecoder();\n\tlet buffer = '';\n\tlet done = false;\n\n\twhile (!done) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst result = await readStreamChunks(reader, decoder, buffer, signal);\n\t\tbuffer = result.currentBuffer;\n\t\tdone = result.finished;\n\n\t\tyield* result.allChunks;\n\t}\n\n\tyield DONE_CHUNK;\n};\n\nconst fetchAndStream = async function* (\n\tbaseUrl: string,\n\tparams: AIProviderStreamParams\n) {\n\tconst requestBody = buildRequestBody(params);\n\n\tconst response = await fetch(`${baseUrl}/api/chat`, {\n\t\tbody: JSON.stringify(requestBody),\n\t\theaders: { 'Content-Type': 'application/json' },\n\t\tmethod: 'POST',\n\t\tsignal: params.signal\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`Ollama API error ${response.status}: ${errorText}`);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('Ollama API returned no response body');\n\t}\n\n\tyield* parseNDJSONStream(response.body, params.signal);\n};\n\nexport const ollama = (config: OllamaConfig = {}): AIProviderConfig => {\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n\treturn {\n\t\tstream: (params: AIProviderStreamParams) =>\n\t\t\tfetchAndStream(baseUrl, params)\n\t};\n};\n"
6
6
  ],
7
- "mappings": "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",
7
+ "mappings": "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",
8
8
  "debugId": "BE23827957FF8E3C64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -145,8 +145,8 @@ var mapOpenAIContent = (msg) => {
145
145
  if (typeof msg.content === "string") {
146
146
  return msg.content;
147
147
  }
148
- const hasImages = msg.content.some((block) => block.type === "image");
149
- if (!hasImages) {
148
+ const hasMedia = msg.content.some((block) => block.type === "image" || block.type === "document");
149
+ if (!hasMedia) {
150
150
  return null;
151
151
  }
152
152
  const blocks = [];
@@ -158,6 +158,14 @@ var mapOpenAIContent = (msg) => {
158
158
  },
159
159
  type: "image_url"
160
160
  });
161
+ } else if (block.type === "document") {
162
+ blocks.push({
163
+ file: {
164
+ file_data: `data:${block.source.media_type};base64,${block.source.data}`,
165
+ filename: block.name ?? "document.pdf"
166
+ },
167
+ type: "file"
168
+ });
161
169
  } else if (block.type === "text") {
162
170
  blocks.push({ text: block.content, type: "text" });
163
171
  }
@@ -383,5 +391,5 @@ export {
383
391
  openai
384
392
  };
385
393
 
386
- //# debugId=B22907EDF3AB52FE64756E2164756E21
394
+ //# debugId=E63709D46011E17964756E2164756E21
387
395
  //# sourceMappingURL=openai.js.map
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/ai/providers/openai.ts"],
4
4
  "sourcesContent": [
5
- "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"
5
+ "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 = (blocks: AIProviderContentBlock[]) => {\n\tconst toolUseBlocks = blocks.filter((block) => block.type === 'tool_use');\n\tconst toolResultBlocks = blocks.filter(\n\t\t(block) => block.type === 'tool_result'\n\t);\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:\n\t\t\t\t\t\ttypeof block.input === 'string'\n\t\t\t\t\t\t\t? block.input\n\t\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 hasMedia = msg.content.some(\n\t\t(block) => block.type === 'image' || block.type === 'document'\n\t);\n\n\tif (!hasMedia) {\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 === 'document') {\n\t\t\tblocks.push({\n\t\t\t\tfile: {\n\t\t\t\t\tfile_data: `data:${block.source.media_type};base64,${block.source.data}`,\n\t\t\t\t\tfilename: block.name ?? 'document.pdf'\n\t\t\t\t},\n\t\t\t\ttype: 'file'\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"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "B22907EDF3AB52FE64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "E63709D46011E17964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -145,8 +145,8 @@ var mapOpenAIContent = (msg) => {
145
145
  if (typeof msg.content === "string") {
146
146
  return msg.content;
147
147
  }
148
- const hasImages = msg.content.some((block) => block.type === "image");
149
- if (!hasImages) {
148
+ const hasMedia = msg.content.some((block) => block.type === "image" || block.type === "document");
149
+ if (!hasMedia) {
150
150
  return null;
151
151
  }
152
152
  const blocks = [];
@@ -158,6 +158,14 @@ var mapOpenAIContent = (msg) => {
158
158
  },
159
159
  type: "image_url"
160
160
  });
161
+ } else if (block.type === "document") {
162
+ blocks.push({
163
+ file: {
164
+ file_data: `data:${block.source.media_type};base64,${block.source.data}`,
165
+ filename: block.name ?? "document.pdf"
166
+ },
167
+ type: "file"
168
+ });
161
169
  } else if (block.type === "text") {
162
170
  blocks.push({ text: block.content, type: "text" });
163
171
  }
@@ -421,5 +429,5 @@ export {
421
429
  alibaba
422
430
  };
423
431
 
424
- //# debugId=3E4CBEF9828B98FB64756E2164756E21
432
+ //# debugId=F8CA64B25BB6A23164756E2164756E21
425
433
  //# sourceMappingURL=openaiCompatible.js.map