pi2dsh 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +5 -2
  2. package/README.zh.md +4 -2
  3. package/dist/analyzer-C86ba-27.mjs +626 -0
  4. package/dist/analyzer-C86ba-27.mjs.map +1 -0
  5. package/dist/cli.mjs +3 -1
  6. package/dist/cli.mjs.map +1 -1
  7. package/dist/compat/pi-ai.d.mts +1 -11
  8. package/dist/compat/pi-ai.d.mts.map +1 -1
  9. package/dist/compat/pi-ai.mjs +2 -2
  10. package/dist/credentials-oauth.mjs +1 -1
  11. package/dist/generator-C0jNM-yu.mjs +298 -0
  12. package/dist/generator-C0jNM-yu.mjs.map +1 -0
  13. package/dist/host.d.mts +2 -0
  14. package/dist/host.d.mts.map +1 -1
  15. package/dist/host.mjs +2 -1
  16. package/dist/host.mjs.map +1 -1
  17. package/dist/index.d.mts +29 -10
  18. package/dist/index.d.mts.map +1 -1
  19. package/dist/index.mjs +27 -4
  20. package/dist/index.mjs.map +1 -1
  21. package/dist/mcp-config-Dlou-ZA-.mjs +707 -0
  22. package/dist/mcp-config-Dlou-ZA-.mjs.map +1 -0
  23. package/dist/{pi-ai-B4hucafU.mjs → pi-ai-BA3h0Dwv.mjs} +2 -84
  24. package/dist/pi-ai-BA3h0Dwv.mjs.map +1 -0
  25. package/dist/{runtime-k3IlCgjQ.mjs → runtime-DMEJknhK.mjs} +115 -960
  26. package/dist/runtime-DMEJknhK.mjs.map +1 -0
  27. package/dist/runtime.d.mts +19 -6
  28. package/dist/runtime.d.mts.map +1 -1
  29. package/dist/runtime.mjs +2 -2
  30. package/package.json +6 -3
  31. package/dist/all-BChhwMVE.mjs +0 -28512
  32. package/dist/all-BChhwMVE.mjs.map +0 -1
  33. package/dist/anthropic-messages-Dlw4T0S4.mjs +0 -6438
  34. package/dist/anthropic-messages-Dlw4T0S4.mjs.map +0 -1
  35. package/dist/azure-openai-responses-vGUNukZ7.mjs +0 -209
  36. package/dist/azure-openai-responses-vGUNukZ7.mjs.map +0 -1
  37. package/dist/deferred-tools-BD4g5QUx.mjs +0 -32
  38. package/dist/deferred-tools-BD4g5QUx.mjs.map +0 -1
  39. package/dist/diagnostics-CJye1UFh.mjs +0 -99
  40. package/dist/diagnostics-CJye1UFh.mjs.map +0 -1
  41. package/dist/dist-DY2GeEQ6.mjs +0 -1089
  42. package/dist/dist-DY2GeEQ6.mjs.map +0 -1
  43. package/dist/dist-DYfTHu0C.mjs +0 -1246
  44. package/dist/dist-DYfTHu0C.mjs.map +0 -1
  45. package/dist/error-body-DKA3lknR.mjs +0 -104
  46. package/dist/error-body-DKA3lknR.mjs.map +0 -1
  47. package/dist/github-copilot-headers-CZo2QHrt.mjs +0 -25
  48. package/dist/github-copilot-headers-CZo2QHrt.mjs.map +0 -1
  49. package/dist/google-generative-ai-C30gRjRi.mjs +0 -358
  50. package/dist/google-generative-ai-C30gRjRi.mjs.map +0 -1
  51. package/dist/google-shared-W8g3Esep.mjs +0 -29042
  52. package/dist/google-shared-W8g3Esep.mjs.map +0 -1
  53. package/dist/google-vertex--O_gyVYA.mjs +0 -402
  54. package/dist/google-vertex--O_gyVYA.mjs.map +0 -1
  55. package/dist/hash-Dbggamac.mjs +0 -19
  56. package/dist/hash-Dbggamac.mjs.map +0 -1
  57. package/dist/headers-CPzZhJQn.mjs +0 -17
  58. package/dist/headers-CPzZhJQn.mjs.map +0 -1
  59. package/dist/images-models-DJtHo9Rp.mjs +0 -1068
  60. package/dist/images-models-DJtHo9Rp.mjs.map +0 -1
  61. package/dist/json-parse-C-vG4_qc.mjs +0 -384
  62. package/dist/json-parse-C-vG4_qc.mjs.map +0 -1
  63. package/dist/mcp-config-Cful6uUS.mjs +0 -1618
  64. package/dist/mcp-config-Cful6uUS.mjs.map +0 -1
  65. package/dist/mistral-conversations-LSDG9sjq.mjs +0 -42007
  66. package/dist/mistral-conversations-LSDG9sjq.mjs.map +0 -1
  67. package/dist/multipart-parser-CoM3rwav.mjs +0 -301
  68. package/dist/multipart-parser-CoM3rwav.mjs.map +0 -1
  69. package/dist/openai-codex-responses-JxII_OUX.mjs +0 -1169
  70. package/dist/openai-codex-responses-JxII_OUX.mjs.map +0 -1
  71. package/dist/openai-completions-Dp-VwLzJ.mjs +0 -947
  72. package/dist/openai-completions-Dp-VwLzJ.mjs.map +0 -1
  73. package/dist/openai-completions-lite-BrM7gJzs.mjs +0 -316
  74. package/dist/openai-completions-lite-BrM7gJzs.mjs.map +0 -1
  75. package/dist/openai-prompt-cache-BDWtZRKh.mjs +0 -11
  76. package/dist/openai-prompt-cache-BDWtZRKh.mjs.map +0 -1
  77. package/dist/openai-responses-CWmNks8K.mjs +0 -247
  78. package/dist/openai-responses-CWmNks8K.mjs.map +0 -1
  79. package/dist/openai-responses-shared-CYgIDTf3.mjs +0 -572
  80. package/dist/openai-responses-shared-CYgIDTf3.mjs.map +0 -1
  81. package/dist/openrouter-images-DfAULV7l.mjs +0 -127
  82. package/dist/openrouter-images-DfAULV7l.mjs.map +0 -1
  83. package/dist/otel-Boafyju5.mjs +0 -24935
  84. package/dist/otel-Boafyju5.mjs.map +0 -1
  85. package/dist/pi-ai-B4hucafU.mjs.map +0 -1
  86. package/dist/pi-messages-HzGtvc5_.mjs +0 -306
  87. package/dist/pi-messages-HzGtvc5_.mjs.map +0 -1
  88. package/dist/provider-env-C9gOBFJi.mjs +0 -40
  89. package/dist/provider-env-C9gOBFJi.mjs.map +0 -1
  90. package/dist/provider-retry-Cw6YJ4cr.mjs +0 -80
  91. package/dist/provider-retry-Cw6YJ4cr.mjs.map +0 -1
  92. package/dist/runtime-k3IlCgjQ.mjs.map +0 -1
  93. package/dist/sanitize-unicode-wLA11KvZ.mjs +0 -29
  94. package/dist/sanitize-unicode-wLA11KvZ.mjs.map +0 -1
  95. package/dist/src-D0GRWCE8.mjs +0 -5031
  96. package/dist/src-D0GRWCE8.mjs.map +0 -1
  97. package/dist/transform-messages-DGq9mvhA.mjs +0 -379
  98. package/dist/transform-messages-DGq9mvhA.mjs.map +0 -1
  99. package/dist/uuid-DtFT7tOE.mjs +0 -65
  100. package/dist/uuid-DtFT7tOE.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-completions-Dp-VwLzJ.mjs","names":[],"sources":["../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js"],"sourcesContent":["import OpenAI from \"openai\";\nimport { calculateCost, clampThinkingLevel } from \"../models.js\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\nimport { shortHash } from \"../utils/hash.js\";\nimport { headersToRecord } from \"../utils/headers.js\";\nimport { parseStreamingJson } from \"../utils/json-parse.js\";\nimport { getProviderEnvValue } from \"../utils/provider-env.js\";\nimport { retryProviderRequest } from \"../utils/provider-retry.js\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.js\";\nimport { appendGrammarToolInputJsonDelta, createGrammarToolInputProperties, getGrammarToolInput, resolveGrammarConstrainedSampling, resolveJsonSchemaStrictSampling, } from \"./constrained-sampling.js\";\nimport { buildCopilotDynamicHeaders, hasCopilotVisionInput } from \"./github-copilot-headers.js\";\nimport { clampOpenAIPromptCacheKey } from \"./openai-prompt-cache.js\";\nimport { buildBaseOptions, clampReasoning, MIN_ANSWER_TOKENS } from \"./simple-options.js\";\nimport { transformMessages } from \"./transform-messages.js\";\n/**\n * Check if conversation messages contain tool calls or tool results.\n * This is needed because Anthropic (via proxy) requires the tools param\n * to be present when messages include tool_calls or tool role messages.\n */\nfunction hasHeader(headers, name) {\n if (!headers)\n return false;\n const expected = name.toLowerCase();\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === expected && value !== null && value.trim().length > 0)\n return true;\n }\n return false;\n}\nfunction getClientApiKey(provider, apiKey, headers) {\n if (apiKey)\n return apiKey;\n if (hasHeader(headers, \"authorization\") || hasHeader(headers, \"cf-aig-authorization\"))\n return \"unused\";\n throw new Error(`No API key for provider: ${provider}`);\n}\nfunction hasToolHistory(messages) {\n for (const msg of messages) {\n if (msg.role === \"toolResult\") {\n return true;\n }\n if (msg.role === \"assistant\") {\n if (msg.content.some((block) => block.type === \"toolCall\")) {\n return true;\n }\n }\n }\n return false;\n}\nfunction getDeferredToolNames(messages) {\n const names = new Set();\n for (const message of messages) {\n if (message.role === \"toolResult\") {\n for (const name of message.addedToolNames ?? []) {\n names.add(name);\n }\n }\n }\n return names;\n}\nfunction getToolsByName(tools, names) {\n if (!tools)\n return [];\n const toolsByName = new Map(tools.map((tool) => [tool.name, tool]));\n return Array.from(names)\n .map((name) => toolsByName.get(name))\n .filter((tool) => tool !== undefined);\n}\nfunction isTextContentBlock(block) {\n return block.type === \"text\";\n}\nfunction isThinkingContentBlock(block) {\n return block.type === \"thinking\";\n}\nfunction isToolCallBlock(block) {\n return block.type === \"toolCall\";\n}\nfunction isImageContentBlock(block) {\n return block.type === \"image\";\n}\nfunction isEncryptedReasoningDetail(detail) {\n if (typeof detail !== \"object\" || detail === null) {\n return false;\n }\n const candidate = detail;\n return (candidate.type === \"reasoning.encrypted\" &&\n typeof candidate.id === \"string\" &&\n candidate.id.length > 0 &&\n typeof candidate.data === \"string\" &&\n candidate.data.length > 0);\n}\nfunction resolveCacheRetention(cacheRetention, env) {\n if (cacheRetention) {\n return cacheRetention;\n }\n if (getProviderEnvValue(\"PI_CACHE_RETENTION\", env) === \"long\") {\n return \"long\";\n }\n return \"short\";\n}\nexport const stream = (model, context, options) => {\n const stream = new AssistantMessageEventStream();\n (async () => {\n const output = {\n role: \"assistant\",\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: \"pending\",\n timestamp: Date.now(),\n };\n try {\n const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);\n const compat = getCompat(model);\n const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools);\n const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);\n const cacheSessionId = cacheRetention === \"none\" ? undefined : options?.sessionId;\n const client = createClient(model, context, apiKey, options?.headers, options?.fetch, cacheSessionId, compat);\n let params = buildParams(model, context, options, compat, cacheRetention, grammarToolInputProperties);\n const nextParams = await options?.onPayload?.(params, model);\n if (nextParams !== undefined) {\n params = nextParams;\n }\n const requestOptions = {\n ...(options?.signal ? { signal: options.signal } : {}),\n ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),\n maxRetries: 0,\n };\n const { data: openaiStream, response } = await retryProviderRequest(() => client.chat.completions.create(params, requestOptions).withResponse(), {\n maxRetries: options?.maxRetries,\n maxRetryDelayMs: options?.maxRetryDelayMs,\n signal: options?.signal,\n });\n await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);\n stream.push({ type: \"start\", partial: output });\n let textBlock = null;\n let thinkingBlock = null;\n let hasFinishReason = false;\n const toolCallBlocksByIndex = new Map();\n const toolCallBlocksById = new Map();\n const pendingReasoningDetailsByToolCallId = new Map();\n const blocks = output.content;\n const getContentIndex = (block) => blocks.indexOf(block);\n const getCustomToolCallInput = (block) => {\n const property = block.customInput?.property;\n if (property === undefined)\n return \"\";\n const value = block.arguments[property];\n return typeof value === \"string\" ? value : \"\";\n };\n const appendCustomToolCallInput = (block, nextInput, close) => {\n const customInput = block.customInput;\n if (!customInput)\n return undefined;\n const delta = appendGrammarToolInputJsonDelta(customInput.jsonBuffer, customInput.property, nextInput, close);\n block.arguments = { [customInput.property]: nextInput };\n return delta;\n };\n const finishBlock = (block) => {\n const contentIndex = getContentIndex(block);\n if (contentIndex === -1) {\n return;\n }\n if (block.type === \"text\") {\n stream.push({\n type: \"text_end\",\n contentIndex,\n content: block.text,\n partial: output,\n });\n }\n else if (block.type === \"thinking\") {\n stream.push({\n type: \"thinking_end\",\n contentIndex,\n content: block.thinking,\n partial: output,\n });\n }\n else if (block.type === \"toolCall\") {\n if (block.customInput) {\n const delta = appendCustomToolCallInput(block, getCustomToolCallInput(block), true);\n if (delta !== undefined) {\n stream.push({\n type: \"toolcall_delta\",\n contentIndex,\n delta,\n partial: output,\n });\n }\n }\n else {\n block.arguments = parseStreamingJson(block.partialArgs);\n }\n // Finalize in-place and strip the scratch buffers so replay only\n // carries parsed arguments.\n delete block.partialArgs;\n delete block.customInput;\n delete block.streamIndex;\n stream.push({\n type: \"toolcall_end\",\n contentIndex,\n toolCall: block,\n partial: output,\n });\n }\n };\n const ensureTextBlock = () => {\n if (!textBlock) {\n textBlock = { type: \"text\", text: \"\" };\n blocks.push(textBlock);\n stream.push({ type: \"text_start\", contentIndex: getContentIndex(textBlock), partial: output });\n }\n return textBlock;\n };\n const ensureThinkingBlock = (thinkingSignature) => {\n if (!thinkingBlock) {\n thinkingBlock = {\n type: \"thinking\",\n thinking: \"\",\n thinkingSignature,\n };\n blocks.push(thinkingBlock);\n stream.push({ type: \"thinking_start\", contentIndex: getContentIndex(thinkingBlock), partial: output });\n }\n return thinkingBlock;\n };\n const applyPendingReasoningDetail = (block) => {\n if (!block.id) {\n return;\n }\n const pendingReasoningDetail = pendingReasoningDetailsByToolCallId.get(block.id);\n if (pendingReasoningDetail) {\n block.thoughtSignature = pendingReasoningDetail;\n pendingReasoningDetailsByToolCallId.delete(block.id);\n }\n };\n const ensureToolCallBlock = (toolCall) => {\n const streamIndex = typeof toolCall.index === \"number\" ? toolCall.index : undefined;\n const name = toolCall.function?.name ?? toolCall.custom?.name ?? \"\";\n let block = streamIndex !== undefined ? toolCallBlocksByIndex.get(streamIndex) : undefined;\n if (!block && toolCall.id) {\n block = toolCallBlocksById.get(toolCall.id);\n }\n if (!block) {\n // Note: the \"input\" fallback here should/must not be taken. in case the LLM makes up\n // a tool we don't knwo about, we at least have a place to stash our stuff.\n const customInputProperty = toolCall.custom && !toolCall.function ? (grammarToolInputProperties.get(name) ?? \"input\") : undefined;\n const hasCustomInput = customInputProperty !== undefined;\n block = {\n type: \"toolCall\",\n id: toolCall.id || \"\",\n name,\n arguments: hasCustomInput ? { [customInputProperty]: \"\" } : {},\n partialArgs: hasCustomInput ? undefined : \"\",\n customInput: hasCustomInput\n ? { property: customInputProperty, jsonBuffer: { input: \"\", started: false, closed: false } }\n : undefined,\n streamIndex,\n };\n if (streamIndex !== undefined) {\n toolCallBlocksByIndex.set(streamIndex, block);\n }\n if (toolCall.id) {\n toolCallBlocksById.set(toolCall.id, block);\n }\n blocks.push(block);\n stream.push({\n type: \"toolcall_start\",\n contentIndex: getContentIndex(block),\n partial: output,\n });\n }\n if (streamIndex !== undefined && block.streamIndex === undefined) {\n block.streamIndex = streamIndex;\n toolCallBlocksByIndex.set(streamIndex, block);\n }\n if (toolCall.id) {\n toolCallBlocksById.set(toolCall.id, block);\n }\n if (!block.name && name) {\n block.name = name;\n }\n if (toolCall.custom && !toolCall.function && !block.customInput) {\n const customInputProperty = grammarToolInputProperties.get(block.name) ?? \"input\";\n block.arguments = { [customInputProperty]: \"\" };\n block.customInput = {\n property: customInputProperty,\n jsonBuffer: { input: \"\", started: false, closed: false },\n };\n delete block.partialArgs;\n }\n applyPendingReasoningDetail(block);\n return block;\n };\n for await (const chunk of openaiStream) {\n if (!chunk || typeof chunk !== \"object\")\n continue;\n // OpenAI documents ChatCompletionChunk.id as the unique chat completion identifier,\n // and each chunk in a streamed completion carries the same id.\n output.responseId ||= chunk.id;\n if (typeof chunk.model === \"string\" && chunk.model.length > 0 && chunk.model !== model.id) {\n output.responseModel ||= chunk.model;\n }\n if (chunk.usage) {\n output.usage = parseChunkUsage(chunk.usage, model);\n }\n const choice = Array.isArray(chunk.choices) ? chunk.choices[0] : undefined;\n if (!choice)\n continue;\n // Fallback: some providers (e.g., Moonshot) return usage\n // in choice.usage instead of the standard chunk.usage\n if (!chunk.usage && choice.usage) {\n output.usage = parseChunkUsage(choice.usage, model);\n }\n if (choice.finish_reason) {\n output.rawStopReason = choice.finish_reason;\n const finishReasonResult = mapStopReason(choice.finish_reason);\n output.stopReason = finishReasonResult.stopReason;\n if (finishReasonResult.errorMessage) {\n output.errorMessage = finishReasonResult.errorMessage;\n }\n hasFinishReason = true;\n }\n if (choice.delta) {\n if (choice.delta.content !== null &&\n choice.delta.content !== undefined &&\n choice.delta.content.length > 0) {\n const block = ensureTextBlock();\n block.text += choice.delta.content;\n stream.push({\n type: \"text_delta\",\n contentIndex: getContentIndex(block),\n delta: choice.delta.content,\n partial: output,\n });\n }\n // Some endpoints return reasoning in reasoning_content (llama.cpp),\n // or reasoning (other openai compatible endpoints)\n // Use the first non-empty reasoning field to avoid duplication\n // (e.g., chutes.ai returns both reasoning_content and reasoning with same content)\n const reasoningFields = [\"reasoning_content\", \"reasoning\", \"reasoning_text\"];\n const deltaFields = choice.delta;\n let foundReasoningField = null;\n for (const field of reasoningFields) {\n const value = deltaFields[field];\n if (typeof value === \"string\" && value.length > 0) {\n foundReasoningField = field;\n break;\n }\n }\n if (foundReasoningField) {\n const delta = deltaFields[foundReasoningField];\n if (typeof delta === \"string\" && delta.length > 0) {\n const thinkingSignature = model.provider === \"opencode-go\" && foundReasoningField === \"reasoning\"\n ? \"reasoning_content\"\n : foundReasoningField;\n const block = ensureThinkingBlock(thinkingSignature);\n block.thinking += delta;\n stream.push({\n type: \"thinking_delta\",\n contentIndex: getContentIndex(block),\n delta,\n partial: output,\n });\n }\n }\n if (choice?.delta?.tool_calls) {\n for (const toolCall of choice.delta.tool_calls) {\n const block = ensureToolCallBlock(toolCall);\n if (!block.id && toolCall.id) {\n block.id = toolCall.id;\n toolCallBlocksById.set(toolCall.id, block);\n }\n const name = toolCall.function?.name ?? toolCall.custom?.name;\n if (!block.name && name) {\n block.name = name;\n }\n let delta = \"\";\n if (toolCall.function?.arguments) {\n delta = toolCall.function.arguments;\n block.partialArgs = (block.partialArgs ?? \"\") + toolCall.function.arguments;\n block.arguments = parseStreamingJson(block.partialArgs);\n }\n else if (toolCall.custom?.input) {\n const nextInput = getCustomToolCallInput(block) + toolCall.custom.input;\n delta = appendCustomToolCallInput(block, nextInput, false) ?? \"\";\n }\n stream.push({\n type: \"toolcall_delta\",\n contentIndex: getContentIndex(block),\n delta,\n partial: output,\n });\n }\n }\n const reasoningDetails = choice.delta.reasoning_details;\n if (Array.isArray(reasoningDetails)) {\n for (const detail of reasoningDetails) {\n if (isEncryptedReasoningDetail(detail)) {\n const serializedDetail = JSON.stringify(detail);\n const matchingToolCall = toolCallBlocksById.get(detail.id);\n if (matchingToolCall) {\n matchingToolCall.thoughtSignature = serializedDetail;\n }\n else {\n pendingReasoningDetailsByToolCallId.set(detail.id, serializedDetail);\n }\n }\n }\n }\n }\n }\n for (const block of blocks) {\n finishBlock(block);\n }\n if (options?.signal?.aborted) {\n throw new Error(\"Request was aborted\");\n }\n if (output.stopReason === \"aborted\") {\n throw new Error(\"Request was aborted\");\n }\n if (!hasFinishReason && !compat.supportsFinishReason) {\n output.stopReason = output.content.some((block) => block.type === \"toolCall\") ? \"toolUse\" : \"stop\";\n }\n if (output.stopReason === \"error\") {\n throw new Error(output.errorMessage || \"Provider returned an error stop reason\");\n }\n if ((compat.supportsFinishReason && !hasFinishReason) || output.stopReason === \"pending\") {\n throw new Error(\"Stream ended without finish_reason\");\n }\n stream.push({ type: \"done\", reason: output.stopReason, message: output });\n stream.end();\n }\n catch (error) {\n for (const block of output.content) {\n delete block.index;\n // Streaming scratch buffers are only used during parsing; never persist them.\n delete block.partialArgs;\n delete block.customInput;\n delete block.streamIndex;\n }\n output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n output.errorMessage = formatProviderError(normalizeProviderError(error));\n // Some providers via OpenRouter give additional information in this field.\n // normalizeProviderError already stringifies the parsed body (error.error)\n // into errorMessage, so only append the raw metadata when it is not already\n // present to avoid double-printing it.\n const rawMetadata = error?.error?.metadata?.raw;\n if (rawMetadata && !output.errorMessage.includes(String(rawMetadata))) {\n output.errorMessage += `\\n${rawMetadata}`;\n }\n stream.push({ type: \"error\", reason: output.stopReason, error: output });\n stream.end();\n }\n })();\n return stream;\n};\nexport const streamSimple = (model, context, options) => {\n getClientApiKey(model.provider, options?.apiKey, options?.headers);\n const base = buildBaseOptions(model, context, options, options?.apiKey);\n const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;\n const reasoningEffort = clampedReasoning === \"off\" ? undefined : clampedReasoning;\n const toolChoice = options?.toolChoice;\n return stream(model, context, {\n ...base,\n reasoningEffort,\n toolChoice,\n thinkingBudgets: options?.thinkingBudgets,\n });\n};\nfunction createClient(model, context, apiKey, optionsHeaders, fetch, sessionId, compat = getCompat(model)) {\n const headers = { ...model.headers };\n if (model.provider === \"github-copilot\") {\n const hasImages = hasCopilotVisionInput(context.messages);\n const copilotHeaders = buildCopilotDynamicHeaders({\n messages: context.messages,\n hasImages,\n });\n Object.assign(headers, copilotHeaders);\n }\n if (sessionId && compat.sendSessionAffinityHeaders) {\n if (compat.sessionAffinityFormat === \"openrouter\") {\n headers[\"x-session-id\"] = sessionId;\n }\n else {\n if (compat.sessionAffinityFormat === \"openai\") {\n headers.session_id = sessionId;\n }\n headers[\"x-client-request-id\"] = sessionId;\n headers[\"x-session-affinity\"] = sessionId;\n }\n }\n // Merge options headers last so they can override defaults\n if (optionsHeaders) {\n Object.assign(headers, optionsHeaders);\n }\n return new OpenAI({\n apiKey,\n baseURL: model.baseUrl,\n dangerouslyAllowBrowser: true,\n fetch,\n defaultHeaders: headers,\n });\n}\nfunction buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools)) {\n const messages = convertMessages(model, context, compat, { grammarToolInputProperties });\n const cacheControl = getCompatCacheControl(compat, cacheRetention);\n const params = {\n model: model.id,\n messages,\n stream: true,\n prompt_cache_key: (model.baseUrl.includes(\"api.openai.com\") && cacheRetention !== \"none\") ||\n (cacheRetention === \"long\" && compat.supportsLongCacheRetention)\n ? clampOpenAIPromptCacheKey(options?.sessionId)\n : undefined,\n prompt_cache_retention: cacheRetention === \"long\" && compat.supportsLongCacheRetention ? \"24h\" : undefined,\n };\n if (compat.supportsUsageInStreaming !== false) {\n params.stream_options = { include_usage: true };\n }\n if (compat.supportsStore) {\n params.store = false;\n }\n if (options?.maxTokens) {\n if (compat.maxTokensField === \"max_tokens\") {\n params.max_tokens = options.maxTokens;\n }\n else {\n params.max_completion_tokens = options.maxTokens;\n }\n }\n if (options?.temperature !== undefined) {\n params.temperature = options.temperature;\n }\n const deferredToolNames = compat.deferredToolsMode === \"kimi\" ? getDeferredToolNames(context.messages) : new Set();\n const activeTools = context.tools?.filter((tool) => !deferredToolNames.has(tool.name));\n if (activeTools && activeTools.length > 0) {\n params.tools = convertTools(activeTools, compat);\n if (compat.zaiToolStream) {\n params.tool_stream = true;\n }\n }\n else if (hasToolHistory(context.messages)) {\n // Anthropic (via LiteLLM/proxy) requires tools param when conversation has tool_calls/tool_results\n params.tools = [];\n }\n if (cacheControl) {\n applyAnthropicCacheControl(messages, params.tools, cacheControl);\n }\n if (options?.toolChoice) {\n params.tool_choice = options.toolChoice;\n }\n if (compat.thinkingFormat === \"zai\" && model.reasoning) {\n const zaiParams = params;\n zaiParams.thinking = options?.reasoningEffort ? { type: \"enabled\", clear_thinking: false } : { type: \"disabled\" };\n if (options?.reasoningEffort && compat.supportsReasoningEffort) {\n const mappedEffort = model.thinkingLevelMap?.[options.reasoningEffort];\n const effort = mappedEffort === undefined ? options.reasoningEffort : mappedEffort;\n if (typeof effort === \"string\") {\n zaiParams.reasoning_effort = effort;\n }\n }\n }\n else if (compat.thinkingFormat === \"qwen\" && model.reasoning) {\n params.enable_thinking = !!options?.reasoningEffort;\n if (options?.reasoningEffort && compat.supportsReasoningEffort) {\n const effort = model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;\n if (typeof effort === \"string\") {\n params.reasoning_effort = effort;\n }\n }\n }\n else if (compat.thinkingFormat === \"qwen-chat-template\" && model.reasoning) {\n params.chat_template_kwargs = {\n enable_thinking: !!options?.reasoningEffort,\n preserve_thinking: true,\n };\n }\n else if (compat.thinkingFormat === \"chat-template\" && model.reasoning) {\n const chatTemplateKwargs = buildChatTemplateValues(model, options, compat.chatTemplateKwargs);\n if (chatTemplateKwargs) {\n params.chat_template_kwargs = chatTemplateKwargs;\n }\n }\n else if (compat.thinkingFormat === \"baseten\" && model.reasoning) {\n const basetenParams = params;\n const chatTemplateArgs = buildChatTemplateValues(model, options, compat.chatTemplateArgs);\n if (chatTemplateArgs) {\n basetenParams.chat_template_args = chatTemplateArgs;\n }\n if (compat.supportsReasoningEffort) {\n const requestedEffort = options?.reasoningEffort;\n const mappedEffort = requestedEffort ? model.thinkingLevelMap?.[requestedEffort] : model.thinkingLevelMap?.off;\n const effort = mappedEffort === undefined ? requestedEffort : mappedEffort;\n if (typeof effort === \"string\") {\n basetenParams.reasoning_effort = effort;\n }\n }\n }\n else if (compat.thinkingFormat === \"deepseek\" && model.reasoning) {\n if (options?.reasoningEffort) {\n params.thinking = { type: \"enabled\" };\n }\n else if (model.thinkingLevelMap?.off !== null) {\n params.thinking = { type: \"disabled\" };\n }\n if (options?.reasoningEffort && compat.supportsReasoningEffort) {\n params.reasoning_effort =\n model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;\n }\n }\n else if (compat.thinkingFormat === \"openrouter\" && model.reasoning) {\n // OpenRouter normalizes reasoning across providers via a nested reasoning object.\n const openRouterParams = params;\n if (options?.reasoningEffort) {\n openRouterParams.reasoning = {\n effort: model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort,\n };\n }\n else if (model.thinkingLevelMap?.off !== null) {\n openRouterParams.reasoning = { effort: model.thinkingLevelMap?.off ?? \"none\" };\n }\n }\n else if (compat.thinkingFormat === \"ant-ling\" && model.reasoning && options?.reasoningEffort) {\n const effort = model.thinkingLevelMap?.[options.reasoningEffort];\n if (typeof effort === \"string\") {\n params.reasoning = { effort };\n }\n }\n else if (compat.thinkingFormat === \"together\" && model.reasoning) {\n const togetherParams = params;\n togetherParams.reasoning = { enabled: !!options?.reasoningEffort };\n if (options?.reasoningEffort && compat.supportsReasoningEffort) {\n togetherParams.reasoning_effort = model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;\n }\n }\n else if (compat.thinkingFormat === \"string-thinking\" && model.reasoning) {\n const stringThinkingParams = params;\n if (options?.reasoningEffort) {\n stringThinkingParams.thinking = model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;\n }\n else if (model.thinkingLevelMap?.off !== null) {\n stringThinkingParams.thinking = model.thinkingLevelMap?.off ?? \"none\";\n }\n }\n else if (options?.reasoningEffort && model.reasoning && compat.supportsReasoningEffort) {\n // OpenAI-style reasoning_effort\n params.reasoning_effort = model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;\n }\n else if (!options?.reasoningEffort && model.reasoning && compat.supportsReasoningEffort) {\n const offValue = model.thinkingLevelMap?.off;\n if (typeof offValue === \"string\") {\n params.reasoning_effort = offValue;\n }\n }\n // vLLM caps reasoning with a top-level thinking_token_budget. Independent of\n // thinkingFormat: the same server can serve zai, qwen or chat-template models.\n // Reasoning and the answer share max_tokens here, so an uncapped reasoning\n // phase can consume the whole response and leave no answer and no tool call.\n if (compat.supportsThinkingTokenBudget && options?.reasoningEffort && model.reasoning) {\n const level = clampReasoning(options.reasoningEffort);\n const budgets = {\n minimal: 1024,\n low: 2048,\n medium: 8192,\n high: 16384,\n ...options.thinkingBudgets,\n };\n const ceiling = params.max_tokens ?? params.max_completion_tokens ?? model.maxTokens;\n // Always leave room for the answer, otherwise the budget recreates the bug it prevents.\n const budget = Math.min(budgets[level], Math.max(0, ceiling - MIN_ANSWER_TOKENS));\n if (budget > 0) {\n params.thinking_token_budget = budget;\n }\n }\n // OpenRouter provider routing preferences\n if (model.compat?.openRouterRouting) {\n params.provider = model.compat.openRouterRouting;\n }\n // Vercel AI Gateway provider routing preferences\n if (model.compat?.vercelGatewayRouting) {\n const routing = model.compat.vercelGatewayRouting;\n if (routing.only || routing.order) {\n const gatewayOptions = {};\n if (routing.only)\n gatewayOptions.only = routing.only;\n if (routing.order)\n gatewayOptions.order = routing.order;\n params.providerOptions = { gateway: gatewayOptions };\n }\n }\n // Last so custom keys override the named request fields.\n if (options?.samplingParams) {\n Object.assign(params, options.samplingParams);\n }\n return params;\n}\nfunction buildChatTemplateValues(model, options, values) {\n const resolvedValues = {};\n for (const [key, value] of Object.entries(values)) {\n const resolved = resolveChatTemplateKwargValue(model, options, value);\n if (resolved !== undefined) {\n resolvedValues[key] = resolved;\n }\n }\n return Object.keys(resolvedValues).length > 0 ? resolvedValues : undefined;\n}\nfunction resolveChatTemplateKwargValue(model, options, value) {\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n const reasoningEffort = options?.reasoningEffort;\n if (!reasoningEffort && value.omitWhenOff) {\n return undefined;\n }\n if (value.$var === \"thinking.enabled\") {\n return !!reasoningEffort;\n }\n const mappedValue = reasoningEffort ? model.thinkingLevelMap?.[reasoningEffort] : model.thinkingLevelMap?.off;\n return mappedValue === undefined ? reasoningEffort : typeof mappedValue === \"string\" ? mappedValue : undefined;\n}\nfunction getCompatCacheControl(compat, cacheRetention) {\n if (compat.cacheControlFormat !== \"anthropic\" || cacheRetention === \"none\") {\n return undefined;\n }\n const ttl = cacheRetention === \"long\" && compat.supportsLongCacheRetention ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl ? { ttl } : {}) };\n}\nfunction applyAnthropicCacheControl(messages, tools, cacheControl) {\n addCacheControlToSystemPrompt(messages, cacheControl);\n addCacheControlToLastTool(tools, cacheControl);\n addCacheControlToLastConversationMessage(messages, cacheControl);\n}\nfunction addCacheControlToSystemPrompt(messages, cacheControl) {\n for (const message of messages) {\n if (message.role === \"system\" || message.role === \"developer\") {\n addCacheControlToInstructionMessage(message, cacheControl);\n return;\n }\n }\n}\nfunction addCacheControlToLastConversationMessage(messages, cacheControl) {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message.role === \"user\" || message.role === \"assistant\" || message.role === \"tool\") {\n if (addCacheControlToMessage(message, cacheControl)) {\n return;\n }\n }\n }\n}\nfunction addCacheControlToLastTool(tools, cacheControl) {\n if (!tools || tools.length === 0) {\n return;\n }\n const lastTool = tools[tools.length - 1];\n lastTool.cache_control = cacheControl;\n}\nfunction addCacheControlToInstructionMessage(message, cacheControl) {\n return addCacheControlToTextContent(message, cacheControl);\n}\nfunction addCacheControlToMessage(message, cacheControl) {\n if (message.role === \"user\" || message.role === \"assistant\" || message.role === \"tool\") {\n return addCacheControlToTextContent(message, cacheControl);\n }\n return false;\n}\nfunction addCacheControlToTextContent(message, cacheControl) {\n const content = message.content;\n if (typeof content === \"string\") {\n if (content.length === 0) {\n return false;\n }\n message.content = [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n },\n ];\n return true;\n }\n if (!Array.isArray(content)) {\n return false;\n }\n for (let i = content.length - 1; i >= 0; i--) {\n const part = content[i];\n if (part?.type === \"text\") {\n const textPart = part;\n textPart.cache_control = cacheControl;\n return true;\n }\n }\n return false;\n}\nexport function convertMessages(model, context, compat, options) {\n const params = [];\n const normalizeToolCallId = (id) => {\n // Handle pipe-separated IDs from OpenAI Responses API\n // Format: {call_id}|{id} where {id} can be 400+ chars with special chars (+, /, =)\n // These come from providers like github-copilot, openai-codex, opencode\n // Extract just the call_id part and normalize it\n // Multiple tool calls in the same turn can share call_id but differ by item_id.\n // Preserve item-level uniqueness when replaying into Chat Completions, which\n // requires distinct tool call ids.\n if (id.includes(\"|\")) {\n // Sanitize to allowed chars and truncate to 40 chars (OpenAI limit)\n const separatorIndex = id.indexOf(\"|\");\n const callId = id.slice(0, separatorIndex).replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const itemId = id.slice(separatorIndex + 1).replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const combinedId = itemId.length > 0 ? `${callId}_${itemId}` : callId;\n if (combinedId.length <= 40) {\n return combinedId;\n }\n const hash = shortHash(id).slice(0, 8);\n const prefix = callId.slice(0, Math.max(1, 40 - hash.length - 1));\n return `${prefix}_${hash}`;\n }\n if (model.provider === \"openai\")\n return id.length > 40 ? id.slice(0, 40) : id;\n return id;\n };\n const transformedMessages = transformMessages(context.messages, model, (id) => normalizeToolCallId(id));\n if (context.systemPrompt) {\n const useDeveloperRole = model.reasoning && compat.supportsDeveloperRole;\n const role = useDeveloperRole ? \"developer\" : \"system\";\n params.push({ role: role, content: sanitizeSurrogates(context.systemPrompt) });\n }\n let lastRole = null;\n for (let i = 0; i < transformedMessages.length; i++) {\n const msg = transformedMessages[i];\n // Some providers don't allow user messages directly after tool results\n // Insert a synthetic assistant message to bridge the gap\n if (compat.requiresAssistantAfterToolResult && lastRole === \"toolResult\" && msg.role === \"user\") {\n params.push({\n role: \"assistant\",\n content: \"I have processed the tool results.\",\n });\n }\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n params.push({\n role: \"user\",\n content: sanitizeSurrogates(msg.content),\n });\n }\n else {\n const content = msg.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: sanitizeSurrogates(item.text),\n };\n }\n else {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${item.mimeType};base64,${item.data}`,\n },\n };\n }\n });\n if (content.length === 0)\n continue;\n params.push({\n role: \"user\",\n content,\n });\n }\n }\n else if (msg.role === \"assistant\") {\n // Some providers don't accept null content, use empty string instead\n const assistantMsg = {\n role: \"assistant\",\n content: compat.requiresAssistantAfterToolResult ? \"\" : null,\n };\n const assistantTextParts = msg.content\n .filter(isTextContentBlock)\n .filter((block) => block.text.trim().length > 0)\n .map((block) => ({\n type: \"text\",\n text: sanitizeSurrogates(block.text),\n }));\n const assistantText = assistantTextParts.map((part) => part.text).join(\"\");\n const nonEmptyThinkingBlocks = msg.content\n .filter(isThinkingContentBlock)\n .filter((block) => block.thinking.trim().length > 0);\n if (nonEmptyThinkingBlocks.length > 0) {\n if (compat.requiresThinkingAsText) {\n // Convert thinking blocks to plain text (no tags to avoid model mimicking them)\n const thinkingText = nonEmptyThinkingBlocks\n .map((block) => sanitizeSurrogates(block.thinking))\n .join(\"\\n\\n\");\n assistantMsg.content = [{ type: \"text\", text: thinkingText }, ...assistantTextParts];\n }\n else {\n // Always send assistant content as a plain string (OpenAI Chat Completions\n // API standard format). Sending as an array of {type:\"text\", text:\"...\"}\n // objects is non-standard and causes some models (e.g. DeepSeek V3.2 via\n // NVIDIA NIM) to mirror the content-block structure literally in their\n // output, producing recursive nesting like [{'type':'text','text':'[{...}]'}].\n if (assistantText.length > 0) {\n assistantMsg.content = assistantText;\n }\n // Use the signature from the first thinking block if available (for llama.cpp server + gpt-oss)\n let signature = nonEmptyThinkingBlocks[0].thinkingSignature;\n if (model.provider === \"opencode-go\" && signature === \"reasoning\") {\n signature = \"reasoning_content\";\n }\n if (signature && signature.length > 0) {\n assistantMsg[signature] = nonEmptyThinkingBlocks.map((block) => block.thinking).join(\"\\n\");\n }\n }\n }\n else if (assistantText.length > 0) {\n // Always send assistant content as a plain string (OpenAI Chat Completions\n // API standard format). Sending as an array of {type:\"text\", text:\"...\"}\n // objects is non-standard and causes some models (e.g. DeepSeek V3.2 via\n // NVIDIA NIM) to mirror the content-block structure literally in their\n // output, producing recursive nesting like [{'type':'text','text':'[{...}]'}].\n assistantMsg.content = assistantText;\n }\n const toolCalls = msg.content.filter(isToolCallBlock);\n if (toolCalls.length > 0) {\n assistantMsg.tool_calls = toolCalls.map((tc) => {\n const customInputProperty = options?.grammarToolInputProperties?.get(tc.name);\n if (customInputProperty !== undefined) {\n return {\n id: tc.id,\n type: \"custom\",\n custom: {\n name: tc.name,\n input: sanitizeSurrogates(getGrammarToolInput(tc.name, tc.arguments, customInputProperty)),\n },\n };\n }\n return {\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n },\n };\n });\n const reasoningDetails = toolCalls\n .filter((tc) => tc.thoughtSignature)\n .map((tc) => {\n try {\n return JSON.parse(tc.thoughtSignature);\n }\n catch {\n return null;\n }\n })\n .filter(Boolean);\n if (reasoningDetails.length > 0) {\n assistantMsg.reasoning_details = reasoningDetails;\n }\n }\n if (compat.requiresReasoningContentOnAssistantMessages &&\n model.reasoning &&\n assistantMsg.reasoning_content === undefined) {\n assistantMsg.reasoning_content = \"\";\n }\n // Skip assistant messages that have no content and no tool calls.\n // Some providers require \"either content or tool_calls, but not none\".\n // Other providers also don't accept empty assistant messages.\n // This handles aborted assistant responses that got no content.\n const content = assistantMsg.content;\n const hasContent = content !== null &&\n content !== undefined &&\n (typeof content === \"string\" ? content.length > 0 : content.length > 0);\n if (!hasContent && !assistantMsg.tool_calls) {\n continue;\n }\n params.push(assistantMsg);\n }\n else if (msg.role === \"toolResult\") {\n const imageBlocks = [];\n const deferredToolNames = new Set();\n let j = i;\n for (; j < transformedMessages.length && transformedMessages[j].role === \"toolResult\"; j++) {\n const toolMsg = transformedMessages[j];\n // Extract text and image content\n const textResult = toolMsg.content\n .filter(isTextContentBlock)\n .map((block) => block.text)\n .join(\"\\n\");\n const hasImages = toolMsg.content.some((c) => c.type === \"image\");\n // Always send tool result with text (or placeholder if only images)\n const hasText = textResult.length > 0;\n const toolResultText = hasText ? textResult : hasImages ? \"(see attached image)\" : \"(no tool output)\";\n // Some providers require the 'name' field in tool results\n const toolResultMsg = {\n role: \"tool\",\n content: sanitizeSurrogates(toolResultText),\n tool_call_id: toolMsg.toolCallId,\n };\n if (compat.requiresToolResultName && toolMsg.toolName) {\n toolResultMsg.name = toolMsg.toolName;\n }\n params.push(toolResultMsg);\n if (compat.deferredToolsMode === \"kimi\") {\n for (const name of toolMsg.addedToolNames ?? []) {\n deferredToolNames.add(name);\n }\n }\n if (hasImages && model.input.includes(\"image\")) {\n for (const block of toolMsg.content) {\n if (isImageContentBlock(block)) {\n imageBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${block.mimeType};base64,${block.data}`,\n },\n });\n }\n }\n }\n }\n i = j - 1;\n if (imageBlocks.length > 0) {\n if (compat.requiresAssistantAfterToolResult) {\n params.push({\n role: \"assistant\",\n content: \"I have processed the tool results.\",\n });\n }\n params.push({\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: \"Attached image(s) from tool result:\",\n },\n ...imageBlocks,\n ],\n });\n lastRole = \"user\";\n }\n else {\n lastRole = \"toolResult\";\n }\n if (deferredToolNames.size > 0) {\n const deferredTools = getToolsByName(context.tools, deferredToolNames);\n if (deferredTools.length > 0) {\n const kimiToolMessage = {\n role: \"system\",\n tools: convertTools(deferredTools, compat),\n };\n // Kimi accepts a system message with tools but omits the standard content field.\n params.push(kimiToolMessage);\n }\n }\n continue;\n }\n lastRole = msg.role;\n }\n return params;\n}\nfunction convertTools(tools, compat) {\n return tools.map((tool) => {\n const grammar = resolveGrammarConstrainedSampling(tool, compat.supportsOpenAIGrammarTools);\n if (grammar) {\n return {\n type: \"custom\",\n custom: {\n name: tool.name,\n description: tool.description,\n format: {\n type: \"grammar\",\n grammar: {\n syntax: grammar.format,\n definition: grammar.definition,\n },\n },\n },\n };\n }\n const strict = resolveJsonSchemaStrictSampling(tool, compat.supportsStrictMode !== false);\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters, // TypeBox already generates JSON Schema\n // Only include strict if provider supports it. Some reject unknown fields.\n ...(compat.supportsStrictMode !== false && { strict: strict ?? false }),\n },\n };\n });\n}\nfunction parseChunkUsage(rawUsage, model) {\n const promptTokens = rawUsage.prompt_tokens || 0;\n const cacheReadTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? rawUsage.prompt_cache_hit_tokens ?? 0;\n const cacheWriteTokens = rawUsage.prompt_tokens_details?.cache_write_tokens || 0;\n // Follow documented OpenAI/OpenRouter semantics: cached_tokens is cache-read\n // tokens (hits). OpenAI does not document or emit cache_write_tokens, but\n // OpenRouter-compatible providers can include it as a separate write count.\n // OpenRouter's own provider/tests affirm the separate mapping:\n // https://github.com/OpenRouterTeam/ai-sdk-provider/pull/409\n // Do not subtract writes from cached_tokens, otherwise spec-compliant\n // providers are under-reported. DS4 mirrors this contract too:\n // https://github.com/antirez/ds4/pull/29\n const input = Math.max(0, promptTokens - cacheReadTokens - cacheWriteTokens);\n // OpenAI completion_tokens already includes reasoning_tokens.\n const outputTokens = rawUsage.completion_tokens || 0;\n const usage = {\n input,\n output: outputTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: cacheWriteTokens,\n reasoning: rawUsage.completion_tokens_details?.reasoning_tokens || 0,\n totalTokens: input + outputTokens + cacheReadTokens + cacheWriteTokens,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n calculateCost(model, usage);\n return usage;\n}\nfunction mapStopReason(reason) {\n if (reason === null)\n return { stopReason: \"stop\" };\n switch (reason) {\n case \"stop\":\n case \"end\":\n return { stopReason: \"stop\" };\n case \"length\":\n return { stopReason: \"length\" };\n case \"function_call\":\n case \"tool_calls\":\n return { stopReason: \"toolUse\" };\n case \"content_filter\":\n return { stopReason: \"error\", errorMessage: \"Provider finish_reason: content_filter\" };\n case \"network_error\":\n return { stopReason: \"error\", errorMessage: \"Provider finish_reason: network_error\" };\n default:\n return {\n stopReason: \"error\",\n errorMessage: `Provider finish_reason: ${reason}`,\n };\n }\n}\n/**\n * Auto-detect compatibility settings from provider name and baseUrl.\n * Used as the base when model.compat is not set; explicit model.compat\n * entries override these detected values.\n */\nfunction detectCompat(model) {\n const provider = model.provider;\n const baseUrl = model.baseUrl;\n const isZai = provider === \"zai\" ||\n provider === \"zai-coding-cn\" ||\n baseUrl.includes(\"api.z.ai\") ||\n baseUrl.includes(\"open.bigmodel.cn\");\n const isTogether = provider === \"together\" || baseUrl.includes(\"api.together.ai\") || baseUrl.includes(\"api.together.xyz\");\n const isMoonshot = provider === \"moonshotai\" || provider === \"moonshotai-cn\" || baseUrl.includes(\"api.moonshot.\");\n const isOpenRouter = provider === \"openrouter\" || baseUrl.includes(\"openrouter.ai\");\n const isCloudflareWorkersAI = provider === \"cloudflare-workers-ai\" || baseUrl.includes(\"api.cloudflare.com\");\n const isCloudflareAiGateway = provider === \"cloudflare-ai-gateway\" || baseUrl.includes(\"gateway.ai.cloudflare.com\");\n const isNvidia = provider === \"nvidia\" || baseUrl.includes(\"integrate.api.nvidia.com\");\n const isAntLing = provider === \"ant-ling\" || baseUrl.includes(\"api.ant-ling.com\");\n const isNonStandard = isNvidia ||\n provider === \"cerebras\" ||\n baseUrl.includes(\"cerebras.ai\") ||\n provider === \"xai\" ||\n baseUrl.includes(\"api.x.ai\") ||\n isTogether ||\n baseUrl.includes(\"chutes.ai\") ||\n baseUrl.includes(\"deepseek.com\") ||\n isZai ||\n isMoonshot ||\n provider === \"opencode\" ||\n baseUrl.includes(\"opencode.ai\") ||\n isCloudflareWorkersAI ||\n isCloudflareAiGateway ||\n isAntLing;\n const useMaxTokens = baseUrl.includes(\"chutes.ai\") ||\n isMoonshot ||\n isCloudflareAiGateway ||\n isTogether ||\n isNvidia ||\n isAntLing ||\n isZai;\n const isGrok = provider === \"xai\" || baseUrl.includes(\"api.x.ai\");\n const isDeepSeek = provider === \"deepseek\" || baseUrl.includes(\"deepseek.com\");\n const isOpenRouterDeveloperRoleModel = isOpenRouter && (model.id.startsWith(\"anthropic/\") || model.id.startsWith(\"openai/\"));\n const cacheControlFormat = provider === \"openrouter\" && model.id.startsWith(\"anthropic/\") ? \"anthropic\" : undefined;\n return {\n supportsStore: !isNonStandard,\n supportsDeveloperRole: isOpenRouterDeveloperRoleModel || (!isNonStandard && !isOpenRouter),\n supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia && !isAntLing,\n supportsUsageInStreaming: true,\n supportsFinishReason: true,\n maxTokensField: useMaxTokens ? \"max_tokens\" : \"max_completion_tokens\",\n requiresToolResultName: false,\n requiresAssistantAfterToolResult: false,\n requiresThinkingAsText: false,\n requiresReasoningContentOnAssistantMessages: isDeepSeek,\n thinkingFormat: isDeepSeek\n ? \"deepseek\"\n : isZai\n ? \"zai\"\n : isTogether\n ? \"together\"\n : isAntLing\n ? \"ant-ling\"\n : isOpenRouter\n ? \"openrouter\"\n : \"openai\",\n openRouterRouting: {},\n vercelGatewayRouting: {},\n chatTemplateKwargs: {},\n chatTemplateArgs: {},\n zaiToolStream: false,\n supportsThinkingTokenBudget: false,\n supportsStrictMode: !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia,\n supportsOpenAIGrammarTools: false,\n cacheControlFormat,\n sendSessionAffinityHeaders: false,\n deferredToolsMode: undefined,\n sessionAffinityFormat: isOpenRouter ? \"openrouter\" : \"openai\",\n supportsLongCacheRetention: !(isTogether ||\n isCloudflareWorkersAI ||\n isCloudflareAiGateway ||\n isNvidia ||\n isAntLing),\n };\n}\n/**\n * Get resolved compatibility settings for a model.\n * Auto-detects from provider/URL then overrides with explicit model.compat.\n */\nfunction getCompat(model) {\n const detected = detectCompat(model);\n if (!model.compat)\n return detected;\n return {\n supportsStore: model.compat.supportsStore ?? detected.supportsStore,\n supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,\n supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,\n supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,\n supportsFinishReason: model.compat.supportsFinishReason ?? detected.supportsFinishReason,\n maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,\n requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,\n requiresAssistantAfterToolResult: model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,\n requiresThinkingAsText: model.compat.requiresThinkingAsText ?? detected.requiresThinkingAsText,\n requiresReasoningContentOnAssistantMessages: model.compat.requiresReasoningContentOnAssistantMessages ??\n detected.requiresReasoningContentOnAssistantMessages,\n thinkingFormat: model.compat.thinkingFormat ?? detected.thinkingFormat,\n openRouterRouting: model.compat.openRouterRouting ?? {},\n vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,\n chatTemplateKwargs: model.compat.chatTemplateKwargs ?? detected.chatTemplateKwargs,\n chatTemplateArgs: model.compat.chatTemplateArgs ?? detected.chatTemplateArgs,\n zaiToolStream: model.compat.zaiToolStream ?? detected.zaiToolStream,\n supportsThinkingTokenBudget: model.compat.supportsThinkingTokenBudget ?? detected.supportsThinkingTokenBudget,\n supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,\n supportsOpenAIGrammarTools: model.compat.supportsOpenAIGrammarTools ?? detected.supportsOpenAIGrammarTools,\n cacheControlFormat: model.compat.cacheControlFormat ?? detected.cacheControlFormat,\n sendSessionAffinityHeaders: model.compat.sendSessionAffinityHeaders ?? detected.sendSessionAffinityHeaders,\n deferredToolsMode: model.compat.deferredToolsMode ?? detected.deferredToolsMode,\n sessionAffinityFormat: model.compat.sessionAffinityFormat ?? detected.sessionAffinityFormat,\n supportsLongCacheRetention: model.compat.supportsLongCacheRetention ?? detected.supportsLongCacheRetention,\n };\n}\n//# sourceMappingURL=openai-completions.js.map"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,316 +0,0 @@
