@absolutejs/absolute 0.19.0-beta.250 → 0.19.0-beta.251
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/dist/ai/index.js +26 -14
- package/dist/ai/index.js.map +4 -4
- package/dist/ai/providers/gemini.js +11 -7
- package/dist/ai/providers/gemini.js.map +3 -3
- package/dist/ai/providers/openaiResponses.js +16 -8
- package/dist/ai/providers/openaiResponses.js.map +3 -3
- package/dist/src/ai/providers/gemini.d.ts +1 -0
- package/dist/src/ai/providers/openaiResponses.d.ts +1 -0
- package/package.json +1 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ai/providers/gemini.ts"],
|
|
4
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 = (
|
|
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\timageModels?: Set<string> | 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 = (\n\tparams: AIProviderStreamParams,\n\tisImageModel: boolean\n) => {\n\tconst body: Record<string, unknown> = {\n\t\tcontents: convertMessages(params.messages)\n\t};\n\n\tif (isImageModel) {\n\t\tbody.generationConfig = {\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\tconst imageModels = config.imageModels\n\t\t? config.imageModels instanceof Set\n\t\t\t? config.imageModels\n\t\t\t: new Set(config.imageModels)\n\t\t: new Set<string>();\n\n\treturn {\n\t\tstream: (params: AIProviderStreamParams) => {\n\t\t\tconst isImageModel = imageModels.has(params.model);\n\t\t\tconst body = buildRequestBody(params, isImageModel);\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
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "6A2848EDCC099E7064756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -156,13 +156,19 @@ var mapToolDefinition = (tool) => ({
|
|
|
156
156
|
parameters: tool.input_schema,
|
|
157
157
|
type: "function"
|
|
158
158
|
});
|
|
159
|
-
var buildTools = (tools) => {
|
|
160
|
-
|
|
161
|
-
|
|
159
|
+
var buildTools = (tools, isImageModel) => {
|
|
160
|
+
const result = [];
|
|
161
|
+
if (tools) {
|
|
162
|
+
for (const tool of tools) {
|
|
163
|
+
result.push(mapToolDefinition(tool));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (isImageModel) {
|
|
167
|
+
result.push({ type: "image_generation" });
|
|
162
168
|
}
|
|
163
|
-
return
|
|
169
|
+
return result.length > 0 ? result : undefined;
|
|
164
170
|
};
|
|
165
|
-
var buildRequestBody = (params) => {
|
|
171
|
+
var buildRequestBody = (params, isImageModel) => {
|
|
166
172
|
const body = {
|
|
167
173
|
input: buildInput(params.messages),
|
|
168
174
|
model: params.model,
|
|
@@ -171,7 +177,7 @@ var buildRequestBody = (params) => {
|
|
|
171
177
|
if (params.systemPrompt) {
|
|
172
178
|
body.instructions = params.systemPrompt;
|
|
173
179
|
}
|
|
174
|
-
const tools = buildTools(params.tools);
|
|
180
|
+
const tools = buildTools(params.tools, isImageModel);
|
|
175
181
|
if (tools) {
|
|
176
182
|
body.tools = tools;
|
|
177
183
|
}
|
|
@@ -405,9 +411,11 @@ var fetchResponsesStream = async function* (baseUrl, apiKey, body, signal) {
|
|
|
405
411
|
};
|
|
406
412
|
var openaiResponses = (config) => {
|
|
407
413
|
const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
414
|
+
const imageModels = config.imageModels ? config.imageModels instanceof Set ? config.imageModels : new Set(config.imageModels) : new Set;
|
|
408
415
|
return {
|
|
409
416
|
stream: (params) => {
|
|
410
|
-
const
|
|
417
|
+
const isImageModel = imageModels.has(params.model);
|
|
418
|
+
const body = buildRequestBody(params, isImageModel);
|
|
411
419
|
return fetchResponsesStream(baseUrl, config.apiKey, body, params.signal);
|
|
412
420
|
}
|
|
413
421
|
};
|
|
@@ -416,5 +424,5 @@ export {
|
|
|
416
424
|
openaiResponses
|
|
417
425
|
};
|
|
418
426
|
|
|
419
|
-
//# debugId=
|
|
427
|
+
//# debugId=6A24DA19E381897D64756E2164756E21
|
|
420
428
|
//# sourceMappingURL=openaiResponses.js.map
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ai/providers/openaiResponses.ts"],
|
|
4
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 OpenAIResponsesConfig = {\n\tapiKey: string;\n\tbaseUrl?: string;\n};\n\ntype PendingFunctionCall = {\n\tcallId: string;\n\tname: string;\n\targuments: string;\n};\n\ntype StreamState = {\n\tbuffer: string;\n\tcurrentEvent: string;\n\tpendingCalls: Map<string, PendingFunctionCall>;\n\tusage: AIUsage | undefined;\n};\n\nconst DEFAULT_BASE_URL = 'https://api.openai.com';\nconst EVENT_PREFIX_LENGTH = 7;\nconst 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 mapContentToResponsesFormat = (\n\tcontent: string | AIProviderContentBlock[]\n): string | Array<Record<string, unknown>> => {\n\tif (typeof content === 'string') {\n\t\treturn content;\n\t}\n\n\tconst parts: Array<Record<string, unknown>> = [];\n\n\tfor (const block of content) {\n\t\tif (block.type === 'text') {\n\t\t\tparts.push({ text: block.content, type: 'input_text' });\n\t\t} else if (block.type === 'image') {\n\t\t\tparts.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: 'input_image'\n\t\t\t});\n\t\t} else if (block.type === 'document') {\n\t\t\tparts.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: 'input_file'\n\t\t\t});\n\t\t}\n\t}\n\n\treturn parts.length > 0 ? parts : '';\n};\n\nconst hasToolBlocks = (content: AIProviderContentBlock[]) =>\n\tcontent.some(\n\t\t(block) => block.type === 'tool_use' || block.type === 'tool_result'\n\t);\n\nconst convertToolBlocks = (\n\tcontent: AIProviderContentBlock[]\n): Array<Record<string, unknown>> => {\n\tconst items: Array<Record<string, unknown>> = [];\n\n\tfor (const block of content) {\n\t\tif (block.type === 'tool_use') {\n\t\t\titems.push({\n\t\t\t\targuments:\n\t\t\t\t\ttypeof 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\tcall_id: block.id,\n\t\t\t\tname: block.name,\n\t\t\t\ttype: 'function_call'\n\t\t\t});\n\t\t} else if (block.type === 'tool_result') {\n\t\t\titems.push({\n\t\t\t\tcall_id: block.tool_use_id,\n\t\t\t\toutput: typeof block.content === 'string' ? block.content : '',\n\t\t\t\ttype: 'function_call_output'\n\t\t\t});\n\t\t}\n\t}\n\n\treturn items;\n};\n\nconst convertMessage = (\n\tmsg: AIProviderMessage\n): Array<Record<string, unknown>> => {\n\tif (typeof msg.content !== 'string' && Array.isArray(msg.content)) {\n\t\tif (hasToolBlocks(msg.content)) {\n\t\t\treturn convertToolBlocks(msg.content);\n\t\t}\n\t}\n\n\tconst content = mapContentToResponsesFormat(msg.content);\n\n\treturn [\n\t\t{\n\t\t\tcontent,\n\t\t\trole: msg.role === 'system' ? 'developer' : msg.role,\n\t\t\ttype: 'message'\n\t\t}\n\t];\n};\n\nconst buildInput = (messages: AIProviderMessage[]) => {\n\tconst input: Array<Record<string, unknown>> = [];\n\n\tfor (const msg of messages) {\n\t\tinput.push(...convertMessage(msg));\n\t}\n\n\treturn input;\n};\n\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n\tdescription: tool.description,\n\tname: tool.name,\n\tparameters: tool.input_schema,\n\ttype: 'function'\n});\n\nconst buildTools = (tools: AIProviderToolDefinition[] | undefined) => {\n\tif (!tools || tools.length === 0) {\n\t\treturn undefined;\n\t}\n\n\treturn tools.map((tool) => mapToolDefinition(tool));\n};\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n\tconst body: Record<string, unknown> = {\n\t\tinput: buildInput(params.messages),\n\t\tmodel: params.model,\n\t\tstream: true\n\t};\n\n\tif (params.systemPrompt) {\n\t\tbody.instructions = params.systemPrompt;\n\t}\n\n\tconst tools = buildTools(params.tools);\n\n\tif (tools) {\n\t\tbody.tools = tools;\n\t}\n\n\treturn body;\n};\n\n/* ─── SSE parsing ─── */\n\nconst parseJSON = (data: string) => {\n\ttry {\n\t\treturn JSON.parse(data);\n\t} catch {\n\t\treturn null;\n\t}\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 extractUsage = (\n\tresponse: Record<string, unknown>\n): AIUsage | undefined => {\n\tif (!isRecord(response.usage)) {\n\t\treturn undefined;\n\t}\n\n\tconst { usage } = response;\n\n\treturn {\n\t\tinputTokens:\n\t\t\ttypeof usage.input_tokens === 'number' ? usage.input_tokens : 0,\n\t\toutputTokens:\n\t\t\ttypeof usage.output_tokens === 'number' ? usage.output_tokens : 0\n\t};\n};\n\nconst extractMimeFormat = (mimeType: unknown) => {\n\tif (typeof mimeType !== 'string') {\n\t\treturn 'png';\n\t}\n\n\tif (mimeType.includes('jpeg')) return 'jpeg';\n\tif (mimeType.includes('webp')) return 'webp';\n\n\treturn 'png';\n};\n\nconst processTextDelta = function* (parsed: Record<string, unknown>) {\n\tif (typeof parsed.delta === 'string') {\n\t\tyield { content: parsed.delta, type: 'text' as const };\n\t}\n};\n\nconst processPartialImage = function* (parsed: Record<string, unknown>) {\n\tconst itemId =\n\t\ttypeof parsed.item_id === 'string' ? parsed.item_id : undefined;\n\tconst b64 =\n\t\ttypeof parsed.partial_image_b64 === 'string'\n\t\t\t? parsed.partial_image_b64\n\t\t\t: undefined;\n\n\tif (b64) {\n\t\tyield {\n\t\t\tdata: b64,\n\t\t\tformat: 'png',\n\t\t\timageId: itemId,\n\t\t\tisPartial: true,\n\t\t\ttype: 'image' as const\n\t\t};\n\t}\n};\n\nconst processFunctionCallArgumentsDelta = (\n\tparsed: Record<string, unknown>,\n\tpendingCalls: Map<string, PendingFunctionCall>\n) => {\n\tconst itemId = typeof parsed.item_id === 'string' ? parsed.item_id : '';\n\tconst callId = typeof parsed.call_id === 'string' ? parsed.call_id : '';\n\tconst delta =\n\t\ttypeof parsed.arguments_delta === 'string'\n\t\t\t? parsed.arguments_delta\n\t\t\t: '';\n\n\tconst existing = pendingCalls.get(itemId);\n\n\tif (existing) {\n\t\texisting.arguments += delta;\n\t} else {\n\t\tpendingCalls.set(itemId, {\n\t\t\targuments: delta,\n\t\t\tcallId,\n\t\t\tname: ''\n\t\t});\n\t}\n};\n\nconst processFunctionCallArgumentsDone = function* (\n\tparsed: Record<string, unknown>,\n\tpendingCalls: Map<string, PendingFunctionCall>\n) {\n\tconst itemId = typeof parsed.item_id === 'string' ? parsed.item_id : '';\n\tconst callId = typeof parsed.call_id === 'string' ? parsed.call_id : '';\n\tconst fullArgs =\n\t\ttypeof parsed.arguments === 'string' ? parsed.arguments : '';\n\n\tconst pending = pendingCalls.get(itemId);\n\tconst name = pending?.name ?? '';\n\tconst args = fullArgs || pending?.arguments || '';\n\n\tpendingCalls.delete(itemId);\n\n\tyield {\n\t\tid: callId,\n\t\tinput: parseToolInput(args),\n\t\tname,\n\t\ttype: 'tool_use' as const\n\t};\n};\n\nconst processOutputItemAdded = (\n\tparsed: Record<string, unknown>,\n\tpendingCalls: Map<string, PendingFunctionCall>\n) => {\n\tif (!isRecord(parsed.item)) {\n\t\treturn;\n\t}\n\n\tconst { item } = parsed;\n\tconst itemId = typeof item.id === 'string' ? item.id : '';\n\tconst itemType = typeof item.type === 'string' ? item.type : '';\n\n\tif (itemType === 'function_call') {\n\t\tconst callId = typeof item.call_id === 'string' ? item.call_id : '';\n\t\tconst name = typeof item.name === 'string' ? item.name : '';\n\n\t\tpendingCalls.set(itemId, {\n\t\t\targuments: '',\n\t\t\tcallId,\n\t\t\tname\n\t\t});\n\t}\n};\n\nconst extractImageFromOutput = function* (\n\toutput: Array<Record<string, unknown>>\n) {\n\tfor (const item of output) {\n\t\tif (item.type !== 'image_generation_call') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (item.status !== 'completed') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst data = typeof item.result === 'string' ? item.result : '';\n\n\t\tif (!data) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst format = extractMimeFormat(item.output_format);\n\t\tconst revisedPrompt =\n\t\t\ttypeof item.revised_prompt === 'string'\n\t\t\t\t? item.revised_prompt\n\t\t\t\t: undefined;\n\t\tconst imageId = typeof item.id === 'string' ? item.id : undefined;\n\n\t\tyield {\n\t\t\tdata,\n\t\t\tformat,\n\t\t\timageId,\n\t\t\tisPartial: false,\n\t\t\trevisedPrompt,\n\t\t\ttype: 'image' as const\n\t\t};\n\t}\n};\n\nconst processCompleted = function* (\n\tparsed: Record<string, unknown>\n): Generator<AIChunk> {\n\tif (!isRecord(parsed.response)) {\n\t\tyield { type: 'done' as const, usage: undefined };\n\n\t\treturn;\n\t}\n\n\tconst { response } = parsed;\n\tconst usage = extractUsage(response);\n\n\tif (isRecordArray(response.output)) {\n\t\tyield* extractImageFromOutput(response.output);\n\t}\n\n\tyield { type: 'done' as const, usage };\n};\n\nconst processSSEEvent = function* (\n\teventType: string,\n\tparsed: Record<string, unknown>,\n\tpendingCalls: Map<string, PendingFunctionCall>\n): Generator<AIChunk> {\n\tswitch (eventType) {\n\t\tcase 'response.output_text.delta':\n\t\t\tyield* processTextDelta(parsed);\n\t\t\tbreak;\n\n\t\tcase 'response.image_generation_call.partial_image':\n\t\t\tyield* processPartialImage(parsed);\n\t\t\tbreak;\n\n\t\tcase 'response.output_item.added':\n\t\t\tprocessOutputItemAdded(parsed, pendingCalls);\n\t\t\tbreak;\n\n\t\tcase 'response.function_call_arguments.delta':\n\t\t\tprocessFunctionCallArgumentsDelta(parsed, pendingCalls);\n\t\t\tbreak;\n\n\t\tcase 'response.function_call_arguments.done':\n\t\t\tyield* processFunctionCallArgumentsDone(parsed, pendingCalls);\n\t\t\tbreak;\n\n\t\tcase 'response.completed':\n\t\t\tyield* processCompleted(parsed);\n\t\t\tbreak;\n\t}\n};\n\nconst processSSELines = function* (\n\tlines: string[],\n\tstate: StreamState\n): Generator<AIChunk> {\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\n\t\tif (!trimmed) {\n\t\t\tif (state.currentEvent && state.buffer) {\n\t\t\t\tconst parsed = parseJSON(state.buffer);\n\n\t\t\t\tif (parsed) {\n\t\t\t\t\tyield* processSSEEvent(\n\t\t\t\t\t\tstate.currentEvent,\n\t\t\t\t\t\tparsed,\n\t\t\t\t\t\tstate.pendingCalls\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tstate.currentEvent = '';\n\t\t\t\tstate.buffer = '';\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (trimmed.startsWith('event: ')) {\n\t\t\tstate.currentEvent = trimmed.slice(EVENT_PREFIX_LENGTH);\n\t\t} else if (trimmed.startsWith('data: ')) {\n\t\t\tstate.buffer = trimmed.slice(DATA_PREFIX_LENGTH);\n\t\t}\n\t}\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\tyield* processSSELines(lines, state);\n\t}\n\n\tif (textBuffer.trim()) {\n\t\tyield* processSSELines([textBuffer, ''], state);\n\t}\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\tcurrentEvent: '',\n\t\tpendingCalls: new Map(),\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 fetchResponsesStream = async function* (\n\tbaseUrl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\tsignal?: AbortSignal\n): AsyncGenerator<AIChunk> {\n\tconst response = await fetch(`${baseUrl}/v1/responses`, {\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(\n\t\t\t`OpenAI Responses API error ${response.status}: ${errorText}`\n\t\t);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('OpenAI Responses API returned no response body');\n\t}\n\n\tyield* parseSSEStream(response.body, signal);\n};\n\nexport const openaiResponses = (\n\tconfig: OpenAIResponsesConfig\n): 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 fetchResponsesStream(\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\tAIChunk,\n\tAIProviderConfig,\n\tAIProviderContentBlock,\n\tAIProviderMessage,\n\tAIProviderStreamParams,\n\tAIProviderToolDefinition,\n\tAIUsage\n} from '../../../types/ai';\n\ntype OpenAIResponsesConfig = {\n\tapiKey: string;\n\tbaseUrl?: string;\n\timageModels?: Set<string> | string[];\n};\n\ntype PendingFunctionCall = {\n\tcallId: string;\n\tname: string;\n\targuments: string;\n};\n\ntype StreamState = {\n\tbuffer: string;\n\tcurrentEvent: string;\n\tpendingCalls: Map<string, PendingFunctionCall>;\n\tusage: AIUsage | undefined;\n};\n\nconst DEFAULT_BASE_URL = 'https://api.openai.com';\nconst EVENT_PREFIX_LENGTH = 7;\nconst 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 mapContentToResponsesFormat = (\n\tcontent: string | AIProviderContentBlock[]\n): string | Array<Record<string, unknown>> => {\n\tif (typeof content === 'string') {\n\t\treturn content;\n\t}\n\n\tconst parts: Array<Record<string, unknown>> = [];\n\n\tfor (const block of content) {\n\t\tif (block.type === 'text') {\n\t\t\tparts.push({ text: block.content, type: 'input_text' });\n\t\t} else if (block.type === 'image') {\n\t\t\tparts.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: 'input_image'\n\t\t\t});\n\t\t} else if (block.type === 'document') {\n\t\t\tparts.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: 'input_file'\n\t\t\t});\n\t\t}\n\t}\n\n\treturn parts.length > 0 ? parts : '';\n};\n\nconst hasToolBlocks = (content: AIProviderContentBlock[]) =>\n\tcontent.some(\n\t\t(block) => block.type === 'tool_use' || block.type === 'tool_result'\n\t);\n\nconst convertToolBlocks = (\n\tcontent: AIProviderContentBlock[]\n): Array<Record<string, unknown>> => {\n\tconst items: Array<Record<string, unknown>> = [];\n\n\tfor (const block of content) {\n\t\tif (block.type === 'tool_use') {\n\t\t\titems.push({\n\t\t\t\targuments:\n\t\t\t\t\ttypeof 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\tcall_id: block.id,\n\t\t\t\tname: block.name,\n\t\t\t\ttype: 'function_call'\n\t\t\t});\n\t\t} else if (block.type === 'tool_result') {\n\t\t\titems.push({\n\t\t\t\tcall_id: block.tool_use_id,\n\t\t\t\toutput: typeof block.content === 'string' ? block.content : '',\n\t\t\t\ttype: 'function_call_output'\n\t\t\t});\n\t\t}\n\t}\n\n\treturn items;\n};\n\nconst convertMessage = (\n\tmsg: AIProviderMessage\n): Array<Record<string, unknown>> => {\n\tif (typeof msg.content !== 'string' && Array.isArray(msg.content)) {\n\t\tif (hasToolBlocks(msg.content)) {\n\t\t\treturn convertToolBlocks(msg.content);\n\t\t}\n\t}\n\n\tconst content = mapContentToResponsesFormat(msg.content);\n\n\treturn [\n\t\t{\n\t\t\tcontent,\n\t\t\trole: msg.role === 'system' ? 'developer' : msg.role,\n\t\t\ttype: 'message'\n\t\t}\n\t];\n};\n\nconst buildInput = (messages: AIProviderMessage[]) => {\n\tconst input: Array<Record<string, unknown>> = [];\n\n\tfor (const msg of messages) {\n\t\tinput.push(...convertMessage(msg));\n\t}\n\n\treturn input;\n};\n\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n\tdescription: tool.description,\n\tname: tool.name,\n\tparameters: tool.input_schema,\n\ttype: 'function'\n});\n\nconst buildTools = (\n\ttools: AIProviderToolDefinition[] | undefined,\n\tisImageModel: boolean\n) => {\n\tconst result: Array<Record<string, unknown>> = [];\n\n\tif (tools) {\n\t\tfor (const tool of tools) {\n\t\t\tresult.push(mapToolDefinition(tool));\n\t\t}\n\t}\n\n\tif (isImageModel) {\n\t\tresult.push({ type: 'image_generation' });\n\t}\n\n\treturn result.length > 0 ? result : undefined;\n};\n\nconst buildRequestBody = (\n\tparams: AIProviderStreamParams,\n\tisImageModel: boolean\n) => {\n\tconst body: Record<string, unknown> = {\n\t\tinput: buildInput(params.messages),\n\t\tmodel: params.model,\n\t\tstream: true\n\t};\n\n\tif (params.systemPrompt) {\n\t\tbody.instructions = params.systemPrompt;\n\t}\n\n\tconst tools = buildTools(params.tools, isImageModel);\n\n\tif (tools) {\n\t\tbody.tools = tools;\n\t}\n\n\treturn body;\n};\n\n/* ─── SSE parsing ─── */\n\nconst parseJSON = (data: string) => {\n\ttry {\n\t\treturn JSON.parse(data);\n\t} catch {\n\t\treturn null;\n\t}\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 extractUsage = (\n\tresponse: Record<string, unknown>\n): AIUsage | undefined => {\n\tif (!isRecord(response.usage)) {\n\t\treturn undefined;\n\t}\n\n\tconst { usage } = response;\n\n\treturn {\n\t\tinputTokens:\n\t\t\ttypeof usage.input_tokens === 'number' ? usage.input_tokens : 0,\n\t\toutputTokens:\n\t\t\ttypeof usage.output_tokens === 'number' ? usage.output_tokens : 0\n\t};\n};\n\nconst extractMimeFormat = (mimeType: unknown) => {\n\tif (typeof mimeType !== 'string') {\n\t\treturn 'png';\n\t}\n\n\tif (mimeType.includes('jpeg')) return 'jpeg';\n\tif (mimeType.includes('webp')) return 'webp';\n\n\treturn 'png';\n};\n\nconst processTextDelta = function* (parsed: Record<string, unknown>) {\n\tif (typeof parsed.delta === 'string') {\n\t\tyield { content: parsed.delta, type: 'text' as const };\n\t}\n};\n\nconst processPartialImage = function* (parsed: Record<string, unknown>) {\n\tconst itemId =\n\t\ttypeof parsed.item_id === 'string' ? parsed.item_id : undefined;\n\tconst b64 =\n\t\ttypeof parsed.partial_image_b64 === 'string'\n\t\t\t? parsed.partial_image_b64\n\t\t\t: undefined;\n\n\tif (b64) {\n\t\tyield {\n\t\t\tdata: b64,\n\t\t\tformat: 'png',\n\t\t\timageId: itemId,\n\t\t\tisPartial: true,\n\t\t\ttype: 'image' as const\n\t\t};\n\t}\n};\n\nconst processFunctionCallArgumentsDelta = (\n\tparsed: Record<string, unknown>,\n\tpendingCalls: Map<string, PendingFunctionCall>\n) => {\n\tconst itemId = typeof parsed.item_id === 'string' ? parsed.item_id : '';\n\tconst callId = typeof parsed.call_id === 'string' ? parsed.call_id : '';\n\tconst delta =\n\t\ttypeof parsed.arguments_delta === 'string'\n\t\t\t? parsed.arguments_delta\n\t\t\t: '';\n\n\tconst existing = pendingCalls.get(itemId);\n\n\tif (existing) {\n\t\texisting.arguments += delta;\n\t} else {\n\t\tpendingCalls.set(itemId, {\n\t\t\targuments: delta,\n\t\t\tcallId,\n\t\t\tname: ''\n\t\t});\n\t}\n};\n\nconst processFunctionCallArgumentsDone = function* (\n\tparsed: Record<string, unknown>,\n\tpendingCalls: Map<string, PendingFunctionCall>\n) {\n\tconst itemId = typeof parsed.item_id === 'string' ? parsed.item_id : '';\n\tconst callId = typeof parsed.call_id === 'string' ? parsed.call_id : '';\n\tconst fullArgs =\n\t\ttypeof parsed.arguments === 'string' ? parsed.arguments : '';\n\n\tconst pending = pendingCalls.get(itemId);\n\tconst name = pending?.name ?? '';\n\tconst args = fullArgs || pending?.arguments || '';\n\n\tpendingCalls.delete(itemId);\n\n\tyield {\n\t\tid: callId,\n\t\tinput: parseToolInput(args),\n\t\tname,\n\t\ttype: 'tool_use' as const\n\t};\n};\n\nconst processOutputItemAdded = (\n\tparsed: Record<string, unknown>,\n\tpendingCalls: Map<string, PendingFunctionCall>\n) => {\n\tif (!isRecord(parsed.item)) {\n\t\treturn;\n\t}\n\n\tconst { item } = parsed;\n\tconst itemId = typeof item.id === 'string' ? item.id : '';\n\tconst itemType = typeof item.type === 'string' ? item.type : '';\n\n\tif (itemType === 'function_call') {\n\t\tconst callId = typeof item.call_id === 'string' ? item.call_id : '';\n\t\tconst name = typeof item.name === 'string' ? item.name : '';\n\n\t\tpendingCalls.set(itemId, {\n\t\t\targuments: '',\n\t\t\tcallId,\n\t\t\tname\n\t\t});\n\t}\n};\n\nconst extractImageFromOutput = function* (\n\toutput: Array<Record<string, unknown>>\n) {\n\tfor (const item of output) {\n\t\tif (item.type !== 'image_generation_call') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (item.status !== 'completed') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst data = typeof item.result === 'string' ? item.result : '';\n\n\t\tif (!data) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst format = extractMimeFormat(item.output_format);\n\t\tconst revisedPrompt =\n\t\t\ttypeof item.revised_prompt === 'string'\n\t\t\t\t? item.revised_prompt\n\t\t\t\t: undefined;\n\t\tconst imageId = typeof item.id === 'string' ? item.id : undefined;\n\n\t\tyield {\n\t\t\tdata,\n\t\t\tformat,\n\t\t\timageId,\n\t\t\tisPartial: false,\n\t\t\trevisedPrompt,\n\t\t\ttype: 'image' as const\n\t\t};\n\t}\n};\n\nconst processCompleted = function* (\n\tparsed: Record<string, unknown>\n): Generator<AIChunk> {\n\tif (!isRecord(parsed.response)) {\n\t\tyield { type: 'done' as const, usage: undefined };\n\n\t\treturn;\n\t}\n\n\tconst { response } = parsed;\n\tconst usage = extractUsage(response);\n\n\tif (isRecordArray(response.output)) {\n\t\tyield* extractImageFromOutput(response.output);\n\t}\n\n\tyield { type: 'done' as const, usage };\n};\n\nconst processSSEEvent = function* (\n\teventType: string,\n\tparsed: Record<string, unknown>,\n\tpendingCalls: Map<string, PendingFunctionCall>\n): Generator<AIChunk> {\n\tswitch (eventType) {\n\t\tcase 'response.output_text.delta':\n\t\t\tyield* processTextDelta(parsed);\n\t\t\tbreak;\n\n\t\tcase 'response.image_generation_call.partial_image':\n\t\t\tyield* processPartialImage(parsed);\n\t\t\tbreak;\n\n\t\tcase 'response.output_item.added':\n\t\t\tprocessOutputItemAdded(parsed, pendingCalls);\n\t\t\tbreak;\n\n\t\tcase 'response.function_call_arguments.delta':\n\t\t\tprocessFunctionCallArgumentsDelta(parsed, pendingCalls);\n\t\t\tbreak;\n\n\t\tcase 'response.function_call_arguments.done':\n\t\t\tyield* processFunctionCallArgumentsDone(parsed, pendingCalls);\n\t\t\tbreak;\n\n\t\tcase 'response.completed':\n\t\t\tyield* processCompleted(parsed);\n\t\t\tbreak;\n\t}\n};\n\nconst processSSELines = function* (\n\tlines: string[],\n\tstate: StreamState\n): Generator<AIChunk> {\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\n\t\tif (!trimmed) {\n\t\t\tif (state.currentEvent && state.buffer) {\n\t\t\t\tconst parsed = parseJSON(state.buffer);\n\n\t\t\t\tif (parsed) {\n\t\t\t\t\tyield* processSSEEvent(\n\t\t\t\t\t\tstate.currentEvent,\n\t\t\t\t\t\tparsed,\n\t\t\t\t\t\tstate.pendingCalls\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tstate.currentEvent = '';\n\t\t\t\tstate.buffer = '';\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (trimmed.startsWith('event: ')) {\n\t\t\tstate.currentEvent = trimmed.slice(EVENT_PREFIX_LENGTH);\n\t\t} else if (trimmed.startsWith('data: ')) {\n\t\t\tstate.buffer = trimmed.slice(DATA_PREFIX_LENGTH);\n\t\t}\n\t}\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\tyield* processSSELines(lines, state);\n\t}\n\n\tif (textBuffer.trim()) {\n\t\tyield* processSSELines([textBuffer, ''], state);\n\t}\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\tcurrentEvent: '',\n\t\tpendingCalls: new Map(),\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 fetchResponsesStream = async function* (\n\tbaseUrl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\tsignal?: AbortSignal\n): AsyncGenerator<AIChunk> {\n\tconst response = await fetch(`${baseUrl}/v1/responses`, {\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(\n\t\t\t`OpenAI Responses API error ${response.status}: ${errorText}`\n\t\t);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('OpenAI Responses API returned no response body');\n\t}\n\n\tyield* parseSSEStream(response.body, signal);\n};\n\nexport const openaiResponses = (\n\tconfig: OpenAIResponsesConfig\n): AIProviderConfig => {\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\tconst imageModels = config.imageModels\n\t\t? config.imageModels instanceof Set\n\t\t\t? config.imageModels\n\t\t\t: new Set(config.imageModels)\n\t\t: new Set<string>();\n\n\treturn {\n\t\tstream: (params: AIProviderStreamParams) => {\n\t\t\tconst isImageModel = imageModels.has(params.model);\n\t\t\tconst body = buildRequestBody(params, isImageModel);\n\n\t\t\treturn fetchResponsesStream(\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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "6A24DA19E381897D64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -2,6 +2,7 @@ import type { AIProviderConfig } from '../../../types/ai';
|
|
|
2
2
|
type OpenAIResponsesConfig = {
|
|
3
3
|
apiKey: string;
|
|
4
4
|
baseUrl?: string;
|
|
5
|
+
imageModels?: Set<string> | string[];
|
|
5
6
|
};
|
|
6
7
|
export declare const openaiResponses: (config: OpenAIResponsesConfig) => AIProviderConfig;
|
|
7
8
|
export {};
|
package/package.json
CHANGED