1
-
2
- import { R as AssistantMessageEventStream } from "./pi-ai-B4hucafU.mjs";
3
- import OpenAI from "openai";
4
- //#region src/compat/openai-completions-lite.ts
5
- function textFromContent(content) {
6
- if (typeof content === "string") return content;
7
- if (!Array.isArray(content)) return "";
8
- return content.filter((block) => block.type === "text" && typeof block.text === "string").map((block) => block.text).join("");
9
- }
10
- function userParts(content) {
11
- if (typeof content === "string") return content;
12
- if (!Array.isArray(content)) return "";
13
- const parts = [];
14
- for (const block of content) if (block.type === "text" && typeof block.text === "string") parts.push({
15
- type: "text",
16
- text: block.text
17
- });
18
- else if (block.type === "image" && typeof block.data === "string") parts.push({
19
- type: "image_url",
20
- image_url: { url: `data:${String(block.mimeType ?? "image/png")};base64,${block.data}` }
21
- });
22
- return parts.every((part) => part.type === "text") ? parts.map((part) => String(part.text ?? "")).join("") : parts;
23
- }
24
- /** Pi request context → OpenAI chat.completions messages (Pi's convertMessages semantics for the gateway surface). */
25
- function liteConvertMessages(context) {
26
- const out = [];
27
- const system = typeof context.systemPrompt === "string" && context.systemPrompt.length > 0 ? context.systemPrompt : void 0;
28
- if (system !== void 0) out.push({
29
- role: "system",
30
- content: system
31
- });
32
- for (const message of Array.isArray(context.messages) ? context.messages : []) if (message.role === "user") out.push({
33
- role: "user",
34
- content: userParts(message.content)
35
- });
36
- else if (message.role === "assistant") {
37
- const toolCalls = (Array.isArray(message.content) ? message.content : []).filter((block) => block.type === "toolCall");
38
- const assistant = {
39
- role: "assistant",
40
- content: textFromContent(message.content) || null
41
- };
42
- if (toolCalls.length > 0) assistant.tool_calls = toolCalls.map((call) => ({
43
- id: String(call.id ?? ""),
44
- type: "function",
45
- function: {
46
- name: String(call.name ?? ""),
47
- arguments: typeof call.arguments === "string" ? call.arguments : JSON.stringify(call.arguments ?? {})
48
- }
49
- }));
50
- out.push(assistant);
51
- } else if (message.role === "toolResult") out.push({
52
- role: "tool",
53
- tool_call_id: String(message.toolCallId ?? ""),
54
- content: textFromContent(message.content) || "(no output)"
55
- });
56
- return out;
57
- }
58
- function liteTools(tools) {
59
- if (!Array.isArray(tools) || tools.length === 0) return void 0;
60
- return tools.map((tool) => ({
61
- type: "function",
62
- function: {
63
- name: String(tool.name ?? ""),
64
- description: String(tool.description ?? ""),
65
- parameters: tool.parameters ?? {
66
- type: "object",
67
- properties: {}
68
- }
69
- }
70
- }));
71
- }
72
- function mapStopReason(reason) {
73
- if (reason === "length") return "length";
74
- if (reason === "tool_calls" || reason === "function_call") return "toolUse";
75
- return "stop";
76
- }
77
- const REASONING_FIELDS = [
78
- "reasoning_content",
79
- "reasoning",
80
- "reasoning_text"
81
- ];
82
- /**
83
- * Stream one completion from an OpenAI-compatible gateway as Pi's
84
- * AssistantMessageEventStream. The public shape matches pi-ai's api
85
- * modules: (model, context, options) with apiKey/baseUrl/headers riding
86
- * options, exactly how the provider adapter's synthesized transport calls.
87
- */
88
- function stream(model, context, options = {}) {
89
- const events = new AssistantMessageEventStream();
90
- const provider = String(model.provider ?? "");
91
- const modelId = String(model.id ?? "");
92
- const compat = model.compat ?? {};
93
- (async () => {
94
- const content = [];
95
- const partial = {
96
- role: "assistant",
97
- content,
98
- provider,
99
- model: modelId,
100
- api: "openai-completions"
101
- };
102
- let usage;
103
- let stopReason;
104
- events.push({
105
- type: "start",
106
- partial
107
- });
108
- try {
109
- const client = new OpenAI({
110
- apiKey: String(options.apiKey ?? "missing-api-key"),
111
- baseURL: String(model.baseUrl ?? ""),
112
- dangerouslyAllowBrowser: true,
113
- ...options.headers === void 0 ? {} : { defaultHeaders: options.headers }
114
- });
115
- const params = {
116
- model: modelId,
117
- messages: liteConvertMessages(context),
118
- stream: true
119
- };
120
- if (compat.supportsUsageInStreaming !== false) params.stream_options = { include_usage: true };
121
- const tools = liteTools(context.tools);
122
- if (tools !== void 0) params.tools = tools;
123
- if (typeof options.maxTokens === "number") params[compat.maxTokensField === "max_tokens" ? "max_tokens" : "max_completion_tokens"] = options.maxTokens;
124
- if (typeof options.temperature === "number") params.temperature = options.temperature;
125
- const response = await client.chat.completions.create(params, options.signal instanceof AbortSignal ? { signal: options.signal } : void 0);
126
- let textIndex = -1;
127
- let thinkingIndex = -1;
128
- const toolIndexByPosition = /* @__PURE__ */ new Map();
129
- const closeText = () => {
130
- if (textIndex === -1) return;
131
- events.push({
132
- type: "text_end",
133
- contentIndex: textIndex,
134
- content: String(content[textIndex]?.text ?? ""),
135
- partial
136
- });
137
- textIndex = -1;
138
- };
139
- const closeThinking = () => {
140
- if (thinkingIndex === -1) return;
141
- events.push({
142
- type: "thinking_end",
143
- contentIndex: thinkingIndex,
144
- content: String(content[thinkingIndex]?.thinking ?? ""),
145
- partial
146
- });
147
- thinkingIndex = -1;
148
- };
149
- for await (const chunk of response) {
150
- const chunkUsage = chunk.usage;
151
- if (chunkUsage !== void 0 && chunkUsage !== null) {
152
- const input = Number(chunkUsage.prompt_tokens ?? 0);
153
- const output = Number(chunkUsage.completion_tokens ?? 0);
154
- usage = {
155
- input,
156
- output,
157
- cacheRead: 0,
158
- cacheWrite: 0,
159
- totalTokens: Number(chunkUsage.total_tokens ?? input + output),
160
- cost: {
161
- input: 0,
162
- output: 0,
163
- cacheRead: 0,
164
- cacheWrite: 0,
165
- total: 0
166
- }
167
- };
168
- }
169
- const choice = Array.isArray(chunk.choices) ? chunk.choices[0] : void 0;
170
- if (choice === void 0) continue;
171
- const delta = choice.delta ?? {};
172
- for (const field of REASONING_FIELDS) {
173
- const value = delta[field];
174
- if (typeof value === "string" && value.length > 0) {
175
- closeText();
176
- if (thinkingIndex === -1) {
177
- thinkingIndex = content.length;
178
- content[thinkingIndex] = {
179
- type: "thinking",
180
- thinking: ""
181
- };
182
- events.push({
183
- type: "thinking_start",
184
- contentIndex: thinkingIndex,
185
- partial
186
- });
187
- }
188
- const block = content[thinkingIndex];
189
- block.thinking = String(block.thinking ?? "") + value;
190
- events.push({
191
- type: "thinking_delta",
192
- contentIndex: thinkingIndex,
193
- delta: value,
194
- partial
195
- });
196
- }
197
- }
198
- if (typeof delta.content === "string" && delta.content.length > 0) {
199
- closeThinking();
200
- if (textIndex === -1) {
201
- textIndex = content.length;
202
- content[textIndex] = {
203
- type: "text",
204
- text: ""
205
- };
206
- events.push({
207
- type: "text_start",
208
- contentIndex: textIndex,
209
- partial
210
- });
211
- }
212
- const block = content[textIndex];
213
- block.text = String(block.text ?? "") + delta.content;
214
- events.push({
215
- type: "text_delta",
216
- contentIndex: textIndex,
217
- delta: delta.content,
218
- partial
219
- });
220
- }
221
- if (Array.isArray(delta.tool_calls)) {
222
- closeText();
223
- closeThinking();
224
- for (const call of delta.tool_calls) {
225
- const position = Number(call.index ?? 0);
226
- let index = toolIndexByPosition.get(position);
227
- if (index === void 0) {
228
- index = content.length;
229
- toolIndexByPosition.set(position, index);
230
- content[index] = {
231
- type: "toolCall",
232
- id: "",
233
- name: "",
234
- arguments: void 0,
235
- partialJson: ""
236
- };
237
- events.push({
238
- type: "toolcall_start",
239
- contentIndex: index,
240
- partial
241
- });
242
- }
243
- const block = content[index];
244
- if (typeof call.id === "string" && call.id.length > 0) block.id = call.id;
245
- const fn = call.function;
246
- if (typeof fn?.name === "string" && fn.name.length > 0) block.name = String(block.name ?? "") + fn.name;
247
- if (typeof fn?.arguments === "string" && fn.arguments.length > 0) {
248
- block.partialJson = String(block.partialJson ?? "") + fn.arguments;
249
- events.push({
250
- type: "toolcall_delta",
251
- contentIndex: index,
252
- delta: fn.arguments,
253
- partial
254
- });
255
- }
256
- }
257
- }
258
- if (typeof choice.finish_reason === "string" && choice.finish_reason.length > 0) stopReason = mapStopReason(choice.finish_reason);
259
- }
260
- closeText();
261
- closeThinking();
262
- for (const index of toolIndexByPosition.values()) {
263
- const block = content[index];
264
- let parsed;
265
- try {
266
- parsed = JSON.parse(String(block.partialJson ?? "") || "{}");
267
- } catch {
268
- parsed = {};
269
- }
270
- content[index] = {
271
- type: "toolCall",
272
- id: String(block.id ?? ""),
273
- name: String(block.name ?? ""),
274
- arguments: parsed
275
- };
276
- events.push({
277
- type: "toolcall_end",
278
- contentIndex: index,
279
- toolCall: content[index],
280
- partial
281
- });
282
- }
283
- if (stopReason === void 0) throw new Error("stream ended without finish_reason");
284
- const message = {
285
- role: "assistant",
286
- content: content.filter((block) => block !== void 0),
287
- provider,
288
- model: modelId,
289
- api: "openai-completions",
290
- ...usage === void 0 ? {} : { usage },
291
- stopReason,
292
- timestamp: Date.now()
293
- };
294
- events.push({
295
- type: "done",
296
- reason: stopReason,
297
- message
298
- });
299
- } catch (error) {
300
- const aborted = options.signal instanceof AbortSignal && options.signal.aborted;
301
- events.push({
302
- type: "error",
303
- reason: aborted ? "aborted" : "error",
304
- error: error instanceof Error ? error : new Error(String(error)),
305
- partial
306
- });
307
- }
308
- })();
309
- return events;
310
- }
311
- /** Pi's streamSimple for this api is the same call surface on the gateway slice. */
312
- const streamSimple = stream;
313
- //#endregion
314
- export { liteConvertMessages, stream, streamSimple };
315
-
316
- //# sourceMappingURL=openai-completions-lite-BrM7gJzs.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-completions-lite-BrM7gJzs.mjs","names":[],"sources":["../src/compat/openai-completions-lite.ts"],"sourcesContent":["// The bridge's own openai-completions wire client for models.json\n// config-only providers, written against Pi's client semantics\n// (../pi packages/ai/src/api/openai-completions.ts @ 47f9438) and the\n// official `openai` SDK. It exists so the ENGINE's dependency tree stays\n// free of packages carrying install scripts (@earendil-works/pi-ai pulls\n// @google/genai → protobufjs, whose blocked build script fails\n// `dsh plugin add` for a transitive dependency): the one wire protocol\n// virtually every custom gateway speaks is served natively; the rarer\n// apis lazily use a real pi-ai when the profile has one.\n//\n// Scope: the config-only gateway surface — messages (text, images as data\n// URLs, tool calls/results), tools, maxTokens/temperature, apiKey/baseUrl/\n// headers, reasoning-content thinking, streamed tool calls, usage, finish\n// mapping, and the two compat switches such gateways actually vary on\n// (maxTokensField, supportsUsageInStreaming). Pi-provider-specific layers\n// (copilot headers, session affinity, grammar tools, prompt cache) are\n// out of scope by design.\n\nimport OpenAI from 'openai'\nimport { AssistantMessageEventStream } from './vendor/pi-ai-event-stream.js'\n\ntype UnknownRecord = Record<string, unknown>\n\ninterface PiContentBlock { type: string, [key: string]: unknown }\n\ninterface LiteCompat {\n maxTokensField?: 'max_completion_tokens' | 'max_tokens'\n supportsUsageInStreaming?: boolean\n}\n\nfunction textFromContent(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n return (content as PiContentBlock[])\n .filter(block => block.type === 'text' && typeof block.text === 'string')\n .map(block => block.text as string)\n .join('')\n}\n\nfunction userParts(content: unknown): string | Array<UnknownRecord> {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n const parts: UnknownRecord[] = []\n for (const block of content as PiContentBlock[]) {\n if (block.type === 'text' && typeof block.text === 'string') {\n parts.push({ type: 'text', text: block.text })\n } else if (block.type === 'image' && typeof block.data === 'string') {\n // Pi's ImageContent {data, mimeType} → OpenAI data-URL image part.\n parts.push({\n type: 'image_url',\n image_url: { url: `data:${String(block.mimeType ?? 'image/png')};base64,${block.data}` },\n })\n }\n }\n const allText = parts.every(part => part.type === 'text')\n return allText ? parts.map(part => String(part.text ?? '')).join('') : parts\n}\n\n/** Pi request context → OpenAI chat.completions messages (Pi's convertMessages semantics for the gateway surface). */\nexport function liteConvertMessages(context: UnknownRecord): Array<UnknownRecord> {\n const out: Array<UnknownRecord> = []\n const system = typeof context.systemPrompt === 'string' && context.systemPrompt.length > 0\n ? context.systemPrompt\n : undefined\n if (system !== undefined) out.push({ role: 'system', content: system })\n for (const message of Array.isArray(context.messages) ? context.messages as UnknownRecord[] : []) {\n if (message.role === 'user') {\n out.push({ role: 'user', content: userParts(message.content) })\n } else if (message.role === 'assistant') {\n const blocks = Array.isArray(message.content) ? message.content as PiContentBlock[] : []\n const toolCalls = blocks.filter(block => block.type === 'toolCall')\n const assistant: UnknownRecord = { role: 'assistant', content: textFromContent(message.content) || null }\n if (toolCalls.length > 0) {\n assistant.tool_calls = toolCalls.map(call => ({\n id: String(call.id ?? ''),\n type: 'function',\n function: {\n name: String(call.name ?? ''),\n arguments: typeof call.arguments === 'string' ? call.arguments : JSON.stringify(call.arguments ?? {}),\n },\n }))\n }\n out.push(assistant)\n } else if (message.role === 'toolResult') {\n out.push({\n role: 'tool',\n tool_call_id: String(message.toolCallId ?? ''),\n content: textFromContent(message.content) || '(no output)',\n })\n }\n }\n return out\n}\n\nfunction liteTools(tools: unknown): Array<UnknownRecord> | undefined {\n if (!Array.isArray(tools) || tools.length === 0) return undefined\n return (tools as UnknownRecord[]).map(tool => ({\n type: 'function',\n function: {\n name: String(tool.name ?? ''),\n description: String(tool.description ?? ''),\n parameters: (tool.parameters ?? { type: 'object', properties: {} }) as UnknownRecord,\n },\n }))\n}\n\nfunction mapStopReason(reason: string): 'stop' | 'length' | 'toolUse' {\n if (reason === 'length') return 'length'\n if (reason === 'tool_calls' || reason === 'function_call') return 'toolUse'\n return 'stop'\n}\n\n// Pi probes these delta fields for reasoning text, in this order.\nconst REASONING_FIELDS = ['reasoning_content', 'reasoning', 'reasoning_text'] as const\n\n/**\n * Stream one completion from an OpenAI-compatible gateway as Pi's\n * AssistantMessageEventStream. The public shape matches pi-ai's api\n * modules: (model, context, options) with apiKey/baseUrl/headers riding\n * options, exactly how the provider adapter's synthesized transport calls.\n */\nexport function stream(\n model: UnknownRecord,\n context: UnknownRecord,\n options: UnknownRecord = {},\n): AssistantMessageEventStream {\n const events = new AssistantMessageEventStream() as AssistantMessageEventStream & {\n push(event: UnknownRecord): void\n end?(): void\n }\n const provider = String(model.provider ?? '')\n const modelId = String(model.id ?? '')\n const compat = (model.compat ?? {}) as LiteCompat\n\n void (async () => {\n const content: PiContentBlock[] = []\n const partial: UnknownRecord = { role: 'assistant', content, provider, model: modelId, api: 'openai-completions' }\n let usage: UnknownRecord | undefined\n let stopReason: 'stop' | 'length' | 'toolUse' | undefined\n events.push({ type: 'start', partial })\n try {\n const client = new OpenAI({\n apiKey: String(options.apiKey ?? 'missing-api-key'),\n baseURL: String(model.baseUrl ?? ''),\n dangerouslyAllowBrowser: true,\n ...(options.headers === undefined ? {} : { defaultHeaders: options.headers as Record<string, string> }),\n })\n const params: UnknownRecord = {\n model: modelId,\n messages: liteConvertMessages(context),\n stream: true,\n }\n if (compat.supportsUsageInStreaming !== false) params.stream_options = { include_usage: true }\n const tools = liteTools(context.tools)\n if (tools !== undefined) params.tools = tools\n if (typeof options.maxTokens === 'number') {\n params[compat.maxTokensField === 'max_tokens' ? 'max_tokens' : 'max_completion_tokens'] = options.maxTokens\n }\n if (typeof options.temperature === 'number') params.temperature = options.temperature\n\n const response = await client.chat.completions.create(\n params as never,\n options.signal instanceof AbortSignal ? { signal: options.signal } : undefined,\n ) as unknown as AsyncIterable<UnknownRecord>\n\n // Streaming block state: at most one open text block, one open\n // thinking block, and one open tool call at a time (OpenAI deltas\n // arrive per tool-call index; text/reasoning interleave by field).\n let textIndex = -1\n let thinkingIndex = -1\n const toolIndexByPosition = new Map<number, number>()\n const closeText = (): void => {\n if (textIndex === -1) return\n events.push({ type: 'text_end', contentIndex: textIndex, content: String(content[textIndex]?.text ?? ''), partial })\n textIndex = -1\n }\n const closeThinking = (): void => {\n if (thinkingIndex === -1) return\n events.push({ type: 'thinking_end', contentIndex: thinkingIndex, content: String(content[thinkingIndex]?.thinking ?? ''), partial })\n thinkingIndex = -1\n }\n\n for await (const chunk of response) {\n const chunkUsage = chunk.usage as UnknownRecord | undefined\n if (chunkUsage !== undefined && chunkUsage !== null) {\n const input = Number(chunkUsage.prompt_tokens ?? 0)\n const output = Number(chunkUsage.completion_tokens ?? 0)\n usage = {\n input, output, cacheRead: 0, cacheWrite: 0,\n totalTokens: Number(chunkUsage.total_tokens ?? input + output),\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n }\n }\n const choice = (Array.isArray(chunk.choices) ? chunk.choices[0] : undefined) as UnknownRecord | undefined\n if (choice === undefined) continue\n const delta = (choice.delta ?? {}) as UnknownRecord\n\n for (const field of REASONING_FIELDS) {\n const value = delta[field]\n if (typeof value === 'string' && value.length > 0) {\n closeText()\n if (thinkingIndex === -1) {\n thinkingIndex = content.length\n content[thinkingIndex] = { type: 'thinking', thinking: '' }\n events.push({ type: 'thinking_start', contentIndex: thinkingIndex, partial })\n }\n const block = content[thinkingIndex] as PiContentBlock\n block.thinking = String(block.thinking ?? '') + value\n events.push({ type: 'thinking_delta', contentIndex: thinkingIndex, delta: value, partial })\n }\n }\n\n if (typeof delta.content === 'string' && delta.content.length > 0) {\n closeThinking()\n if (textIndex === -1) {\n textIndex = content.length\n content[textIndex] = { type: 'text', text: '' }\n events.push({ type: 'text_start', contentIndex: textIndex, partial })\n }\n const block = content[textIndex] as PiContentBlock\n block.text = String(block.text ?? '') + delta.content\n events.push({ type: 'text_delta', contentIndex: textIndex, delta: delta.content, partial })\n }\n\n if (Array.isArray(delta.tool_calls)) {\n closeText()\n closeThinking()\n for (const call of delta.tool_calls as UnknownRecord[]) {\n const position = Number(call.index ?? 0)\n let index = toolIndexByPosition.get(position)\n if (index === undefined) {\n index = content.length\n toolIndexByPosition.set(position, index)\n content[index] = { type: 'toolCall', id: '', name: '', arguments: undefined, partialJson: '' }\n events.push({ type: 'toolcall_start', contentIndex: index, partial })\n }\n const block = content[index] as PiContentBlock\n if (typeof call.id === 'string' && call.id.length > 0) block.id = call.id\n const fn = call.function as UnknownRecord | undefined\n if (typeof fn?.name === 'string' && fn.name.length > 0) block.name = String(block.name ?? '') + fn.name\n if (typeof fn?.arguments === 'string' && fn.arguments.length > 0) {\n block.partialJson = String(block.partialJson ?? '') + fn.arguments\n events.push({ type: 'toolcall_delta', contentIndex: index, delta: fn.arguments, partial })\n }\n }\n }\n\n if (typeof choice.finish_reason === 'string' && choice.finish_reason.length > 0) {\n stopReason = mapStopReason(choice.finish_reason)\n }\n }\n\n closeText()\n closeThinking()\n for (const index of toolIndexByPosition.values()) {\n const block = content[index] as PiContentBlock\n let parsed: unknown\n try { parsed = JSON.parse(String(block.partialJson ?? '') || '{}') } catch { parsed = {} }\n content[index] = { type: 'toolCall', id: String(block.id ?? ''), name: String(block.name ?? ''), arguments: parsed }\n events.push({ type: 'toolcall_end', contentIndex: index, toolCall: content[index], partial })\n }\n if (stopReason === undefined) throw new Error('stream ended without finish_reason')\n const message: UnknownRecord = {\n role: 'assistant',\n content: content.filter(block => block !== undefined),\n provider, model: modelId, api: 'openai-completions',\n ...(usage === undefined ? {} : { usage }),\n stopReason,\n timestamp: Date.now(),\n }\n events.push({ type: 'done', reason: stopReason, message })\n } catch (error) {\n const aborted = options.signal instanceof AbortSignal && options.signal.aborted\n events.push({\n type: 'error',\n reason: aborted ? 'aborted' : 'error',\n error: error instanceof Error ? error : new Error(String(error)),\n partial,\n })\n }\n })()\n\n return events\n}\n\n/** Pi's streamSimple for this api is the same call surface on the gateway slice. */\nexport const streamSimple = stream\n"],"mappings":"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"}
@@ -1,11 +0,0 @@
1
-
2
- function clampOpenAIPromptCacheKey(key) {
3
- if (key === void 0) return void 0;
4
- const chars = Array.from(key);
5
- if (chars.length <= 64) return key;
6
- return chars.slice(0, 64).join("");
7
- }
8
- //#endregion
9
- export { clampOpenAIPromptCacheKey as t };
10
-
11
- //# sourceMappingURL=openai-prompt-cache-BDWtZRKh.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-prompt-cache-BDWtZRKh.mjs","names":[],"sources":["../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js"],"sourcesContent":["export const OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH = 64;\nexport function clampOpenAIPromptCacheKey(key) {\n if (key === undefined)\n return undefined;\n const chars = Array.from(key);\n if (chars.length <= OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH)\n return key;\n return chars.slice(0, OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH).join(\"\");\n}\n//# sourceMappingURL=openai-prompt-cache.js.map"],"x_google_ignoreList":[0],"mappings":";AACA,SAAgB,0BAA0B,KAAK;CAC3C,IAAI,QAAQ,KAAA,GACR,OAAO,KAAA;CACX,MAAM,QAAQ,MAAM,KAAK,GAAG;CAC5B,IAAI,MAAM,UAAA,IACN,OAAO;CACX,OAAO,MAAM,MAAM,GAAA,EAAqC,CAAC,CAAC,KAAK,EAAE;AACrE"}