@osdk/aip-core 0.9.0 → 0.10.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 (32) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/build/browser/ai-sdk/convert-prompt.js.map +1 -1
  3. package/build/browser/ai-sdk/foundry-chat-language-model.js.map +1 -1
  4. package/build/browser/ai-sdk/map-finish-reason.js.map +1 -1
  5. package/build/browser/ai-sdk/provider.js.map +1 -1
  6. package/build/browser/generateText.js.map +1 -1
  7. package/build/browser/internal/__test__/mockPlatformClient.js.map +1 -1
  8. package/build/browser/internal/openAi.js.map +1 -1
  9. package/build/browser/internal/options.js.map +1 -1
  10. package/build/browser/internal/runStep.js.map +1 -1
  11. package/build/browser/internal/streamStep.js.map +1 -1
  12. package/build/browser/internal/uiMessageBridge.js.map +1 -1
  13. package/build/browser/lmsChatTransport.js.map +1 -1
  14. package/build/browser/model.js.map +1 -1
  15. package/build/browser/streamText.js.map +1 -1
  16. package/build/browser/uiMessage.js.map +1 -1
  17. package/build/esm/ai-sdk/convert-prompt.js.map +1 -1
  18. package/build/esm/ai-sdk/foundry-chat-language-model.js.map +1 -1
  19. package/build/esm/ai-sdk/map-finish-reason.js.map +1 -1
  20. package/build/esm/ai-sdk/provider.js.map +1 -1
  21. package/build/esm/generateText.js.map +1 -1
  22. package/build/esm/internal/__test__/mockPlatformClient.js.map +1 -1
  23. package/build/esm/internal/openAi.js.map +1 -1
  24. package/build/esm/internal/options.js.map +1 -1
  25. package/build/esm/internal/runStep.js.map +1 -1
  26. package/build/esm/internal/streamStep.js.map +1 -1
  27. package/build/esm/internal/uiMessageBridge.js.map +1 -1
  28. package/build/esm/lmsChatTransport.js.map +1 -1
  29. package/build/esm/model.js.map +1 -1
  30. package/build/esm/streamText.js.map +1 -1
  31. package/build/esm/uiMessage.js.map +1 -1
  32. package/package.json +7 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @osdk/aip-core
2
2
 
3
+ ## 0.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 8c18f55: `@osdk/aip-core` is now a direct dependency of `@osdk/react` and `@osdk/react-components` instead of an optional peer dependency, so consumers of `AipAgentChat` and `useChat` no longer have to install it themselves. For the same reason, `@osdk/aip-core` now depends on `@osdk/language-models` directly rather than declaring it as a peer.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [4ae6d8b]
12
+ - Updated dependencies [1aff7f4]
13
+ - @osdk/client@2.59.0
14
+
3
15
  ## 0.9.0
4
16
 
5
17
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"convert-prompt.js","names":["convertPrompt","prompt","warnings","messages","message","push","convertMessage","role","content","parts","part","type","text","feature","details","length","toolCalls","id","toolCallId","function","name","toolName","arguments","input","JSON","stringify","tool_calls","undefined","filter","map","stringifyToolResult","output","tool_call_id","value","reason","c","s","join"],"sources":["convert-prompt.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LanguageModelV3Message,\n LanguageModelV3Prompt,\n LanguageModelV3ToolResultOutput,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\n\nexport interface OpenAiMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | Array<{ type: \"text\"; text: string }> | null;\n tool_calls?: Array<OpenAiAssistantToolCall>;\n tool_call_id?: string;\n}\n\nexport interface OpenAiAssistantToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\nexport function convertPrompt(\n prompt: LanguageModelV3Prompt,\n warnings: Array<SharedV3Warning>\n): Array<OpenAiMessage> {\n const messages: Array<OpenAiMessage> = [];\n\n for (const message of prompt) {\n messages.push(...convertMessage(message, warnings));\n }\n\n return messages;\n}\n\nfunction convertMessage(\n message: LanguageModelV3Message,\n warnings: Array<SharedV3Warning>\n): Array<OpenAiMessage> {\n switch (message.role) {\n case \"system\":\n return [{ role: \"system\", content: message.content }];\n\n case \"user\": {\n const parts: Array<{ type: \"text\"; text: string }> = [];\n for (const part of message.content) {\n switch (part.type) {\n case \"text\":\n parts.push({ type: \"text\", text: part.text });\n break;\n case \"file\":\n warnings.push({\n type: \"unsupported\",\n feature: \"user file content\",\n details:\n \"File content in user messages is not supported in v0 — ignored\",\n });\n break;\n }\n }\n if (parts.length === 0) {\n parts.push({ type: \"text\", text: \"\" });\n }\n return [{ role: \"user\", content: parts }];\n }\n\n case \"assistant\": {\n let text = \"\";\n const toolCalls: Array<OpenAiAssistantToolCall> = [];\n for (const part of message.content) {\n switch (part.type) {\n case \"text\":\n text += part.text;\n break;\n case \"tool-call\":\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments:\n typeof part.input === \"string\"\n ? part.input\n : JSON.stringify(part.input ?? {}),\n },\n });\n break;\n case \"reasoning\":\n case \"file\":\n case \"tool-result\":\n warnings.push({\n type: \"unsupported\",\n feature: `assistant ${part.type} content`,\n details: `\"${part.type}\" parts in assistant messages are not supported in v0 — ignored`,\n });\n break;\n }\n }\n return [\n {\n role: \"assistant\",\n content: text.length > 0 ? text : null,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n },\n ];\n }\n\n case \"tool\":\n return message.content\n .filter(\n (part): part is Extract<typeof part, { type: \"tool-result\" }> => {\n if (part.type === \"tool-result\") return true;\n warnings.push({\n type: \"unsupported\",\n feature: `tool ${part.type} content`,\n details: `\"${part.type}\" parts in tool messages are not supported in v0 — ignored`,\n });\n return false;\n }\n )\n .map((part) => ({\n role: \"tool\" as const,\n content: stringifyToolResult(part.output, warnings),\n tool_call_id: part.toolCallId,\n }));\n }\n}\n\nfunction stringifyToolResult(\n output: LanguageModelV3ToolResultOutput,\n warnings: Array<SharedV3Warning>\n): string {\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n return output.value;\n case \"json\":\n case \"error-json\":\n return JSON.stringify(output.value);\n case \"execution-denied\":\n return output.reason ?? \"Tool execution denied\";\n case \"content\":\n return output.value\n .map((c) => {\n if (c.type === \"text\") return c.text;\n warnings.push({\n type: \"unsupported\",\n feature: \"tool result media content\",\n details:\n \"Non-text tool result content is not supported in v0 — ignored\",\n });\n return \"\";\n })\n .filter((s) => s.length > 0)\n .join(\"\\n\");\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"convert-prompt.js","names":["convertPrompt","prompt","warnings","messages","message","push","convertMessage","role","content","parts","part","type","text","feature","details","length","toolCalls","id","toolCallId","function","name","toolName","arguments","input","JSON","stringify","tool_calls","undefined","filter","map","stringifyToolResult","output","tool_call_id","value","reason","c","s","join"],"sources":["convert-prompt.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LanguageModelV3Message,\n LanguageModelV3Prompt,\n LanguageModelV3ToolResultOutput,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\n\nexport interface OpenAiMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | Array<{ type: \"text\"; text: string }> | null;\n tool_calls?: Array<OpenAiAssistantToolCall>;\n tool_call_id?: string;\n}\n\nexport interface OpenAiAssistantToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\nexport function convertPrompt(\n prompt: LanguageModelV3Prompt,\n warnings: Array<SharedV3Warning>,\n): Array<OpenAiMessage> {\n const messages: Array<OpenAiMessage> = [];\n\n for (const message of prompt) {\n messages.push(...convertMessage(message, warnings));\n }\n\n return messages;\n}\n\nfunction convertMessage(\n message: LanguageModelV3Message,\n warnings: Array<SharedV3Warning>,\n): Array<OpenAiMessage> {\n switch (message.role) {\n case \"system\":\n return [{ role: \"system\", content: message.content }];\n\n case \"user\": {\n const parts: Array<{ type: \"text\"; text: string }> = [];\n for (const part of message.content) {\n switch (part.type) {\n case \"text\":\n parts.push({ type: \"text\", text: part.text });\n break;\n case \"file\":\n warnings.push({\n type: \"unsupported\",\n feature: \"user file content\",\n details:\n \"File content in user messages is not supported in v0 — ignored\",\n });\n break;\n }\n }\n if (parts.length === 0) {\n parts.push({ type: \"text\", text: \"\" });\n }\n return [{ role: \"user\", content: parts }];\n }\n\n case \"assistant\": {\n let text = \"\";\n const toolCalls: Array<OpenAiAssistantToolCall> = [];\n for (const part of message.content) {\n switch (part.type) {\n case \"text\":\n text += part.text;\n break;\n case \"tool-call\":\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments:\n typeof part.input === \"string\"\n ? part.input\n : JSON.stringify(part.input ?? {}),\n },\n });\n break;\n case \"reasoning\":\n case \"file\":\n case \"tool-result\":\n warnings.push({\n type: \"unsupported\",\n feature: `assistant ${part.type} content`,\n details: `\"${part.type}\" parts in assistant messages are not supported in v0 — ignored`,\n });\n break;\n }\n }\n return [\n {\n role: \"assistant\",\n content: text.length > 0 ? text : null,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n },\n ];\n }\n\n case \"tool\":\n return message.content\n .filter(\n (part): part is Extract<typeof part, { type: \"tool-result\" }> => {\n if (part.type === \"tool-result\") return true;\n warnings.push({\n type: \"unsupported\",\n feature: `tool ${part.type} content`,\n details: `\"${part.type}\" parts in tool messages are not supported in v0 — ignored`,\n });\n return false;\n },\n )\n .map((part) => ({\n role: \"tool\" as const,\n content: stringifyToolResult(part.output, warnings),\n tool_call_id: part.toolCallId,\n }));\n }\n}\n\nfunction stringifyToolResult(\n output: LanguageModelV3ToolResultOutput,\n warnings: Array<SharedV3Warning>,\n): string {\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n return output.value;\n case \"json\":\n case \"error-json\":\n return JSON.stringify(output.value);\n case \"execution-denied\":\n return output.reason ?? \"Tool execution denied\";\n case \"content\":\n return output.value\n .map((c) => {\n if (c.type === \"text\") return c.text;\n warnings.push({\n type: \"unsupported\",\n feature: \"tool result media content\",\n details:\n \"Non-text tool result content is not supported in v0 — ignored\",\n });\n return \"\";\n })\n .filter((s) => s.length > 0)\n .join(\"\\n\");\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"foundry-chat-language-model.js","names":["getOpenAiBaseUrl","convertPrompt","mapFinishReason","FoundryChatLanguageModel","specificationVersion","supportedUrls","constructor","modelId","config","provider","doGenerate","options","warnings","body","url","buildRequest","res","client","fetch","method","headers","filterHeaders","Accept","JSON","stringify","signal","abortSignal","ok","errBody","safeReadText","Error","status","statusText","data","json","parseGenerateResponse","doStream","stream","parseStreamResponse","request","baseUrl","URL","toString","apiName","identifier","type","registeredModelRid","messages","prompt","tools","filter","t","push","feature","details","map","function","name","description","parameters","inputSchema","toolChoice","convertToolChoice","topK","responseFormat","model","max_tokens","maxOutputTokens","temperature","top_p","topP","stop","stopSequences","seed","presence_penalty","presencePenalty","frequency_penalty","frequencyPenalty","length","undefined","tool_choice","choice","choices","message","content","text","reasoningText","reasoning","reasoning_content","tool_calls","tc","toolCallId","id","toolName","input","arguments","finishReason","finish_reason","usage","mapUsage","response","timestamp","Date","created","reader","getReader","decoder","TextDecoder","buffer","sentStart","textId","textStarted","toolInputStarted","Set","ReadableStream","pull","controller","done","value","read","enqueue","close","decode","lines","split","pop","line","trimmed","trim","startsWith","slice","chunk","parse","delta","index","has","add","cancel","inputTokens","total","prompt_tokens","noCache","cacheRead","prompt_tokens_details","cached_tokens","cacheWrite","outputTokens","completion_tokens","completion_tokens_details","reasoning_tokens","out","k","v","Object","entries"],"sources":["foundry-chat-language-model.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n LanguageModelV3ToolChoice,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { PlatformClient } from \"@osdk/client\";\nimport { getOpenAiBaseUrl } from \"@osdk/language-models\";\n\nimport type { OpenAiAssistantToolCall } from \"./convert-prompt.js\";\nimport { convertPrompt } from \"./convert-prompt.js\";\nimport { mapFinishReason } from \"./map-finish-reason.js\";\nimport type { ModelIdentifier } from \"./types.js\";\n\nexport interface FoundryChatLanguageModelConfig {\n client: PlatformClient;\n identifier: ModelIdentifier;\n}\n\nexport class FoundryChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\";\n readonly provider: string;\n readonly modelId: string;\n readonly supportedUrls: Record<string, RegExp[]> = {};\n\n private readonly config: FoundryChatLanguageModelConfig;\n\n constructor(modelId: string, config: FoundryChatLanguageModelConfig) {\n this.provider = \"foundry-lms\";\n this.modelId = modelId;\n this.config = config;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3GenerateResult> {\n const warnings: Array<SharedV3Warning> = [];\n const { body, url } = this.buildRequest(options, warnings);\n\n const res = await this.config.client.fetch(url, {\n method: \"POST\",\n headers: filterHeaders({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(options.headers ?? {}),\n }),\n body: JSON.stringify(body),\n signal: options.abortSignal,\n });\n\n if (!res.ok) {\n const errBody = await safeReadText(res);\n throw new Error(\n `LMS chat/completions request failed: ${res.status} ${res.statusText}` +\n (errBody ? ` — ${errBody}` : \"\")\n );\n }\n\n const data = (await res.json()) as OpenAiChatCompletionResponse;\n return this.parseGenerateResponse(data, body, warnings);\n }\n\n async doStream(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3StreamResult> {\n const warnings: Array<SharedV3Warning> = [];\n const { body, url } = this.buildRequest(options, warnings);\n body.stream = true;\n\n const res = await this.config.client.fetch(url, {\n method: \"POST\",\n headers: filterHeaders({\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...(options.headers ?? {}),\n }),\n body: JSON.stringify(body),\n signal: options.abortSignal,\n });\n\n if (!res.ok) {\n const errBody = await safeReadText(res);\n throw new Error(\n `LMS chat/completions request failed: ${res.status} ${res.statusText}` +\n (errBody ? ` — ${errBody}` : \"\")\n );\n }\n\n const stream = this.parseStreamResponse(res, body, warnings);\n\n return {\n stream,\n request: { body },\n };\n }\n\n private buildRequest(\n options: LanguageModelV3CallOptions,\n warnings: Array<SharedV3Warning>\n ): { body: OpenAiChatRequest; url: string } {\n const baseUrl = getOpenAiBaseUrl(this.config.client);\n const url = new URL(\"chat/completions\", `${baseUrl}/`).toString();\n const apiName =\n this.config.identifier.type === \"lmsModel\"\n ? this.config.identifier.apiName\n : this.config.identifier.registeredModelRid;\n\n const messages = convertPrompt(options.prompt, warnings);\n\n const tools = options.tools\n ?.filter((t): t is LanguageModelV3FunctionTool => {\n if (t.type === \"function\") return true;\n warnings.push({\n type: \"unsupported\",\n feature: `${t.type} tool type`,\n details: `Only \"function\" tools are supported; \"${t.type}\" tools are ignored`,\n });\n return false;\n })\n .map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n\n const toolChoice = convertToolChoice(options.toolChoice);\n\n if (options.topK != null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"topK\",\n details:\n \"topK is not supported by the Foundry LMS OpenAI proxy — ignored\",\n });\n }\n\n if (options.responseFormat?.type === \"json\") {\n warnings.push({\n type: \"unsupported\",\n feature: \"JSON response format\",\n details: \"Structured JSON output is not supported in v0 — ignored\",\n });\n }\n\n const body: OpenAiChatRequest = {\n model: apiName,\n messages,\n max_tokens: options.maxOutputTokens,\n temperature: options.temperature,\n top_p: options.topP,\n stop: options.stopSequences,\n seed: options.seed,\n presence_penalty: options.presencePenalty,\n frequency_penalty: options.frequencyPenalty,\n tools: tools != null && tools.length > 0 ? tools : undefined,\n tool_choice: toolChoice,\n stream: false,\n };\n\n return { body, url };\n }\n\n private parseGenerateResponse(\n res: OpenAiChatCompletionResponse,\n request: OpenAiChatRequest,\n warnings: Array<SharedV3Warning>\n ): LanguageModelV3GenerateResult {\n const choice = res.choices[0];\n if (choice == null) {\n throw new Error(\n \"LMS chat/completions response did not include any choices\"\n );\n }\n\n const message = choice.message;\n const content: Array<LanguageModelV3Content> = [];\n\n if (message.content != null && message.content.length > 0) {\n content.push({ type: \"text\", text: message.content });\n }\n\n const reasoningText = message.reasoning ?? message.reasoning_content;\n if (reasoningText != null) {\n content.push({ type: \"reasoning\", text: reasoningText });\n }\n\n if (message.tool_calls != null) {\n for (const tc of message.tool_calls) {\n content.push({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: tc.function.arguments,\n });\n }\n }\n\n return {\n content,\n finishReason: mapFinishReason(choice.finish_reason),\n usage: mapUsage(res.usage),\n request: { body: request },\n response: {\n id: res.id,\n modelId: res.model,\n timestamp: new Date(res.created * 1000),\n body: res,\n },\n warnings,\n };\n }\n\n private parseStreamResponse(\n res: Response,\n request: OpenAiChatRequest,\n warnings: Array<SharedV3Warning>\n ): ReadableStream<LanguageModelV3StreamPart> {\n const body = res.body;\n if (body == null) {\n throw new Error(\"LMS streaming response has no body\");\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let sentStart = false;\n const textId = \"text-0\";\n let textStarted = false;\n const toolInputStarted = new Set<string>();\n\n return new ReadableStream<LanguageModelV3StreamPart>({\n pull: async (controller) => {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (textStarted) {\n controller.enqueue({ type: \"text-end\", id: textId });\n }\n controller.close();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data:\")) continue;\n const data = trimmed.slice(5).trim();\n if (data === \"[DONE]\") {\n if (textStarted) {\n controller.enqueue({ type: \"text-end\", id: textId });\n }\n controller.close();\n return;\n }\n\n let chunk: OpenAiStreamChunk;\n try {\n chunk = JSON.parse(data);\n } catch {\n continue;\n }\n\n if (!sentStart) {\n sentStart = true;\n controller.enqueue({ type: \"stream-start\", warnings });\n controller.enqueue({\n type: \"response-metadata\",\n id: chunk.id,\n modelId: chunk.model,\n timestamp: new Date(chunk.created * 1000),\n });\n }\n\n const delta = chunk.choices?.[0]?.delta;\n if (delta == null) {\n if (chunk.usage != null) {\n controller.enqueue({\n type: \"finish\",\n usage: mapUsage(chunk.usage),\n finishReason: mapFinishReason(\n chunk.choices?.[0]?.finish_reason ?? undefined\n ),\n });\n }\n continue;\n }\n\n if (delta.content != null && delta.content.length > 0) {\n if (!textStarted) {\n textStarted = true;\n controller.enqueue({ type: \"text-start\", id: textId });\n }\n controller.enqueue({\n type: \"text-delta\",\n id: textId,\n delta: delta.content,\n });\n }\n\n if (delta.tool_calls != null) {\n for (const tc of delta.tool_calls) {\n const id = tc.id ?? `tool-${tc.index}`;\n if (tc.function?.name != null && !toolInputStarted.has(id)) {\n if (textStarted) {\n textStarted = false;\n controller.enqueue({ type: \"text-end\", id: textId });\n }\n toolInputStarted.add(id);\n controller.enqueue({\n type: \"tool-input-start\",\n id,\n toolName: tc.function.name,\n });\n }\n if (tc.function?.arguments != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id,\n delta: tc.function.arguments,\n });\n }\n }\n }\n\n const finishReason = chunk.choices?.[0]?.finish_reason;\n if (finishReason != null) {\n if (textStarted) {\n textStarted = false;\n controller.enqueue({ type: \"text-end\", id: textId });\n }\n for (const id of toolInputStarted) {\n controller.enqueue({ type: \"tool-input-end\", id });\n }\n controller.enqueue({\n type: \"finish\",\n usage: mapUsage(chunk.usage),\n finishReason: mapFinishReason(finishReason),\n });\n }\n }\n }\n },\n cancel: () => {\n void reader.cancel();\n },\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// OpenAI types\n// ---------------------------------------------------------------------------\n\ninterface OpenAiChatRequest {\n model: string;\n messages: Array<unknown>;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n stop?: string[];\n seed?: number;\n presence_penalty?: number;\n frequency_penalty?: number;\n tools?: Array<{\n type: \"function\";\n function: { name: string; description?: string; parameters: unknown };\n }>;\n tool_choice?: OpenAiToolChoiceValue;\n stream: boolean;\n}\n\ntype OpenAiToolChoiceValue =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\ninterface OpenAiChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<OpenAiAssistantToolCall>;\n reasoning?: string;\n reasoning_content?: string;\n };\n finish_reason: string;\n }>;\n usage?: OpenAiUsage;\n}\n\ninterface OpenAiStreamChunk {\n id: string;\n object: string;\n created: number;\n model: string;\n choices?: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: \"function\";\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason: string | null;\n }>;\n usage?: OpenAiUsage;\n}\n\ninterface OpenAiUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction convertToolChoice(\n choice: LanguageModelV3ToolChoice | undefined\n): OpenAiToolChoiceValue | undefined {\n if (choice == null) return undefined;\n switch (choice.type) {\n case \"auto\":\n return \"auto\";\n case \"none\":\n return \"none\";\n case \"required\":\n return \"required\";\n case \"tool\":\n return { type: \"function\", function: { name: choice.toolName } };\n }\n}\n\nfunction mapUsage(usage: OpenAiUsage | undefined): LanguageModelV3Usage {\n return {\n inputTokens: {\n total: usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: usage?.prompt_tokens_details?.cached_tokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage?.completion_tokens,\n text: undefined,\n reasoning: usage?.completion_tokens_details?.reasoning_tokens,\n },\n };\n}\n\nfunction filterHeaders(\n input: Record<string, string | undefined>\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(input)) {\n if (v != null) out[k] = v;\n }\n return out;\n}\n\nasync function safeReadText(res: Response): Promise<string | undefined> {\n try {\n return await res.text();\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"foundry-chat-language-model.js","names":["getOpenAiBaseUrl","convertPrompt","mapFinishReason","FoundryChatLanguageModel","specificationVersion","supportedUrls","constructor","modelId","config","provider","doGenerate","options","warnings","body","url","buildRequest","res","client","fetch","method","headers","filterHeaders","Accept","JSON","stringify","signal","abortSignal","ok","errBody","safeReadText","Error","status","statusText","data","json","parseGenerateResponse","doStream","stream","parseStreamResponse","request","baseUrl","URL","toString","apiName","identifier","type","registeredModelRid","messages","prompt","tools","filter","t","push","feature","details","map","function","name","description","parameters","inputSchema","toolChoice","convertToolChoice","topK","responseFormat","model","max_tokens","maxOutputTokens","temperature","top_p","topP","stop","stopSequences","seed","presence_penalty","presencePenalty","frequency_penalty","frequencyPenalty","length","undefined","tool_choice","choice","choices","message","content","text","reasoningText","reasoning","reasoning_content","tool_calls","tc","toolCallId","id","toolName","input","arguments","finishReason","finish_reason","usage","mapUsage","response","timestamp","Date","created","reader","getReader","decoder","TextDecoder","buffer","sentStart","textId","textStarted","toolInputStarted","Set","ReadableStream","pull","controller","done","value","read","enqueue","close","decode","lines","split","pop","line","trimmed","trim","startsWith","slice","chunk","parse","delta","index","has","add","cancel","inputTokens","total","prompt_tokens","noCache","cacheRead","prompt_tokens_details","cached_tokens","cacheWrite","outputTokens","completion_tokens","completion_tokens_details","reasoning_tokens","out","k","v","Object","entries"],"sources":["foundry-chat-language-model.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n LanguageModelV3ToolChoice,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { PlatformClient } from \"@osdk/client\";\nimport { getOpenAiBaseUrl } from \"@osdk/language-models\";\n\nimport type { OpenAiAssistantToolCall } from \"./convert-prompt.js\";\nimport { convertPrompt } from \"./convert-prompt.js\";\nimport { mapFinishReason } from \"./map-finish-reason.js\";\nimport type { ModelIdentifier } from \"./types.js\";\n\nexport interface FoundryChatLanguageModelConfig {\n client: PlatformClient;\n identifier: ModelIdentifier;\n}\n\nexport class FoundryChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\";\n readonly provider: string;\n readonly modelId: string;\n readonly supportedUrls: Record<string, RegExp[]> = {};\n\n private readonly config: FoundryChatLanguageModelConfig;\n\n constructor(modelId: string, config: FoundryChatLanguageModelConfig) {\n this.provider = \"foundry-lms\";\n this.modelId = modelId;\n this.config = config;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const warnings: Array<SharedV3Warning> = [];\n const { body, url } = this.buildRequest(options, warnings);\n\n const res = await this.config.client.fetch(url, {\n method: \"POST\",\n headers: filterHeaders({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(options.headers ?? {}),\n }),\n body: JSON.stringify(body),\n signal: options.abortSignal,\n });\n\n if (!res.ok) {\n const errBody = await safeReadText(res);\n throw new Error(\n `LMS chat/completions request failed: ${res.status} ${res.statusText}` +\n (errBody ? ` — ${errBody}` : \"\"),\n );\n }\n\n const data = (await res.json()) as OpenAiChatCompletionResponse;\n return this.parseGenerateResponse(data, body, warnings);\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const warnings: Array<SharedV3Warning> = [];\n const { body, url } = this.buildRequest(options, warnings);\n body.stream = true;\n\n const res = await this.config.client.fetch(url, {\n method: \"POST\",\n headers: filterHeaders({\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...(options.headers ?? {}),\n }),\n body: JSON.stringify(body),\n signal: options.abortSignal,\n });\n\n if (!res.ok) {\n const errBody = await safeReadText(res);\n throw new Error(\n `LMS chat/completions request failed: ${res.status} ${res.statusText}` +\n (errBody ? ` — ${errBody}` : \"\"),\n );\n }\n\n const stream = this.parseStreamResponse(res, body, warnings);\n\n return {\n stream,\n request: { body },\n };\n }\n\n private buildRequest(\n options: LanguageModelV3CallOptions,\n warnings: Array<SharedV3Warning>,\n ): { body: OpenAiChatRequest; url: string } {\n const baseUrl = getOpenAiBaseUrl(this.config.client);\n const url = new URL(\"chat/completions\", `${baseUrl}/`).toString();\n const apiName =\n this.config.identifier.type === \"lmsModel\"\n ? this.config.identifier.apiName\n : this.config.identifier.registeredModelRid;\n\n const messages = convertPrompt(options.prompt, warnings);\n\n const tools = options.tools\n ?.filter((t): t is LanguageModelV3FunctionTool => {\n if (t.type === \"function\") return true;\n warnings.push({\n type: \"unsupported\",\n feature: `${t.type} tool type`,\n details: `Only \"function\" tools are supported; \"${t.type}\" tools are ignored`,\n });\n return false;\n })\n .map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n\n const toolChoice = convertToolChoice(options.toolChoice);\n\n if (options.topK != null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"topK\",\n details:\n \"topK is not supported by the Foundry LMS OpenAI proxy — ignored\",\n });\n }\n\n if (options.responseFormat?.type === \"json\") {\n warnings.push({\n type: \"unsupported\",\n feature: \"JSON response format\",\n details: \"Structured JSON output is not supported in v0 — ignored\",\n });\n }\n\n const body: OpenAiChatRequest = {\n model: apiName,\n messages,\n max_tokens: options.maxOutputTokens,\n temperature: options.temperature,\n top_p: options.topP,\n stop: options.stopSequences,\n seed: options.seed,\n presence_penalty: options.presencePenalty,\n frequency_penalty: options.frequencyPenalty,\n tools: tools != null && tools.length > 0 ? tools : undefined,\n tool_choice: toolChoice,\n stream: false,\n };\n\n return { body, url };\n }\n\n private parseGenerateResponse(\n res: OpenAiChatCompletionResponse,\n request: OpenAiChatRequest,\n warnings: Array<SharedV3Warning>,\n ): LanguageModelV3GenerateResult {\n const choice = res.choices[0];\n if (choice == null) {\n throw new Error(\n \"LMS chat/completions response did not include any choices\",\n );\n }\n\n const message = choice.message;\n const content: Array<LanguageModelV3Content> = [];\n\n if (message.content != null && message.content.length > 0) {\n content.push({ type: \"text\", text: message.content });\n }\n\n const reasoningText = message.reasoning ?? message.reasoning_content;\n if (reasoningText != null) {\n content.push({ type: \"reasoning\", text: reasoningText });\n }\n\n if (message.tool_calls != null) {\n for (const tc of message.tool_calls) {\n content.push({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: tc.function.arguments,\n });\n }\n }\n\n return {\n content,\n finishReason: mapFinishReason(choice.finish_reason),\n usage: mapUsage(res.usage),\n request: { body: request },\n response: {\n id: res.id,\n modelId: res.model,\n timestamp: new Date(res.created * 1000),\n body: res,\n },\n warnings,\n };\n }\n\n private parseStreamResponse(\n res: Response,\n request: OpenAiChatRequest,\n warnings: Array<SharedV3Warning>,\n ): ReadableStream<LanguageModelV3StreamPart> {\n const body = res.body;\n if (body == null) {\n throw new Error(\"LMS streaming response has no body\");\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let sentStart = false;\n const textId = \"text-0\";\n let textStarted = false;\n const toolInputStarted = new Set<string>();\n\n return new ReadableStream<LanguageModelV3StreamPart>({\n pull: async (controller) => {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (textStarted) {\n controller.enqueue({ type: \"text-end\", id: textId });\n }\n controller.close();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data:\")) continue;\n const data = trimmed.slice(5).trim();\n if (data === \"[DONE]\") {\n if (textStarted) {\n controller.enqueue({ type: \"text-end\", id: textId });\n }\n controller.close();\n return;\n }\n\n let chunk: OpenAiStreamChunk;\n try {\n chunk = JSON.parse(data);\n } catch {\n continue;\n }\n\n if (!sentStart) {\n sentStart = true;\n controller.enqueue({ type: \"stream-start\", warnings });\n controller.enqueue({\n type: \"response-metadata\",\n id: chunk.id,\n modelId: chunk.model,\n timestamp: new Date(chunk.created * 1000),\n });\n }\n\n const delta = chunk.choices?.[0]?.delta;\n if (delta == null) {\n if (chunk.usage != null) {\n controller.enqueue({\n type: \"finish\",\n usage: mapUsage(chunk.usage),\n finishReason: mapFinishReason(\n chunk.choices?.[0]?.finish_reason ?? undefined,\n ),\n });\n }\n continue;\n }\n\n if (delta.content != null && delta.content.length > 0) {\n if (!textStarted) {\n textStarted = true;\n controller.enqueue({ type: \"text-start\", id: textId });\n }\n controller.enqueue({\n type: \"text-delta\",\n id: textId,\n delta: delta.content,\n });\n }\n\n if (delta.tool_calls != null) {\n for (const tc of delta.tool_calls) {\n const id = tc.id ?? `tool-${tc.index}`;\n if (tc.function?.name != null && !toolInputStarted.has(id)) {\n if (textStarted) {\n textStarted = false;\n controller.enqueue({ type: \"text-end\", id: textId });\n }\n toolInputStarted.add(id);\n controller.enqueue({\n type: \"tool-input-start\",\n id,\n toolName: tc.function.name,\n });\n }\n if (tc.function?.arguments != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id,\n delta: tc.function.arguments,\n });\n }\n }\n }\n\n const finishReason = chunk.choices?.[0]?.finish_reason;\n if (finishReason != null) {\n if (textStarted) {\n textStarted = false;\n controller.enqueue({ type: \"text-end\", id: textId });\n }\n for (const id of toolInputStarted) {\n controller.enqueue({ type: \"tool-input-end\", id });\n }\n controller.enqueue({\n type: \"finish\",\n usage: mapUsage(chunk.usage),\n finishReason: mapFinishReason(finishReason),\n });\n }\n }\n }\n },\n cancel: () => {\n void reader.cancel();\n },\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// OpenAI types\n// ---------------------------------------------------------------------------\n\ninterface OpenAiChatRequest {\n model: string;\n messages: Array<unknown>;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n stop?: string[];\n seed?: number;\n presence_penalty?: number;\n frequency_penalty?: number;\n tools?: Array<{\n type: \"function\";\n function: { name: string; description?: string; parameters: unknown };\n }>;\n tool_choice?: OpenAiToolChoiceValue;\n stream: boolean;\n}\n\ntype OpenAiToolChoiceValue =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\ninterface OpenAiChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<OpenAiAssistantToolCall>;\n reasoning?: string;\n reasoning_content?: string;\n };\n finish_reason: string;\n }>;\n usage?: OpenAiUsage;\n}\n\ninterface OpenAiStreamChunk {\n id: string;\n object: string;\n created: number;\n model: string;\n choices?: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: \"function\";\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason: string | null;\n }>;\n usage?: OpenAiUsage;\n}\n\ninterface OpenAiUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction convertToolChoice(\n choice: LanguageModelV3ToolChoice | undefined,\n): OpenAiToolChoiceValue | undefined {\n if (choice == null) return undefined;\n switch (choice.type) {\n case \"auto\":\n return \"auto\";\n case \"none\":\n return \"none\";\n case \"required\":\n return \"required\";\n case \"tool\":\n return { type: \"function\", function: { name: choice.toolName } };\n }\n}\n\nfunction mapUsage(usage: OpenAiUsage | undefined): LanguageModelV3Usage {\n return {\n inputTokens: {\n total: usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: usage?.prompt_tokens_details?.cached_tokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage?.completion_tokens,\n text: undefined,\n reasoning: usage?.completion_tokens_details?.reasoning_tokens,\n },\n };\n}\n\nfunction filterHeaders(\n input: Record<string, string | undefined>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(input)) {\n if (v != null) out[k] = v;\n }\n return out;\n}\n\nasync function safeReadText(res: Response): Promise<string | undefined> {\n try {\n return await res.text();\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"map-finish-reason.js","names":["mapFinishReason","raw","unified"],"sources":["map-finish-reason.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LanguageModelV3FinishReason } from \"@ai-sdk/provider\";\n\nexport function mapFinishReason(\n raw: string | undefined\n): LanguageModelV3FinishReason {\n let unified: LanguageModelV3FinishReason[\"unified\"];\n switch (raw) {\n case \"stop\":\n unified = \"stop\";\n break;\n case \"length\":\n unified = \"length\";\n break;\n case \"tool_calls\":\n case \"function_call\":\n unified = \"tool-calls\";\n break;\n case \"content_filter\":\n unified = \"content-filter\";\n break;\n default:\n unified = \"other\";\n break;\n }\n return { unified, raw };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAO,SAASA,eAAeA,CAC7BC,GAAuB,EACM;EAC7B,IAAIC,OAA+C;EACnD,QAAQD,GAAG;IACT,KAAK,MAAM;MACTC,OAAO,GAAG,MAAM;MAChB;IACF,KAAK,QAAQ;MACXA,OAAO,GAAG,QAAQ;MAClB;IACF,KAAK,YAAY;IACjB,KAAK,eAAe;MAClBA,OAAO,GAAG,YAAY;MACtB;IACF,KAAK,gBAAgB;MACnBA,OAAO,GAAG,gBAAgB;MAC1B;IACF;MACEA,OAAO,GAAG,OAAO;MACjB;EACJ;EACA,OAAO;IAAEA,OAAO;IAAED;EAAI,CAAC;AACzB","ignoreList":[]}
1
+ {"version":3,"file":"map-finish-reason.js","names":["mapFinishReason","raw","unified"],"sources":["map-finish-reason.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LanguageModelV3FinishReason } from \"@ai-sdk/provider\";\n\nexport function mapFinishReason(\n raw: string | undefined,\n): LanguageModelV3FinishReason {\n let unified: LanguageModelV3FinishReason[\"unified\"];\n switch (raw) {\n case \"stop\":\n unified = \"stop\";\n break;\n case \"length\":\n unified = \"length\";\n break;\n case \"tool_calls\":\n case \"function_call\":\n unified = \"tool-calls\";\n break;\n case \"content_filter\":\n unified = \"content-filter\";\n break;\n default:\n unified = \"other\";\n break;\n }\n return { unified, raw };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAO,SAASA,eAAeA,CAC7BC,GAAuB,EACM;EAC7B,IAAIC,OAA+C;EACnD,QAAQD,GAAG;IACT,KAAK,MAAM;MACTC,OAAO,GAAG,MAAM;MAChB;IACF,KAAK,QAAQ;MACXA,OAAO,GAAG,QAAQ;MAClB;IACF,KAAK,YAAY;IACjB,KAAK,eAAe;MAClBA,OAAO,GAAG,YAAY;MACtB;IACF,KAAK,gBAAgB;MACnBA,OAAO,GAAG,gBAAgB;MAC1B;IACF;MACEA,OAAO,GAAG,OAAO;MACjB;EACJ;EACA,OAAO;IAAEA,OAAO;IAAED;EAAI,CAAC;AACzB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","names":["FoundryChatLanguageModel","createFoundryAI","options","createLanguageModel","model","identifier","type","apiName","id","registeredModelRid","client","provider","languageModel"],"sources":["provider.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport type { PlatformClient } from \"@osdk/client\";\n\nimport { FoundryChatLanguageModel } from \"./foundry-chat-language-model.js\";\nimport type { ModelIdentifier } from \"./types.js\";\n\nexport interface FoundryAIProviderOptions {\n /** Foundry PlatformClient providing the auth token + base URL. */\n client: PlatformClient;\n}\n\n/**\n * A Foundry AI provider for the AI SDK.\n *\n * Can be called directly as a function to get a language model, or use\n * the `.languageModel()` method.\n *\n * @example\n * ```ts\n * import { generateText } from \"ai\";\n * import { createFoundryAI } from \"@osdk/aip-core/ai-sdk\";\n *\n * const foundryAI = createFoundryAI({ client });\n * const { text } = await generateText({\n * model: foundryAI(\"gpt-4o\"),\n * prompt: \"Hello, world\",\n * });\n * ```\n */\nexport interface FoundryAIProvider {\n /**\n * Create a language model for the given model name or identifier.\n *\n * @param model - LMS model API name (e.g. \"gpt-4o\") or a structured ModelIdentifier.\n */\n (model: string | ModelIdentifier): LanguageModelV3;\n\n /**\n * Create a language model for the given model name or identifier.\n *\n * @param model - LMS model API name (e.g. \"gpt-4o\") or a structured ModelIdentifier.\n */\n languageModel(model: string | ModelIdentifier): LanguageModelV3;\n}\n\n/**\n * Create a Foundry AI provider for the AI SDK.\n *\n * @param options - Configuration including the Foundry PlatformClient.\n * @returns A provider that can be called directly or via `.languageModel()`.\n */\nexport function createFoundryAI(\n options: FoundryAIProviderOptions\n): FoundryAIProvider {\n const createLanguageModel = (\n model: string | ModelIdentifier\n ): LanguageModelV3 => {\n const identifier: ModelIdentifier =\n typeof model === \"string\" ? { type: \"lmsModel\", apiName: model } : model;\n\n const id =\n identifier.type === \"lmsModel\"\n ? identifier.apiName\n : identifier.registeredModelRid;\n\n return new FoundryChatLanguageModel(`foundry/${id}`, {\n client: options.client,\n identifier,\n });\n };\n\n const provider = function (model: string | ModelIdentifier): LanguageModelV3 {\n return createLanguageModel(model);\n };\n\n provider.languageModel = createLanguageModel;\n\n return provider as FoundryAIProvider;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,SAASA,wBAAwB,QAAQ,kCAAkC;;AAQ3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAiBA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAC7BC,OAAiC,EACd;EACnB,MAAMC,mBAAmB,GACvBC,KAA+B,IACX;IACpB,MAAMC,UAA2B,GAC/B,OAAOD,KAAK,KAAK,QAAQ,GAAG;MAAEE,IAAI,EAAE,UAAU;MAAEC,OAAO,EAAEH;IAAM,CAAC,GAAGA,KAAK;IAE1E,MAAMI,EAAE,GACNH,UAAU,CAACC,IAAI,KAAK,UAAU,GAC1BD,UAAU,CAACE,OAAO,GAClBF,UAAU,CAACI,kBAAkB;IAEnC,OAAO,IAAIT,wBAAwB,CAAC,WAAWQ,EAAE,EAAE,EAAE;MACnDE,MAAM,EAAER,OAAO,CAACQ,MAAM;MACtBL;IACF,CAAC,CAAC;EACJ,CAAC;EAED,MAAMM,QAAQ,GAAG,SAAAA,CAAUP,KAA+B,EAAmB;IAC3E,OAAOD,mBAAmB,CAACC,KAAK,CAAC;EACnC,CAAC;EAEDO,QAAQ,CAACC,aAAa,GAAGT,mBAAmB;EAE5C,OAAOQ,QAAQ;AACjB","ignoreList":[]}
1
+ {"version":3,"file":"provider.js","names":["FoundryChatLanguageModel","createFoundryAI","options","createLanguageModel","model","identifier","type","apiName","id","registeredModelRid","client","provider","languageModel"],"sources":["provider.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport type { PlatformClient } from \"@osdk/client\";\n\nimport { FoundryChatLanguageModel } from \"./foundry-chat-language-model.js\";\nimport type { ModelIdentifier } from \"./types.js\";\n\nexport interface FoundryAIProviderOptions {\n /** Foundry PlatformClient providing the auth token + base URL. */\n client: PlatformClient;\n}\n\n/**\n * A Foundry AI provider for the AI SDK.\n *\n * Can be called directly as a function to get a language model, or use\n * the `.languageModel()` method.\n *\n * @example\n * ```ts\n * import { generateText } from \"ai\";\n * import { createFoundryAI } from \"@osdk/aip-core/ai-sdk\";\n *\n * const foundryAI = createFoundryAI({ client });\n * const { text } = await generateText({\n * model: foundryAI(\"gpt-4o\"),\n * prompt: \"Hello, world\",\n * });\n * ```\n */\nexport interface FoundryAIProvider {\n /**\n * Create a language model for the given model name or identifier.\n *\n * @param model - LMS model API name (e.g. \"gpt-4o\") or a structured ModelIdentifier.\n */\n (model: string | ModelIdentifier): LanguageModelV3;\n\n /**\n * Create a language model for the given model name or identifier.\n *\n * @param model - LMS model API name (e.g. \"gpt-4o\") or a structured ModelIdentifier.\n */\n languageModel(model: string | ModelIdentifier): LanguageModelV3;\n}\n\n/**\n * Create a Foundry AI provider for the AI SDK.\n *\n * @param options - Configuration including the Foundry PlatformClient.\n * @returns A provider that can be called directly or via `.languageModel()`.\n */\nexport function createFoundryAI(\n options: FoundryAIProviderOptions,\n): FoundryAIProvider {\n const createLanguageModel = (\n model: string | ModelIdentifier,\n ): LanguageModelV3 => {\n const identifier: ModelIdentifier =\n typeof model === \"string\" ? { type: \"lmsModel\", apiName: model } : model;\n\n const id =\n identifier.type === \"lmsModel\"\n ? identifier.apiName\n : identifier.registeredModelRid;\n\n return new FoundryChatLanguageModel(`foundry/${id}`, {\n client: options.client,\n identifier,\n });\n };\n\n const provider = function (model: string | ModelIdentifier): LanguageModelV3 {\n return createLanguageModel(model);\n };\n\n provider.languageModel = createLanguageModel;\n\n return provider as FoundryAIProvider;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,SAASA,wBAAwB,QAAQ,kCAAkC;;AAQ3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAiBA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAC7BC,OAAiC,EACd;EACnB,MAAMC,mBAAmB,GACvBC,KAA+B,IACX;IACpB,MAAMC,UAA2B,GAC/B,OAAOD,KAAK,KAAK,QAAQ,GAAG;MAAEE,IAAI,EAAE,UAAU;MAAEC,OAAO,EAAEH;IAAM,CAAC,GAAGA,KAAK;IAE1E,MAAMI,EAAE,GACNH,UAAU,CAACC,IAAI,KAAK,UAAU,GAC1BD,UAAU,CAACE,OAAO,GAClBF,UAAU,CAACI,kBAAkB;IAEnC,OAAO,IAAIT,wBAAwB,CAAC,WAAWQ,EAAE,EAAE,EAAE;MACnDE,MAAM,EAAER,OAAO,CAACQ,MAAM;MACtBL;IACF,CAAC,CAAC;EACJ,CAAC;EAED,MAAMM,QAAQ,GAAG,SAAAA,CAAUP,KAA+B,EAAmB;IAC3E,OAAOD,mBAAmB,CAACC,KAAK,CAAC;EACnC,CAAC;EAEDO,QAAQ,CAACC,aAAa,GAAGT,mBAAmB;EAE5C,OAAOQ,QAAQ;AACjB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"generateText.js","names":["resolveMessages","runStep","generateText","options","messages","system","prompt","step","model","tools","toolChoice","maxOutputTokens","temperature","topP","stopSequences","seed","presencePenalty","frequencyPenalty","abortSignal","headers","warnings","onStepFinish","totalUsage","usage","onFinish","steps"],"sources":["generateText.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolveMessages } from \"./internal/options.js\";\nimport { runStep } from \"./internal/runStep.js\";\nimport type { LanguageModel } from \"./model.js\";\nimport type {\n LanguageModelUsage,\n ModelMessage,\n StepResult,\n SystemModelMessage,\n ToolChoice,\n ToolSet,\n} from \"./types.js\";\n\n/**\n * Options for {@link generateText}.\n */\nexport interface GenerateTextOptions<TOOLS extends ToolSet = ToolSet> {\n /** The language model to use. Build one via `foundryModel(...)`. */\n model: LanguageModel;\n\n /** Plain text prompt. Mutually exclusive with `messages`. */\n prompt?: string | Array<ModelMessage>;\n\n /** Conversation history. Mutually exclusive with `prompt`. */\n messages?: Array<ModelMessage>;\n\n /** System instructions, prepended to the conversation. */\n system?: string | SystemModelMessage | Array<SystemModelMessage>;\n\n // Tools --------------------------------------------------------------------\n\n tools?: TOOLS;\n toolChoice?: ToolChoice<TOOLS>;\n\n // Sampling -----------------------------------------------------------------\n\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n stopSequences?: Array<string>;\n seed?: number;\n\n // Execution ----------------------------------------------------------------\n\n abortSignal?: AbortSignal;\n headers?: Record<string, string | undefined>;\n\n // Callbacks ----------------------------------------------------------------\n\n onStepFinish?: (step: StepResult<TOOLS>) => void | Promise<void>;\n onFinish?: (\n event: StepResult<TOOLS> & {\n steps: Array<StepResult<TOOLS>>;\n totalUsage: LanguageModelUsage;\n }\n ) => void | PromiseLike<void>;\n}\n\n/**\n * Result of {@link generateText}.\n */\nexport type GenerateTextResult<TOOLS extends ToolSet = ToolSet> =\n StepResult<TOOLS> & {\n totalUsage: LanguageModelUsage;\n steps: Array<StepResult<TOOLS>>;\n };\n\n/**\n * Generate a text completion via the Foundry Language Model Service.\n *\n * v0: single-step. Multi-step tool execution loops, image/file content,\n * structured output, and Zod tool schemas are not yet supported.\n *\n * @example\n * ```ts\n * import { foundryModel, generateText } from \"@osdk/aip-core\";\n *\n * const { text } = await generateText({\n * model: foundryModel({ client, model: \"gpt-4o\" }),\n * system: \"You are a concise assistant.\",\n * prompt: \"Summarise this PR.\",\n * });\n * ```\n */\nexport async function generateText<TOOLS extends ToolSet = ToolSet>(\n options: GenerateTextOptions<TOOLS>\n): Promise<GenerateTextResult<TOOLS>> {\n const messages = resolveMessages(\n \"generateText\",\n options.system,\n options.prompt,\n options.messages\n );\n\n const step = await runStep<TOOLS>({\n model: options.model,\n messages,\n tools: options.tools,\n toolChoice: options.toolChoice,\n maxOutputTokens: options.maxOutputTokens,\n temperature: options.temperature,\n topP: options.topP,\n stopSequences: options.stopSequences,\n seed: options.seed,\n presencePenalty: options.presencePenalty,\n frequencyPenalty: options.frequencyPenalty,\n abortSignal: options.abortSignal,\n headers: options.headers,\n warnings: [],\n });\n\n await options.onStepFinish?.(step);\n\n const totalUsage = step.usage;\n\n await options.onFinish?.({\n ...step,\n steps: [step],\n totalUsage,\n });\n\n return { ...step, totalUsage, steps: [step] };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,eAAe,QAAQ,uBAAuB;AACvD,SAASC,OAAO,QAAQ,uBAAuB;;AAW/C;AACA;AACA;;AA6CA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,YAAYA,CAChCC,OAAmC,EACC;EACpC,MAAMC,QAAQ,GAAGJ,eAAe,CAC9B,cAAc,EACdG,OAAO,CAACE,MAAM,EACdF,OAAO,CAACG,MAAM,EACdH,OAAO,CAACC,QACV,CAAC;EAED,MAAMG,IAAI,GAAG,MAAMN,OAAO,CAAQ;IAChCO,KAAK,EAAEL,OAAO,CAACK,KAAK;IACpBJ,QAAQ;IACRK,KAAK,EAAEN,OAAO,CAACM,KAAK;IACpBC,UAAU,EAAEP,OAAO,CAACO,UAAU;IAC9BC,eAAe,EAAER,OAAO,CAACQ,eAAe;IACxCC,WAAW,EAAET,OAAO,CAACS,WAAW;IAChCC,IAAI,EAAEV,OAAO,CAACU,IAAI;IAClBC,aAAa,EAAEX,OAAO,CAACW,aAAa;IACpCC,IAAI,EAAEZ,OAAO,CAACY,IAAI;IAClBC,eAAe,EAAEb,OAAO,CAACa,eAAe;IACxCC,gBAAgB,EAAEd,OAAO,CAACc,gBAAgB;IAC1CC,WAAW,EAAEf,OAAO,CAACe,WAAW;IAChCC,OAAO,EAAEhB,OAAO,CAACgB,OAAO;IACxBC,QAAQ,EAAE;EACZ,CAAC,CAAC;EAEF,MAAMjB,OAAO,CAACkB,YAAY,GAAGd,IAAI,CAAC;EAElC,MAAMe,UAAU,GAAGf,IAAI,CAACgB,KAAK;EAE7B,MAAMpB,OAAO,CAACqB,QAAQ,GAAG;IACvB,GAAGjB,IAAI;IACPkB,KAAK,EAAE,CAAClB,IAAI,CAAC;IACbe;EACF,CAAC,CAAC;EAEF,OAAO;IAAE,GAAGf,IAAI;IAAEe,UAAU;IAAEG,KAAK,EAAE,CAAClB,IAAI;EAAE,CAAC;AAC/C","ignoreList":[]}
1
+ {"version":3,"file":"generateText.js","names":["resolveMessages","runStep","generateText","options","messages","system","prompt","step","model","tools","toolChoice","maxOutputTokens","temperature","topP","stopSequences","seed","presencePenalty","frequencyPenalty","abortSignal","headers","warnings","onStepFinish","totalUsage","usage","onFinish","steps"],"sources":["generateText.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolveMessages } from \"./internal/options.js\";\nimport { runStep } from \"./internal/runStep.js\";\nimport type { LanguageModel } from \"./model.js\";\nimport type {\n LanguageModelUsage,\n ModelMessage,\n StepResult,\n SystemModelMessage,\n ToolChoice,\n ToolSet,\n} from \"./types.js\";\n\n/**\n * Options for {@link generateText}.\n */\nexport interface GenerateTextOptions<TOOLS extends ToolSet = ToolSet> {\n /** The language model to use. Build one via `foundryModel(...)`. */\n model: LanguageModel;\n\n /** Plain text prompt. Mutually exclusive with `messages`. */\n prompt?: string | Array<ModelMessage>;\n\n /** Conversation history. Mutually exclusive with `prompt`. */\n messages?: Array<ModelMessage>;\n\n /** System instructions, prepended to the conversation. */\n system?: string | SystemModelMessage | Array<SystemModelMessage>;\n\n // Tools --------------------------------------------------------------------\n\n tools?: TOOLS;\n toolChoice?: ToolChoice<TOOLS>;\n\n // Sampling -----------------------------------------------------------------\n\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n stopSequences?: Array<string>;\n seed?: number;\n\n // Execution ----------------------------------------------------------------\n\n abortSignal?: AbortSignal;\n headers?: Record<string, string | undefined>;\n\n // Callbacks ----------------------------------------------------------------\n\n onStepFinish?: (step: StepResult<TOOLS>) => void | Promise<void>;\n onFinish?: (\n event: StepResult<TOOLS> & {\n steps: Array<StepResult<TOOLS>>;\n totalUsage: LanguageModelUsage;\n },\n ) => void | PromiseLike<void>;\n}\n\n/**\n * Result of {@link generateText}.\n */\nexport type GenerateTextResult<TOOLS extends ToolSet = ToolSet> =\n StepResult<TOOLS> & {\n totalUsage: LanguageModelUsage;\n steps: Array<StepResult<TOOLS>>;\n };\n\n/**\n * Generate a text completion via the Foundry Language Model Service.\n *\n * v0: single-step. Multi-step tool execution loops, image/file content,\n * structured output, and Zod tool schemas are not yet supported.\n *\n * @example\n * ```ts\n * import { foundryModel, generateText } from \"@osdk/aip-core\";\n *\n * const { text } = await generateText({\n * model: foundryModel({ client, model: \"gpt-4o\" }),\n * system: \"You are a concise assistant.\",\n * prompt: \"Summarise this PR.\",\n * });\n * ```\n */\nexport async function generateText<TOOLS extends ToolSet = ToolSet>(\n options: GenerateTextOptions<TOOLS>,\n): Promise<GenerateTextResult<TOOLS>> {\n const messages = resolveMessages(\n \"generateText\",\n options.system,\n options.prompt,\n options.messages,\n );\n\n const step = await runStep<TOOLS>({\n model: options.model,\n messages,\n tools: options.tools,\n toolChoice: options.toolChoice,\n maxOutputTokens: options.maxOutputTokens,\n temperature: options.temperature,\n topP: options.topP,\n stopSequences: options.stopSequences,\n seed: options.seed,\n presencePenalty: options.presencePenalty,\n frequencyPenalty: options.frequencyPenalty,\n abortSignal: options.abortSignal,\n headers: options.headers,\n warnings: [],\n });\n\n await options.onStepFinish?.(step);\n\n const totalUsage = step.usage;\n\n await options.onFinish?.({\n ...step,\n steps: [step],\n totalUsage,\n });\n\n return { ...step, totalUsage, steps: [step] };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,eAAe,QAAQ,uBAAuB;AACvD,SAASC,OAAO,QAAQ,uBAAuB;;AAW/C;AACA;AACA;;AA6CA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,YAAYA,CAChCC,OAAmC,EACC;EACpC,MAAMC,QAAQ,GAAGJ,eAAe,CAC9B,cAAc,EACdG,OAAO,CAACE,MAAM,EACdF,OAAO,CAACG,MAAM,EACdH,OAAO,CAACC,QACV,CAAC;EAED,MAAMG,IAAI,GAAG,MAAMN,OAAO,CAAQ;IAChCO,KAAK,EAAEL,OAAO,CAACK,KAAK;IACpBJ,QAAQ;IACRK,KAAK,EAAEN,OAAO,CAACM,KAAK;IACpBC,UAAU,EAAEP,OAAO,CAACO,UAAU;IAC9BC,eAAe,EAAER,OAAO,CAACQ,eAAe;IACxCC,WAAW,EAAET,OAAO,CAACS,WAAW;IAChCC,IAAI,EAAEV,OAAO,CAACU,IAAI;IAClBC,aAAa,EAAEX,OAAO,CAACW,aAAa;IACpCC,IAAI,EAAEZ,OAAO,CAACY,IAAI;IAClBC,eAAe,EAAEb,OAAO,CAACa,eAAe;IACxCC,gBAAgB,EAAEd,OAAO,CAACc,gBAAgB;IAC1CC,WAAW,EAAEf,OAAO,CAACe,WAAW;IAChCC,OAAO,EAAEhB,OAAO,CAACgB,OAAO;IACxBC,QAAQ,EAAE;EACZ,CAAC,CAAC;EAEF,MAAMjB,OAAO,CAACkB,YAAY,GAAGd,IAAI,CAAC;EAElC,MAAMe,UAAU,GAAGf,IAAI,CAACgB,KAAK;EAE7B,MAAMpB,OAAO,CAACqB,QAAQ,GAAG;IACvB,GAAGjB,IAAI;IACPkB,KAAK,EAAE,CAAClB,IAAI,CAAC;IACbe;EACF,CAAC,CAAC;EAEF,OAAO;IAAE,GAAGf,IAAI;IAAEe,UAAU;IAAEG,KAAK,EAAE,CAAClB,IAAI;EAAE,CAAC;AAC/C","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"mockPlatformClient.js","names":["mockPlatformClient","args","baseUrl","fetch","tokenProvider","Promise","resolve","token","assertDefined","value","label","Error"],"sources":["mockPlatformClient.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { PlatformClient } from \"@osdk/client\";\n\n/**\n * Build a typed `PlatformClient` for tests. `PlatformClient` is structurally\n * `{ baseUrl, fetch, tokenProvider }`; we satisfy that shape directly so\n * tests don't reach for `as unknown as PlatformClient`.\n */\nexport function mockPlatformClient(args: {\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n token?: string;\n}): PlatformClient {\n return {\n baseUrl: args.baseUrl,\n fetch: args.fetch,\n tokenProvider: () => Promise.resolve(args.token ?? \"test-token\"),\n };\n}\n\n/** Throws with a labelled error if `value` is null/undefined. */\nexport function assertDefined<T>(\n value: T,\n label: string\n): asserts value is NonNullable<T> {\n if (value == null) {\n throw new Error(`${label} was unexpectedly null/undefined`);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,kBAAkBA,CAACC,IAIlC,EAAkB;EACjB,OAAO;IACLC,OAAO,EAAED,IAAI,CAACC,OAAO;IACrBC,KAAK,EAAEF,IAAI,CAACE,KAAK;IACjBC,aAAa,EAAEA,CAAA,KAAMC,OAAO,CAACC,OAAO,CAACL,IAAI,CAACM,KAAK,IAAI,YAAY;EACjE,CAAC;AACH;;AAEA;AACA,OAAO,SAASC,aAAaA,CAC3BC,KAAQ,EACRC,KAAa,EACoB;EACjC,IAAID,KAAK,IAAI,IAAI,EAAE;IACjB,MAAM,IAAIE,KAAK,CAAC,GAAGD,KAAK,kCAAkC,CAAC;EAC7D;AACF","ignoreList":[]}
1
+ {"version":3,"file":"mockPlatformClient.js","names":["mockPlatformClient","args","baseUrl","fetch","tokenProvider","Promise","resolve","token","assertDefined","value","label","Error"],"sources":["mockPlatformClient.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { PlatformClient } from \"@osdk/client\";\n\n/**\n * Build a typed `PlatformClient` for tests. `PlatformClient` is structurally\n * `{ baseUrl, fetch, tokenProvider }`; we satisfy that shape directly so\n * tests don't reach for `as unknown as PlatformClient`.\n */\nexport function mockPlatformClient(args: {\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n token?: string;\n}): PlatformClient {\n return {\n baseUrl: args.baseUrl,\n fetch: args.fetch,\n tokenProvider: () => Promise.resolve(args.token ?? \"test-token\"),\n };\n}\n\n/** Throws with a labelled error if `value` is null/undefined. */\nexport function assertDefined<T>(\n value: T,\n label: string,\n): asserts value is NonNullable<T> {\n if (value == null) {\n throw new Error(`${label} was unexpectedly null/undefined`);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,kBAAkBA,CAACC,IAIlC,EAAkB;EACjB,OAAO;IACLC,OAAO,EAAED,IAAI,CAACC,OAAO;IACrBC,KAAK,EAAEF,IAAI,CAACE,KAAK;IACjBC,aAAa,EAAEA,CAAA,KAAMC,OAAO,CAACC,OAAO,CAACL,IAAI,CAACM,KAAK,IAAI,YAAY;EACjE,CAAC;AACH;;AAEA;AACA,OAAO,SAASC,aAAaA,CAC3BC,KAAQ,EACRC,KAAa,EACoB;EACjC,IAAID,KAAK,IAAI,IAAI,EAAE;IACjB,MAAM,IAAIE,KAAK,CAAC,GAAGD,KAAK,kCAAkC,CAAC;EAC7D;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"openAi.js","names":["getOpenAiBaseUrl","_getFoundryInternal","getModelApiName","identifier","type","apiName","registeredModelRid","mapUsage","raw","inputTokens","prompt_tokens","outputTokens","completion_tokens","totalTokens","total_tokens","reasoningTokens","completion_tokens_details","reasoning_tokens","cachedInputTokens","prompt_tokens_details","cached_tokens","EMPTY_USAGE","undefined","mapFinishReason","reason","convertMessage","m","warnings","role","content","parts","p","push","text","message","toolCalls","id","toolCallId","function","name","toolName","arguments","JSON","stringify","input","length","tool_calls","map","part","stringifyToolResult","tool_call_id","output","value","c","filter","s","join","convertTools","tools","Object","entries","tool","parameters","isJsonSchemaLike","inputSchema","details","properties","description","convertToolChoice","choice","parseToolArguments","args","parse","buildOpenAiRequestBody","streaming","common","model","messages","flat","max_tokens","maxOutputTokens","temperature","top_p","topP","stop","stopSequences","seed","presence_penalty","presencePenalty","frequency_penalty","frequencyPenalty","tool_choice","toolChoice","stream","stream_options","include_usage","buildAssistantContent","tc","filterHeaders","out","k","v","safeReadText","res","postChatCompletions","handle","baseUrl","client","url","URL","toString","fetch","method","headers","Accept","accept","body","signal","abortSignal","ok","errBody","Error","status","statusText"],"sources":["openAi.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getOpenAiBaseUrl } from \"@osdk/language-models\";\n\nimport {\n _getFoundryInternal,\n type LanguageModel,\n type ModelIdentifier,\n} from \"../model.js\";\nimport type {\n AssistantModelMessage,\n FinishReason,\n LanguageModelUsage,\n ModelMessage,\n ToolCall,\n ToolChoice,\n ToolResultPart,\n ToolSet,\n Warning,\n} from \"../types.js\";\n\nexport interface OpenAiMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | Array<OpenAiContentPart> | null;\n tool_calls?: Array<OpenAiAssistantToolCall>;\n tool_call_id?: string;\n}\n\ntype OpenAiContentPart = { type: \"text\"; text: string };\n\nexport interface OpenAiTool {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: unknown;\n };\n}\n\nexport type OpenAiToolChoice =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\nexport interface OpenAiAssistantToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\nexport function getModelApiName(identifier: ModelIdentifier): string {\n return identifier.type === \"lmsModel\"\n ? identifier.apiName\n : identifier.registeredModelRid;\n}\n\nexport interface OpenAiUsageRaw {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: { reasoning_tokens?: number };\n prompt_tokens_details?: { cached_tokens?: number };\n}\n\nexport function mapUsage(raw: OpenAiUsageRaw): LanguageModelUsage {\n return {\n inputTokens: raw.prompt_tokens,\n outputTokens: raw.completion_tokens,\n totalTokens: raw.total_tokens,\n reasoningTokens: raw.completion_tokens_details?.reasoning_tokens,\n cachedInputTokens: raw.prompt_tokens_details?.cached_tokens,\n };\n}\n\nexport const EMPTY_USAGE: LanguageModelUsage = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n};\n\nexport function mapFinishReason(reason: string): FinishReason {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool-calls\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return \"other\";\n }\n}\n\nexport function convertMessage(\n m: ModelMessage,\n warnings: Array<Warning>\n): Array<OpenAiMessage> {\n switch (m.role) {\n case \"system\":\n return [{ role: \"system\", content: m.content }];\n\n case \"user\": {\n if (typeof m.content === \"string\") {\n return [{ role: \"user\", content: m.content }];\n }\n const parts: Array<OpenAiContentPart> = [];\n for (const p of m.content) {\n if (p.type === \"text\") {\n parts.push({ type: \"text\", text: p.text });\n } else {\n warnings.push({\n type: \"other\",\n message: `Unsupported user content part \"${p.type}\": ignored in v0`,\n });\n }\n }\n return [{ role: \"user\", content: parts }];\n }\n\n case \"assistant\": {\n if (typeof m.content === \"string\") {\n return [{ role: \"assistant\", content: m.content }];\n }\n let text = \"\";\n const toolCalls: Array<OpenAiAssistantToolCall> = [];\n for (const p of m.content) {\n switch (p.type) {\n case \"text\":\n text += p.text;\n break;\n case \"tool-call\":\n toolCalls.push({\n id: p.toolCallId,\n type: \"function\",\n function: {\n name: p.toolName,\n arguments: JSON.stringify(p.input ?? {}),\n },\n });\n break;\n case \"reasoning\":\n case \"file\":\n warnings.push({\n type: \"other\",\n message: `Unsupported assistant content part \"${p.type}\": ignored in v0`,\n });\n break;\n }\n }\n return [\n {\n role: \"assistant\",\n content: text.length > 0 ? text : null,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n },\n ];\n }\n\n case \"tool\":\n return m.content.map((part: ToolResultPart) => ({\n role: \"tool\" as const,\n content: stringifyToolResult(part, warnings),\n tool_call_id: part.toolCallId,\n }));\n }\n}\n\nfunction stringifyToolResult(\n part: ToolResultPart,\n warnings: Array<Warning>\n): string {\n switch (part.output.type) {\n case \"text\":\n case \"error-text\":\n return part.output.value;\n case \"json\":\n case \"error-json\":\n return JSON.stringify(part.output.value);\n case \"content\":\n return part.output.value\n .map((c) => {\n if (c.type === \"text\") {\n return c.text;\n }\n warnings.push({\n type: \"other\",\n message: `Unsupported tool result media: ignored in v0`,\n });\n return \"\";\n })\n .filter((s) => s.length > 0)\n .join(\"\\n\");\n }\n}\n\nexport function convertTools<TOOLS extends ToolSet>(\n tools: TOOLS,\n warnings: Array<Warning>\n): Array<OpenAiTool> {\n return Object.entries(tools).map(([name, tool]) => {\n const parameters = isJsonSchemaLike(tool.inputSchema)\n ? tool.inputSchema\n : (warnings.push({\n type: \"unsupported-tool\",\n details: `Tool \"${name}\" inputSchema is not a JSON Schema; v0 only supports plain JSON Schema objects. Defaulting to {} parameters.`,\n }),\n { type: \"object\", properties: {} });\n return {\n type: \"function\" as const,\n function: {\n name,\n description: tool.description,\n parameters,\n },\n };\n });\n}\n\nexport function convertToolChoice<TOOLS extends ToolSet>(\n choice: ToolChoice<TOOLS> | undefined\n): OpenAiToolChoice | undefined {\n if (choice == null) {\n return undefined;\n }\n if (choice === \"auto\" || choice === \"none\" || choice === \"required\") {\n return choice;\n }\n return { type: \"function\", function: { name: choice.toolName } };\n}\n\nfunction isJsonSchemaLike(value: unknown): boolean {\n return (\n typeof value === \"object\" &&\n value != null &&\n (\"type\" in value ||\n \"properties\" in value ||\n \"$ref\" in value ||\n \"oneOf\" in value ||\n \"anyOf\" in value ||\n \"allOf\" in value)\n );\n}\n\nexport function parseToolArguments(\n args: string,\n warnings: Array<Warning>\n): unknown {\n if (args === \"\") {\n return {};\n }\n try {\n return JSON.parse(args);\n } catch {\n warnings.push({\n type: \"other\",\n message: `Tool call arguments were not valid JSON; passing through as a raw string`,\n });\n return args;\n }\n}\n\nexport interface BuildRequestBodyArgs<TOOLS extends ToolSet> {\n apiName: string;\n messages: ReadonlyArray<ModelMessage>;\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n maxOutputTokens: number | undefined;\n temperature: number | undefined;\n topP: number | undefined;\n stopSequences: ReadonlyArray<string> | undefined;\n seed: number | undefined;\n presencePenalty: number | undefined;\n frequencyPenalty: number | undefined;\n warnings: Array<Warning>;\n}\n\ninterface OpenAiChatRequestCommon {\n model: string;\n messages: Array<OpenAiMessage>;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n stop?: ReadonlyArray<string>;\n seed?: number;\n presence_penalty?: number;\n frequency_penalty?: number;\n tools?: Array<OpenAiTool>;\n tool_choice?: OpenAiToolChoice;\n}\n\nexport type OpenAiChatRequestNonStreaming = OpenAiChatRequestCommon & {\n stream: false;\n};\n\nexport type OpenAiChatRequestStreaming = OpenAiChatRequestCommon & {\n stream: true;\n stream_options?: { include_usage?: boolean };\n};\n\nexport function buildOpenAiRequestBody<TOOLS extends ToolSet>(\n args: BuildRequestBodyArgs<TOOLS>,\n streaming: false\n): OpenAiChatRequestNonStreaming;\nexport function buildOpenAiRequestBody<TOOLS extends ToolSet>(\n args: BuildRequestBodyArgs<TOOLS>,\n streaming: true\n): OpenAiChatRequestStreaming;\nexport function buildOpenAiRequestBody<TOOLS extends ToolSet>(\n args: BuildRequestBodyArgs<TOOLS>,\n streaming: boolean\n): OpenAiChatRequestNonStreaming | OpenAiChatRequestStreaming {\n const common: OpenAiChatRequestCommon = {\n model: args.apiName,\n messages: args.messages.map((m) => convertMessage(m, args.warnings)).flat(),\n max_tokens: args.maxOutputTokens,\n temperature: args.temperature,\n top_p: args.topP,\n stop: args.stopSequences,\n seed: args.seed,\n presence_penalty: args.presencePenalty,\n frequency_penalty: args.frequencyPenalty,\n tools:\n args.tools != null ? convertTools(args.tools, args.warnings) : undefined,\n tool_choice: convertToolChoice(args.toolChoice),\n };\n if (streaming) {\n return { ...common, stream: true, stream_options: { include_usage: true } };\n }\n return { ...common, stream: false };\n}\n\nexport function buildAssistantContent(\n text: string,\n toolCalls: ReadonlyArray<ToolCall>\n): AssistantModelMessage[\"content\"] {\n if (toolCalls.length === 0) {\n return text;\n }\n const parts: Array<\n | { type: \"text\"; text: string }\n | {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: unknown;\n }\n > = [];\n if (text.length > 0) {\n parts.push({ type: \"text\", text });\n }\n for (const tc of toolCalls) {\n parts.push({\n type: \"tool-call\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n input: tc.input,\n });\n }\n return parts;\n}\n\nexport function filterHeaders(\n input: Record<string, string | undefined>\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(input)) {\n if (v != null) {\n out[k] = v;\n }\n }\n return out;\n}\n\nexport async function safeReadText(res: Response): Promise<string | undefined> {\n try {\n return await res.text();\n } catch {\n return undefined;\n }\n}\n\nexport interface PostChatCompletionsArgs {\n model: LanguageModel;\n body: OpenAiChatRequestNonStreaming | OpenAiChatRequestStreaming;\n accept: \"application/json\" | \"text/event-stream\";\n headers: Record<string, string | undefined> | undefined;\n abortSignal: AbortSignal | undefined;\n}\n\n/**\n * POST against the LMS OpenAI proxy's chat/completions endpoint and return\n * the raw response. Throws on a non-2xx response.\n */\nexport async function postChatCompletions(\n args: PostChatCompletionsArgs\n): Promise<Response> {\n const handle = _getFoundryInternal(args.model);\n const baseUrl = getOpenAiBaseUrl(handle.client);\n const url = new URL(\"chat/completions\", `${baseUrl}/`).toString();\n\n const res = await handle.client.fetch(url, {\n method: \"POST\",\n headers: filterHeaders({\n \"Content-Type\": \"application/json\",\n Accept: args.accept,\n ...(args.headers ?? {}),\n }),\n body: JSON.stringify(args.body),\n signal: args.abortSignal,\n });\n\n if (!res.ok) {\n const errBody = await safeReadText(res);\n throw new Error(\n `LMS chat/completions request failed: ${res.status} ${res.statusText}` +\n (errBody ? `: ${errBody}` : \"\")\n );\n }\n\n return res;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"openAi.js","names":["getOpenAiBaseUrl","_getFoundryInternal","getModelApiName","identifier","type","apiName","registeredModelRid","mapUsage","raw","inputTokens","prompt_tokens","outputTokens","completion_tokens","totalTokens","total_tokens","reasoningTokens","completion_tokens_details","reasoning_tokens","cachedInputTokens","prompt_tokens_details","cached_tokens","EMPTY_USAGE","undefined","mapFinishReason","reason","convertMessage","m","warnings","role","content","parts","p","push","text","message","toolCalls","id","toolCallId","function","name","toolName","arguments","JSON","stringify","input","length","tool_calls","map","part","stringifyToolResult","tool_call_id","output","value","c","filter","s","join","convertTools","tools","Object","entries","tool","parameters","isJsonSchemaLike","inputSchema","details","properties","description","convertToolChoice","choice","parseToolArguments","args","parse","buildOpenAiRequestBody","streaming","common","model","messages","flat","max_tokens","maxOutputTokens","temperature","top_p","topP","stop","stopSequences","seed","presence_penalty","presencePenalty","frequency_penalty","frequencyPenalty","tool_choice","toolChoice","stream","stream_options","include_usage","buildAssistantContent","tc","filterHeaders","out","k","v","safeReadText","res","postChatCompletions","handle","baseUrl","client","url","URL","toString","fetch","method","headers","Accept","accept","body","signal","abortSignal","ok","errBody","Error","status","statusText"],"sources":["openAi.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getOpenAiBaseUrl } from \"@osdk/language-models\";\n\nimport {\n _getFoundryInternal,\n type LanguageModel,\n type ModelIdentifier,\n} from \"../model.js\";\nimport type {\n AssistantModelMessage,\n FinishReason,\n LanguageModelUsage,\n ModelMessage,\n ToolCall,\n ToolChoice,\n ToolResultPart,\n ToolSet,\n Warning,\n} from \"../types.js\";\n\nexport interface OpenAiMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | Array<OpenAiContentPart> | null;\n tool_calls?: Array<OpenAiAssistantToolCall>;\n tool_call_id?: string;\n}\n\ntype OpenAiContentPart = { type: \"text\"; text: string };\n\nexport interface OpenAiTool {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: unknown;\n };\n}\n\nexport type OpenAiToolChoice =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\nexport interface OpenAiAssistantToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\nexport function getModelApiName(identifier: ModelIdentifier): string {\n return identifier.type === \"lmsModel\"\n ? identifier.apiName\n : identifier.registeredModelRid;\n}\n\nexport interface OpenAiUsageRaw {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: { reasoning_tokens?: number };\n prompt_tokens_details?: { cached_tokens?: number };\n}\n\nexport function mapUsage(raw: OpenAiUsageRaw): LanguageModelUsage {\n return {\n inputTokens: raw.prompt_tokens,\n outputTokens: raw.completion_tokens,\n totalTokens: raw.total_tokens,\n reasoningTokens: raw.completion_tokens_details?.reasoning_tokens,\n cachedInputTokens: raw.prompt_tokens_details?.cached_tokens,\n };\n}\n\nexport const EMPTY_USAGE: LanguageModelUsage = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n};\n\nexport function mapFinishReason(reason: string): FinishReason {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool-calls\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return \"other\";\n }\n}\n\nexport function convertMessage(\n m: ModelMessage,\n warnings: Array<Warning>,\n): Array<OpenAiMessage> {\n switch (m.role) {\n case \"system\":\n return [{ role: \"system\", content: m.content }];\n\n case \"user\": {\n if (typeof m.content === \"string\") {\n return [{ role: \"user\", content: m.content }];\n }\n const parts: Array<OpenAiContentPart> = [];\n for (const p of m.content) {\n if (p.type === \"text\") {\n parts.push({ type: \"text\", text: p.text });\n } else {\n warnings.push({\n type: \"other\",\n message: `Unsupported user content part \"${p.type}\": ignored in v0`,\n });\n }\n }\n return [{ role: \"user\", content: parts }];\n }\n\n case \"assistant\": {\n if (typeof m.content === \"string\") {\n return [{ role: \"assistant\", content: m.content }];\n }\n let text = \"\";\n const toolCalls: Array<OpenAiAssistantToolCall> = [];\n for (const p of m.content) {\n switch (p.type) {\n case \"text\":\n text += p.text;\n break;\n case \"tool-call\":\n toolCalls.push({\n id: p.toolCallId,\n type: \"function\",\n function: {\n name: p.toolName,\n arguments: JSON.stringify(p.input ?? {}),\n },\n });\n break;\n case \"reasoning\":\n case \"file\":\n warnings.push({\n type: \"other\",\n message: `Unsupported assistant content part \"${p.type}\": ignored in v0`,\n });\n break;\n }\n }\n return [\n {\n role: \"assistant\",\n content: text.length > 0 ? text : null,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n },\n ];\n }\n\n case \"tool\":\n return m.content.map((part: ToolResultPart) => ({\n role: \"tool\" as const,\n content: stringifyToolResult(part, warnings),\n tool_call_id: part.toolCallId,\n }));\n }\n}\n\nfunction stringifyToolResult(\n part: ToolResultPart,\n warnings: Array<Warning>,\n): string {\n switch (part.output.type) {\n case \"text\":\n case \"error-text\":\n return part.output.value;\n case \"json\":\n case \"error-json\":\n return JSON.stringify(part.output.value);\n case \"content\":\n return part.output.value\n .map((c) => {\n if (c.type === \"text\") {\n return c.text;\n }\n warnings.push({\n type: \"other\",\n message: `Unsupported tool result media: ignored in v0`,\n });\n return \"\";\n })\n .filter((s) => s.length > 0)\n .join(\"\\n\");\n }\n}\n\nexport function convertTools<TOOLS extends ToolSet>(\n tools: TOOLS,\n warnings: Array<Warning>,\n): Array<OpenAiTool> {\n return Object.entries(tools).map(([name, tool]) => {\n const parameters = isJsonSchemaLike(tool.inputSchema)\n ? tool.inputSchema\n : (warnings.push({\n type: \"unsupported-tool\",\n details: `Tool \"${name}\" inputSchema is not a JSON Schema; v0 only supports plain JSON Schema objects. Defaulting to {} parameters.`,\n }),\n { type: \"object\", properties: {} });\n return {\n type: \"function\" as const,\n function: {\n name,\n description: tool.description,\n parameters,\n },\n };\n });\n}\n\nexport function convertToolChoice<TOOLS extends ToolSet>(\n choice: ToolChoice<TOOLS> | undefined,\n): OpenAiToolChoice | undefined {\n if (choice == null) {\n return undefined;\n }\n if (choice === \"auto\" || choice === \"none\" || choice === \"required\") {\n return choice;\n }\n return { type: \"function\", function: { name: choice.toolName } };\n}\n\nfunction isJsonSchemaLike(value: unknown): boolean {\n return (\n typeof value === \"object\" &&\n value != null &&\n (\"type\" in value ||\n \"properties\" in value ||\n \"$ref\" in value ||\n \"oneOf\" in value ||\n \"anyOf\" in value ||\n \"allOf\" in value)\n );\n}\n\nexport function parseToolArguments(\n args: string,\n warnings: Array<Warning>,\n): unknown {\n if (args === \"\") {\n return {};\n }\n try {\n return JSON.parse(args);\n } catch {\n warnings.push({\n type: \"other\",\n message: `Tool call arguments were not valid JSON; passing through as a raw string`,\n });\n return args;\n }\n}\n\nexport interface BuildRequestBodyArgs<TOOLS extends ToolSet> {\n apiName: string;\n messages: ReadonlyArray<ModelMessage>;\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n maxOutputTokens: number | undefined;\n temperature: number | undefined;\n topP: number | undefined;\n stopSequences: ReadonlyArray<string> | undefined;\n seed: number | undefined;\n presencePenalty: number | undefined;\n frequencyPenalty: number | undefined;\n warnings: Array<Warning>;\n}\n\ninterface OpenAiChatRequestCommon {\n model: string;\n messages: Array<OpenAiMessage>;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n stop?: ReadonlyArray<string>;\n seed?: number;\n presence_penalty?: number;\n frequency_penalty?: number;\n tools?: Array<OpenAiTool>;\n tool_choice?: OpenAiToolChoice;\n}\n\nexport type OpenAiChatRequestNonStreaming = OpenAiChatRequestCommon & {\n stream: false;\n};\n\nexport type OpenAiChatRequestStreaming = OpenAiChatRequestCommon & {\n stream: true;\n stream_options?: { include_usage?: boolean };\n};\n\nexport function buildOpenAiRequestBody<TOOLS extends ToolSet>(\n args: BuildRequestBodyArgs<TOOLS>,\n streaming: false,\n): OpenAiChatRequestNonStreaming;\nexport function buildOpenAiRequestBody<TOOLS extends ToolSet>(\n args: BuildRequestBodyArgs<TOOLS>,\n streaming: true,\n): OpenAiChatRequestStreaming;\nexport function buildOpenAiRequestBody<TOOLS extends ToolSet>(\n args: BuildRequestBodyArgs<TOOLS>,\n streaming: boolean,\n): OpenAiChatRequestNonStreaming | OpenAiChatRequestStreaming {\n const common: OpenAiChatRequestCommon = {\n model: args.apiName,\n messages: args.messages.map((m) => convertMessage(m, args.warnings)).flat(),\n max_tokens: args.maxOutputTokens,\n temperature: args.temperature,\n top_p: args.topP,\n stop: args.stopSequences,\n seed: args.seed,\n presence_penalty: args.presencePenalty,\n frequency_penalty: args.frequencyPenalty,\n tools:\n args.tools != null ? convertTools(args.tools, args.warnings) : undefined,\n tool_choice: convertToolChoice(args.toolChoice),\n };\n if (streaming) {\n return { ...common, stream: true, stream_options: { include_usage: true } };\n }\n return { ...common, stream: false };\n}\n\nexport function buildAssistantContent(\n text: string,\n toolCalls: ReadonlyArray<ToolCall>,\n): AssistantModelMessage[\"content\"] {\n if (toolCalls.length === 0) {\n return text;\n }\n const parts: Array<\n | { type: \"text\"; text: string }\n | {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: unknown;\n }\n > = [];\n if (text.length > 0) {\n parts.push({ type: \"text\", text });\n }\n for (const tc of toolCalls) {\n parts.push({\n type: \"tool-call\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n input: tc.input,\n });\n }\n return parts;\n}\n\nexport function filterHeaders(\n input: Record<string, string | undefined>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(input)) {\n if (v != null) {\n out[k] = v;\n }\n }\n return out;\n}\n\nexport async function safeReadText(res: Response): Promise<string | undefined> {\n try {\n return await res.text();\n } catch {\n return undefined;\n }\n}\n\nexport interface PostChatCompletionsArgs {\n model: LanguageModel;\n body: OpenAiChatRequestNonStreaming | OpenAiChatRequestStreaming;\n accept: \"application/json\" | \"text/event-stream\";\n headers: Record<string, string | undefined> | undefined;\n abortSignal: AbortSignal | undefined;\n}\n\n/**\n * POST against the LMS OpenAI proxy's chat/completions endpoint and return\n * the raw response. Throws on a non-2xx response.\n */\nexport async function postChatCompletions(\n args: PostChatCompletionsArgs,\n): Promise<Response> {\n const handle = _getFoundryInternal(args.model);\n const baseUrl = getOpenAiBaseUrl(handle.client);\n const url = new URL(\"chat/completions\", `${baseUrl}/`).toString();\n\n const res = await handle.client.fetch(url, {\n method: \"POST\",\n headers: filterHeaders({\n \"Content-Type\": \"application/json\",\n Accept: args.accept,\n ...(args.headers ?? {}),\n }),\n body: JSON.stringify(args.body),\n signal: args.abortSignal,\n });\n\n if (!res.ok) {\n const errBody = await safeReadText(res);\n throw new Error(\n `LMS chat/completions request failed: ${res.status} ${res.statusText}` +\n (errBody ? `: ${errBody}` : \"\"),\n );\n }\n\n return res;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","names":["resolveMessages","callerLabel","system","prompt","messages","Error","sys","resolveSystem","body","resolveBody","length","role","content","Array","isArray"],"sources":["options.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ModelMessage, SystemModelMessage } from \"../types.js\";\n\nexport type SystemOption =\n | string\n | SystemModelMessage\n | Array<SystemModelMessage>\n | undefined;\n\nexport type PromptOption = string | Array<ModelMessage> | undefined;\n\nexport function resolveMessages(\n callerLabel: string,\n system: SystemOption,\n prompt: PromptOption,\n messages: Array<ModelMessage> | undefined\n): Array<ModelMessage> {\n if (prompt != null && messages != null) {\n throw new Error(\n `${callerLabel}: cannot specify both \\`prompt\\` and \\`messages\\`: choose one.`\n );\n }\n\n const sys: Array<SystemModelMessage> = resolveSystem(system);\n const body: Array<ModelMessage> = resolveBody(prompt, messages);\n\n if (sys.length === 0 && body.length === 0) {\n throw new Error(\n `${callerLabel}: must provide at least one of \\`system\\`, \\`prompt\\`, or \\`messages\\`.`\n );\n }\n\n return [...sys, ...body];\n}\n\nfunction resolveSystem(system: SystemOption): Array<SystemModelMessage> {\n if (system == null) {\n return [];\n }\n if (typeof system === \"string\") {\n return system === \"\" ? [] : [{ role: \"system\", content: system }];\n }\n if (Array.isArray(system)) {\n return system;\n }\n return [system];\n}\n\nfunction resolveBody(\n prompt: PromptOption,\n messages: Array<ModelMessage> | undefined\n): Array<ModelMessage> {\n if (messages != null) {\n return messages;\n }\n if (prompt == null) {\n return [];\n }\n if (typeof prompt === \"string\") {\n return [{ role: \"user\", content: prompt }];\n }\n return prompt;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,OAAO,SAASA,eAAeA,CAC7BC,WAAmB,EACnBC,MAAoB,EACpBC,MAAoB,EACpBC,QAAyC,EACpB;EACrB,IAAID,MAAM,IAAI,IAAI,IAAIC,QAAQ,IAAI,IAAI,EAAE;IACtC,MAAM,IAAIC,KAAK,CACb,GAAGJ,WAAW,gEAChB,CAAC;EACH;EAEA,MAAMK,GAA8B,GAAGC,aAAa,CAACL,MAAM,CAAC;EAC5D,MAAMM,IAAyB,GAAGC,WAAW,CAACN,MAAM,EAAEC,QAAQ,CAAC;EAE/D,IAAIE,GAAG,CAACI,MAAM,KAAK,CAAC,IAAIF,IAAI,CAACE,MAAM,KAAK,CAAC,EAAE;IACzC,MAAM,IAAIL,KAAK,CACb,GAAGJ,WAAW,yEAChB,CAAC;EACH;EAEA,OAAO,CAAC,GAAGK,GAAG,EAAE,GAAGE,IAAI,CAAC;AAC1B;AAEA,SAASD,aAAaA,CAACL,MAAoB,EAA6B;EACtE,IAAIA,MAAM,IAAI,IAAI,EAAE;IAClB,OAAO,EAAE;EACX;EACA,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;IAC9B,OAAOA,MAAM,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;MAAES,IAAI,EAAE,QAAQ;MAAEC,OAAO,EAAEV;IAAO,CAAC,CAAC;EACnE;EACA,IAAIW,KAAK,CAACC,OAAO,CAACZ,MAAM,CAAC,EAAE;IACzB,OAAOA,MAAM;EACf;EACA,OAAO,CAACA,MAAM,CAAC;AACjB;AAEA,SAASO,WAAWA,CAClBN,MAAoB,EACpBC,QAAyC,EACpB;EACrB,IAAIA,QAAQ,IAAI,IAAI,EAAE;IACpB,OAAOA,QAAQ;EACjB;EACA,IAAID,MAAM,IAAI,IAAI,EAAE;IAClB,OAAO,EAAE;EACX;EACA,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;IAC9B,OAAO,CAAC;MAAEQ,IAAI,EAAE,MAAM;MAAEC,OAAO,EAAET;IAAO,CAAC,CAAC;EAC5C;EACA,OAAOA,MAAM;AACf","ignoreList":[]}
1
+ {"version":3,"file":"options.js","names":["resolveMessages","callerLabel","system","prompt","messages","Error","sys","resolveSystem","body","resolveBody","length","role","content","Array","isArray"],"sources":["options.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ModelMessage, SystemModelMessage } from \"../types.js\";\n\nexport type SystemOption =\n | string\n | SystemModelMessage\n | Array<SystemModelMessage>\n | undefined;\n\nexport type PromptOption = string | Array<ModelMessage> | undefined;\n\nexport function resolveMessages(\n callerLabel: string,\n system: SystemOption,\n prompt: PromptOption,\n messages: Array<ModelMessage> | undefined,\n): Array<ModelMessage> {\n if (prompt != null && messages != null) {\n throw new Error(\n `${callerLabel}: cannot specify both \\`prompt\\` and \\`messages\\`: choose one.`,\n );\n }\n\n const sys: Array<SystemModelMessage> = resolveSystem(system);\n const body: Array<ModelMessage> = resolveBody(prompt, messages);\n\n if (sys.length === 0 && body.length === 0) {\n throw new Error(\n `${callerLabel}: must provide at least one of \\`system\\`, \\`prompt\\`, or \\`messages\\`.`,\n );\n }\n\n return [...sys, ...body];\n}\n\nfunction resolveSystem(system: SystemOption): Array<SystemModelMessage> {\n if (system == null) {\n return [];\n }\n if (typeof system === \"string\") {\n return system === \"\" ? [] : [{ role: \"system\", content: system }];\n }\n if (Array.isArray(system)) {\n return system;\n }\n return [system];\n}\n\nfunction resolveBody(\n prompt: PromptOption,\n messages: Array<ModelMessage> | undefined,\n): Array<ModelMessage> {\n if (messages != null) {\n return messages;\n }\n if (prompt == null) {\n return [];\n }\n if (typeof prompt === \"string\") {\n return [{ role: \"user\", content: prompt }];\n }\n return prompt;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,OAAO,SAASA,eAAeA,CAC7BC,WAAmB,EACnBC,MAAoB,EACpBC,MAAoB,EACpBC,QAAyC,EACpB;EACrB,IAAID,MAAM,IAAI,IAAI,IAAIC,QAAQ,IAAI,IAAI,EAAE;IACtC,MAAM,IAAIC,KAAK,CACb,GAAGJ,WAAW,gEAChB,CAAC;EACH;EAEA,MAAMK,GAA8B,GAAGC,aAAa,CAACL,MAAM,CAAC;EAC5D,MAAMM,IAAyB,GAAGC,WAAW,CAACN,MAAM,EAAEC,QAAQ,CAAC;EAE/D,IAAIE,GAAG,CAACI,MAAM,KAAK,CAAC,IAAIF,IAAI,CAACE,MAAM,KAAK,CAAC,EAAE;IACzC,MAAM,IAAIL,KAAK,CACb,GAAGJ,WAAW,yEAChB,CAAC;EACH;EAEA,OAAO,CAAC,GAAGK,GAAG,EAAE,GAAGE,IAAI,CAAC;AAC1B;AAEA,SAASD,aAAaA,CAACL,MAAoB,EAA6B;EACtE,IAAIA,MAAM,IAAI,IAAI,EAAE;IAClB,OAAO,EAAE;EACX;EACA,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;IAC9B,OAAOA,MAAM,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;MAAES,IAAI,EAAE,QAAQ;MAAEC,OAAO,EAAEV;IAAO,CAAC,CAAC;EACnE;EACA,IAAIW,KAAK,CAACC,OAAO,CAACZ,MAAM,CAAC,EAAE;IACzB,OAAOA,MAAM;EACf;EACA,OAAO,CAACA,MAAM,CAAC;AACjB;AAEA,SAASO,WAAWA,CAClBN,MAAoB,EACpBC,QAAyC,EACpB;EACrB,IAAIA,QAAQ,IAAI,IAAI,EAAE;IACpB,OAAOA,QAAQ;EACjB;EACA,IAAID,MAAM,IAAI,IAAI,EAAE;IAClB,OAAO,EAAE;EACX;EACA,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;IAC9B,OAAO,CAAC;MAAEQ,IAAI,EAAE,MAAM;MAAEC,OAAO,EAAET;IAAO,CAAC,CAAC;EAC5C;EACA,OAAOA,MAAM;AACf","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"runStep.js","names":["_getFoundryInternal","buildAssistantContent","buildOpenAiRequestBody","EMPTY_USAGE","getModelApiName","mapFinishReason","mapUsage","parseToolArguments","postChatCompletions","runStep","input","apiName","model","identifier","body","res","accept","headers","abortSignal","data","json","parseResponse","warnings","request","choice","choices","Error","message","text","content","reasoningText","reasoning","reasoning_content","toolCalls","tool_calls","map","c","type","toolCallId","id","toolName","function","name","arguments","length","push","r","tc","usage","finishReason","finish_reason","responseMessages","role","toolResults","rawFinishReason","undefined","response","modelId","timestamp","Date","created","messages","providerMetadata"],"sources":["runStep.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LanguageModel } from \"../model.js\";\nimport { _getFoundryInternal } from \"../model.js\";\nimport type {\n AssistantModelMessage,\n ContentPart,\n LanguageModelUsage,\n ModelMessage,\n ReasoningOutput,\n StepResult,\n ToolCall,\n ToolChoice,\n ToolSet,\n Warning,\n} from \"../types.js\";\nimport {\n buildAssistantContent,\n buildOpenAiRequestBody,\n EMPTY_USAGE,\n getModelApiName,\n mapFinishReason,\n mapUsage,\n type OpenAiAssistantToolCall,\n type OpenAiChatRequestNonStreaming,\n parseToolArguments,\n postChatCompletions,\n} from \"./openAi.js\";\n\nexport interface RunStepInput<TOOLS extends ToolSet> {\n model: LanguageModel;\n /** System messages flattened into the head of this list. */\n messages: ReadonlyArray<ModelMessage>;\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n maxOutputTokens: number | undefined;\n temperature: number | undefined;\n topP: number | undefined;\n stopSequences: ReadonlyArray<string> | undefined;\n seed: number | undefined;\n presencePenalty: number | undefined;\n frequencyPenalty: number | undefined;\n abortSignal: AbortSignal | undefined;\n headers: Record<string, string | undefined> | undefined;\n /**\n * Mutated in place — additional warnings discovered while building the\n * request are appended here.\n */\n warnings: Array<Warning>;\n}\n\n/**\n * Performs a single non-streaming chat completion against the LMS OpenAI proxy\n * and returns a {@link StepResult}. Caller is responsible for prepending any\n * system messages before invoking.\n */\nexport async function runStep<TOOLS extends ToolSet>(\n input: RunStepInput<TOOLS>\n): Promise<StepResult<TOOLS>> {\n const apiName = getModelApiName(_getFoundryInternal(input.model).identifier);\n\n const body = buildOpenAiRequestBody<TOOLS>({ apiName, ...input }, false);\n\n const res = await postChatCompletions({\n model: input.model,\n body,\n accept: \"application/json\",\n headers: input.headers,\n abortSignal: input.abortSignal,\n });\n\n const data = (await res.json()) as OpenAiChatCompletionResponse;\n\n return parseResponse<TOOLS>(data, body, input.warnings);\n}\n\ninterface OpenAiChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<OpenAiAssistantToolCall>;\n reasoning?: string;\n reasoning_content?: string;\n };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n };\n}\n\nfunction parseResponse<TOOLS extends ToolSet>(\n res: OpenAiChatCompletionResponse,\n request: OpenAiChatRequestNonStreaming,\n warnings: Array<Warning>\n): StepResult<TOOLS> {\n const choice = res.choices[0];\n if (choice == null) {\n throw new Error(\n \"LMS chat/completions response did not include any choices\"\n );\n }\n\n const message = choice.message;\n const text = message.content ?? \"\";\n const reasoningText = message.reasoning ?? message.reasoning_content;\n\n const toolCalls: Array<ToolCall<keyof TOOLS & string>> = (\n message.tool_calls ?? []\n ).map((c) => ({\n type: \"tool-call\",\n toolCallId: c.id,\n toolName: c.function.name as keyof TOOLS & string,\n input: parseToolArguments(c.function.arguments, warnings),\n }));\n\n const reasoning: Array<ReasoningOutput> =\n reasoningText != null ? [{ type: \"reasoning\", text: reasoningText }] : [];\n\n const content: Array<ContentPart<TOOLS>> = [];\n if (text.length > 0) {\n content.push({ type: \"text\", text });\n }\n for (const r of reasoning) {\n content.push({ type: \"reasoning\", text: r.text });\n }\n for (const tc of toolCalls) {\n content.push({ ...tc, type: \"tool-call\" });\n }\n\n const usage: LanguageModelUsage =\n res.usage != null ? mapUsage(res.usage) : EMPTY_USAGE;\n\n const finishReason = mapFinishReason(choice.finish_reason);\n\n const responseMessages: Array<AssistantModelMessage> = [\n {\n role: \"assistant\",\n content: buildAssistantContent(text, toolCalls),\n },\n ];\n\n return {\n content,\n text,\n reasoning,\n reasoningText,\n toolCalls,\n toolResults: [],\n finishReason,\n rawFinishReason: choice.finish_reason,\n usage,\n warnings: warnings.length > 0 ? warnings : undefined,\n request: { body: request },\n response: {\n id: res.id,\n modelId: res.model,\n timestamp: new Date(res.created * 1000),\n body: res,\n messages: responseMessages,\n },\n providerMetadata: undefined,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,mBAAmB,QAAQ,aAAa;AAajD,SACEC,qBAAqB,EACrBC,sBAAsB,EACtBC,WAAW,EACXC,eAAe,EACfC,eAAe,EACfC,QAAQ,EAGRC,kBAAkB,EAClBC,mBAAmB,QACd,aAAa;AAwBpB;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,OAAOA,CAC3BC,KAA0B,EACE;EAC5B,MAAMC,OAAO,GAAGP,eAAe,CAACJ,mBAAmB,CAACU,KAAK,CAACE,KAAK,CAAC,CAACC,UAAU,CAAC;EAE5E,MAAMC,IAAI,GAAGZ,sBAAsB,CAAQ;IAAES,OAAO;IAAE,GAAGD;EAAM,CAAC,EAAE,KAAK,CAAC;EAExE,MAAMK,GAAG,GAAG,MAAMP,mBAAmB,CAAC;IACpCI,KAAK,EAAEF,KAAK,CAACE,KAAK;IAClBE,IAAI;IACJE,MAAM,EAAE,kBAAkB;IAC1BC,OAAO,EAAEP,KAAK,CAACO,OAAO;IACtBC,WAAW,EAAER,KAAK,CAACQ;EACrB,CAAC,CAAC;EAEF,MAAMC,IAAI,GAAI,MAAMJ,GAAG,CAACK,IAAI,CAAC,CAAkC;EAE/D,OAAOC,aAAa,CAAQF,IAAI,EAAEL,IAAI,EAAEJ,KAAK,CAACY,QAAQ,CAAC;AACzD;AA+BA,SAASD,aAAaA,CACpBN,GAAiC,EACjCQ,OAAsC,EACtCD,QAAwB,EACL;EACnB,MAAME,MAAM,GAAGT,GAAG,CAACU,OAAO,CAAC,CAAC,CAAC;EAC7B,IAAID,MAAM,IAAI,IAAI,EAAE;IAClB,MAAM,IAAIE,KAAK,CACb,2DACF,CAAC;EACH;EAEA,MAAMC,OAAO,GAAGH,MAAM,CAACG,OAAO;EAC9B,MAAMC,IAAI,GAAGD,OAAO,CAACE,OAAO,IAAI,EAAE;EAClC,MAAMC,aAAa,GAAGH,OAAO,CAACI,SAAS,IAAIJ,OAAO,CAACK,iBAAiB;EAEpE,MAAMC,SAAgD,GAAG,CACvDN,OAAO,CAACO,UAAU,IAAI,EAAE,EACxBC,GAAG,CAAEC,CAAC,KAAM;IACZC,IAAI,EAAE,WAAW;IACjBC,UAAU,EAAEF,CAAC,CAACG,EAAE;IAChBC,QAAQ,EAAEJ,CAAC,CAACK,QAAQ,CAACC,IAA4B;IACjDhC,KAAK,EAAEH,kBAAkB,CAAC6B,CAAC,CAACK,QAAQ,CAACE,SAAS,EAAErB,QAAQ;EAC1D,CAAC,CAAC,CAAC;EAEH,MAAMS,SAAiC,GACrCD,aAAa,IAAI,IAAI,GAAG,CAAC;IAAEO,IAAI,EAAE,WAAW;IAAET,IAAI,EAAEE;EAAc,CAAC,CAAC,GAAG,EAAE;EAE3E,MAAMD,OAAkC,GAAG,EAAE;EAC7C,IAAID,IAAI,CAACgB,MAAM,GAAG,CAAC,EAAE;IACnBf,OAAO,CAACgB,IAAI,CAAC;MAAER,IAAI,EAAE,MAAM;MAAET;IAAK,CAAC,CAAC;EACtC;EACA,KAAK,MAAMkB,CAAC,IAAIf,SAAS,EAAE;IACzBF,OAAO,CAACgB,IAAI,CAAC;MAAER,IAAI,EAAE,WAAW;MAAET,IAAI,EAAEkB,CAAC,CAAClB;IAAK,CAAC,CAAC;EACnD;EACA,KAAK,MAAMmB,EAAE,IAAId,SAAS,EAAE;IAC1BJ,OAAO,CAACgB,IAAI,CAAC;MAAE,GAAGE,EAAE;MAAEV,IAAI,EAAE;IAAY,CAAC,CAAC;EAC5C;EAEA,MAAMW,KAAyB,GAC7BjC,GAAG,CAACiC,KAAK,IAAI,IAAI,GAAG1C,QAAQ,CAACS,GAAG,CAACiC,KAAK,CAAC,GAAG7C,WAAW;EAEvD,MAAM8C,YAAY,GAAG5C,eAAe,CAACmB,MAAM,CAAC0B,aAAa,CAAC;EAE1D,MAAMC,gBAA8C,GAAG,CACrD;IACEC,IAAI,EAAE,WAAW;IACjBvB,OAAO,EAAE5B,qBAAqB,CAAC2B,IAAI,EAAEK,SAAS;EAChD,CAAC,CACF;EAED,OAAO;IACLJ,OAAO;IACPD,IAAI;IACJG,SAAS;IACTD,aAAa;IACbG,SAAS;IACToB,WAAW,EAAE,EAAE;IACfJ,YAAY;IACZK,eAAe,EAAE9B,MAAM,CAAC0B,aAAa;IACrCF,KAAK;IACL1B,QAAQ,EAAEA,QAAQ,CAACsB,MAAM,GAAG,CAAC,GAAGtB,QAAQ,GAAGiC,SAAS;IACpDhC,OAAO,EAAE;MAAET,IAAI,EAAES;IAAQ,CAAC;IAC1BiC,QAAQ,EAAE;MACRjB,EAAE,EAAExB,GAAG,CAACwB,EAAE;MACVkB,OAAO,EAAE1C,GAAG,CAACH,KAAK;MAClB8C,SAAS,EAAE,IAAIC,IAAI,CAAC5C,GAAG,CAAC6C,OAAO,GAAG,IAAI,CAAC;MACvC9C,IAAI,EAAEC,GAAG;MACT8C,QAAQ,EAAEV;IACZ,CAAC;IACDW,gBAAgB,EAAEP;EACpB,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"runStep.js","names":["_getFoundryInternal","buildAssistantContent","buildOpenAiRequestBody","EMPTY_USAGE","getModelApiName","mapFinishReason","mapUsage","parseToolArguments","postChatCompletions","runStep","input","apiName","model","identifier","body","res","accept","headers","abortSignal","data","json","parseResponse","warnings","request","choice","choices","Error","message","text","content","reasoningText","reasoning","reasoning_content","toolCalls","tool_calls","map","c","type","toolCallId","id","toolName","function","name","arguments","length","push","r","tc","usage","finishReason","finish_reason","responseMessages","role","toolResults","rawFinishReason","undefined","response","modelId","timestamp","Date","created","messages","providerMetadata"],"sources":["runStep.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LanguageModel } from \"../model.js\";\nimport { _getFoundryInternal } from \"../model.js\";\nimport type {\n AssistantModelMessage,\n ContentPart,\n LanguageModelUsage,\n ModelMessage,\n ReasoningOutput,\n StepResult,\n ToolCall,\n ToolChoice,\n ToolSet,\n Warning,\n} from \"../types.js\";\nimport {\n buildAssistantContent,\n buildOpenAiRequestBody,\n EMPTY_USAGE,\n getModelApiName,\n mapFinishReason,\n mapUsage,\n type OpenAiAssistantToolCall,\n type OpenAiChatRequestNonStreaming,\n parseToolArguments,\n postChatCompletions,\n} from \"./openAi.js\";\n\nexport interface RunStepInput<TOOLS extends ToolSet> {\n model: LanguageModel;\n /** System messages flattened into the head of this list. */\n messages: ReadonlyArray<ModelMessage>;\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n maxOutputTokens: number | undefined;\n temperature: number | undefined;\n topP: number | undefined;\n stopSequences: ReadonlyArray<string> | undefined;\n seed: number | undefined;\n presencePenalty: number | undefined;\n frequencyPenalty: number | undefined;\n abortSignal: AbortSignal | undefined;\n headers: Record<string, string | undefined> | undefined;\n /**\n * Mutated in place — additional warnings discovered while building the\n * request are appended here.\n */\n warnings: Array<Warning>;\n}\n\n/**\n * Performs a single non-streaming chat completion against the LMS OpenAI proxy\n * and returns a {@link StepResult}. Caller is responsible for prepending any\n * system messages before invoking.\n */\nexport async function runStep<TOOLS extends ToolSet>(\n input: RunStepInput<TOOLS>,\n): Promise<StepResult<TOOLS>> {\n const apiName = getModelApiName(_getFoundryInternal(input.model).identifier);\n\n const body = buildOpenAiRequestBody<TOOLS>({ apiName, ...input }, false);\n\n const res = await postChatCompletions({\n model: input.model,\n body,\n accept: \"application/json\",\n headers: input.headers,\n abortSignal: input.abortSignal,\n });\n\n const data = (await res.json()) as OpenAiChatCompletionResponse;\n\n return parseResponse<TOOLS>(data, body, input.warnings);\n}\n\ninterface OpenAiChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<OpenAiAssistantToolCall>;\n reasoning?: string;\n reasoning_content?: string;\n };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n };\n}\n\nfunction parseResponse<TOOLS extends ToolSet>(\n res: OpenAiChatCompletionResponse,\n request: OpenAiChatRequestNonStreaming,\n warnings: Array<Warning>,\n): StepResult<TOOLS> {\n const choice = res.choices[0];\n if (choice == null) {\n throw new Error(\n \"LMS chat/completions response did not include any choices\",\n );\n }\n\n const message = choice.message;\n const text = message.content ?? \"\";\n const reasoningText = message.reasoning ?? message.reasoning_content;\n\n const toolCalls: Array<ToolCall<keyof TOOLS & string>> = (\n message.tool_calls ?? []\n ).map((c) => ({\n type: \"tool-call\",\n toolCallId: c.id,\n toolName: c.function.name as keyof TOOLS & string,\n input: parseToolArguments(c.function.arguments, warnings),\n }));\n\n const reasoning: Array<ReasoningOutput> =\n reasoningText != null ? [{ type: \"reasoning\", text: reasoningText }] : [];\n\n const content: Array<ContentPart<TOOLS>> = [];\n if (text.length > 0) {\n content.push({ type: \"text\", text });\n }\n for (const r of reasoning) {\n content.push({ type: \"reasoning\", text: r.text });\n }\n for (const tc of toolCalls) {\n content.push({ ...tc, type: \"tool-call\" });\n }\n\n const usage: LanguageModelUsage =\n res.usage != null ? mapUsage(res.usage) : EMPTY_USAGE;\n\n const finishReason = mapFinishReason(choice.finish_reason);\n\n const responseMessages: Array<AssistantModelMessage> = [\n {\n role: \"assistant\",\n content: buildAssistantContent(text, toolCalls),\n },\n ];\n\n return {\n content,\n text,\n reasoning,\n reasoningText,\n toolCalls,\n toolResults: [],\n finishReason,\n rawFinishReason: choice.finish_reason,\n usage,\n warnings: warnings.length > 0 ? warnings : undefined,\n request: { body: request },\n response: {\n id: res.id,\n modelId: res.model,\n timestamp: new Date(res.created * 1000),\n body: res,\n messages: responseMessages,\n },\n providerMetadata: undefined,\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"streamStep.js","names":["_getFoundryInternal","buildAssistantContent","buildOpenAiRequestBody","EMPTY_USAGE","getModelApiName","mapFinishReason","mapUsage","parseToolArguments","postChatCompletions","streamStep","input","apiName","model","identifier","body","res","accept","headers","abortSignal","Error","parseSseStream","onChunk","warnings","request","TEXT_PART_ID","REASONING_PART_ID","args","reader","pipeThrough","TextDecoderStream","getReader","buffer","textBuf","reasoningStarted","reasoningBuf","finishReason","rawFinishReason","usage","toolCallAcc","Map","responseInitialized","responseId","responseModel","responseCreated","value","done","read","replace","frameEnd","indexOf","frame","slice","line","split","startsWith","payload","trim","parsed","JSON","parse","push","type","message","isErrorFrame","extractErrorMessage","chunk","id","created","choice","choices","delta","contentDelta","content","length","reasoningDelta","reasoning","reasoning_content","tool_calls","tc","index","acc","get","name","function","arguments","set","finish_reason","releaseLock","finalUsage","toolCalls","Array","from","entries","map","toolCallId","toolName","response","modelId","timestamp","Date","undefined","messages","role","text","reasoningText","error","err"],"sources":["streamStep.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _getFoundryInternal, type LanguageModel } from \"../model.js\";\nimport type {\n FinishReason,\n LanguageModelUsage,\n ModelMessage,\n RequestMetadata,\n ResponseMetadata,\n ToolCall,\n ToolChoice,\n ToolSet,\n Warning,\n} from \"../types.js\";\nimport {\n buildAssistantContent,\n buildOpenAiRequestBody,\n EMPTY_USAGE,\n getModelApiName,\n mapFinishReason,\n mapUsage,\n parseToolArguments,\n postChatCompletions,\n} from \"./openAi.js\";\n\nexport type StreamChunkEvent =\n | { type: \"text-delta\"; id: string; delta: string }\n | { type: \"reasoning-delta\"; id: string; delta: string }\n | {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: unknown;\n }\n | {\n type: \"finish\";\n finishReason: FinishReason;\n rawFinishReason: string | undefined;\n usage: LanguageModelUsage;\n }\n | { type: \"error\"; error: Error };\n\nexport interface StreamStepInput<TOOLS extends ToolSet> {\n model: LanguageModel;\n messages: ReadonlyArray<ModelMessage>;\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n maxOutputTokens: number | undefined;\n temperature: number | undefined;\n topP: number | undefined;\n stopSequences: ReadonlyArray<string> | undefined;\n seed: number | undefined;\n presencePenalty: number | undefined;\n frequencyPenalty: number | undefined;\n abortSignal: AbortSignal | undefined;\n headers: Record<string, string | undefined> | undefined;\n warnings: Array<Warning>;\n onChunk: (chunk: StreamChunkEvent) => void | Promise<void>;\n}\n\nexport interface StreamStepResult {\n text: string;\n reasoningText: string | undefined;\n toolCalls: Array<ToolCall>;\n finishReason: FinishReason;\n rawFinishReason: string | undefined;\n usage: LanguageModelUsage;\n request: RequestMetadata;\n response: ResponseMetadata;\n}\n\ninterface OpenAiStreamChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: \"assistant\";\n content?: string | null;\n reasoning?: string;\n reasoning_content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: \"function\";\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason: string | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: { reasoning_tokens?: number };\n prompt_tokens_details?: { cached_tokens?: number };\n };\n}\n\ninterface ToolCallAccumulator {\n id: string;\n name: string;\n args: string;\n}\n\nexport async function streamStep<TOOLS extends ToolSet>(\n input: StreamStepInput<TOOLS>\n): Promise<StreamStepResult> {\n const apiName = getModelApiName(_getFoundryInternal(input.model).identifier);\n const body = buildOpenAiRequestBody<TOOLS>({ apiName, ...input }, true);\n\n const res = await postChatCompletions({\n model: input.model,\n body,\n accept: \"text/event-stream\",\n headers: input.headers,\n abortSignal: input.abortSignal,\n });\n\n if (res.body == null) {\n throw new Error(\"LMS chat/completions response had no streaming body\");\n }\n\n return parseSseStream({\n body: res.body,\n onChunk: input.onChunk,\n warnings: input.warnings,\n request: { body },\n });\n}\n\ninterface ParseSseStreamArgs {\n body: ReadableStream<Uint8Array>;\n onChunk: (chunk: StreamChunkEvent) => void | Promise<void>;\n warnings: Array<Warning>;\n request: RequestMetadata;\n}\n\nconst TEXT_PART_ID = \"text-0\";\nconst REASONING_PART_ID = \"reasoning-0\";\n\nasync function parseSseStream(\n args: ParseSseStreamArgs\n): Promise<StreamStepResult> {\n const reader = args.body.pipeThrough(new TextDecoderStream()).getReader();\n\n let buffer = \"\";\n let textBuf = \"\";\n let reasoningStarted = false;\n let reasoningBuf = \"\";\n let finishReason: FinishReason = \"other\";\n let rawFinishReason: string | undefined;\n let usage: LanguageModelUsage | undefined;\n const toolCallAcc = new Map<number, ToolCallAccumulator>();\n let responseInitialized = false;\n let responseId: string | undefined;\n let responseModel: string | undefined;\n let responseCreated: number | undefined;\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n buffer += value.replace(/\\r\\n/gu, \"\\n\");\n\n let frameEnd = buffer.indexOf(\"\\n\\n\");\n while (frameEnd !== -1) {\n const frame = buffer.slice(0, frameEnd);\n buffer = buffer.slice(frameEnd + 2);\n\n for (const line of frame.split(\"\\n\")) {\n if (!line.startsWith(\"data:\")) {\n continue;\n }\n const payload = line.slice(5).trim();\n if (payload === \"\") {\n continue;\n }\n if (payload === \"[DONE]\") {\n continue;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n args.warnings.push({\n type: \"other\",\n message: `Skipped malformed SSE frame: ${payload.slice(0, 80)}`,\n });\n continue;\n }\n\n if (isErrorFrame(parsed)) {\n throw new Error(extractErrorMessage(parsed));\n }\n\n const chunk = parsed as OpenAiStreamChunk;\n\n if (!responseInitialized) {\n responseId = chunk.id;\n responseModel = chunk.model;\n responseCreated = chunk.created;\n responseInitialized = true;\n }\n\n if (chunk.usage != null) {\n usage = mapUsage(chunk.usage);\n }\n\n for (const choice of chunk.choices ?? []) {\n const delta = choice.delta;\n const contentDelta = delta.content;\n if (typeof contentDelta === \"string\" && contentDelta.length > 0) {\n textBuf += contentDelta;\n await args.onChunk({\n type: \"text-delta\",\n id: TEXT_PART_ID,\n delta: contentDelta,\n });\n }\n\n const reasoningDelta = delta.reasoning ?? delta.reasoning_content;\n if (\n typeof reasoningDelta === \"string\" &&\n reasoningDelta.length > 0\n ) {\n reasoningStarted = true;\n reasoningBuf += reasoningDelta;\n await args.onChunk({\n type: \"reasoning-delta\",\n id: REASONING_PART_ID,\n delta: reasoningDelta,\n });\n }\n\n if (delta.tool_calls != null) {\n for (const tc of delta.tool_calls) {\n if (typeof tc.index !== \"number\") {\n continue;\n }\n const acc = toolCallAcc.get(tc.index) ?? {\n id: \"\",\n name: \"\",\n args: \"\",\n };\n if (tc.id != null) {\n acc.id = tc.id;\n }\n if (tc.function?.name != null) {\n acc.name = tc.function.name;\n }\n if (tc.function?.arguments != null) {\n acc.args += tc.function.arguments;\n }\n toolCallAcc.set(tc.index, acc);\n }\n }\n\n if (choice.finish_reason != null) {\n rawFinishReason = choice.finish_reason;\n finishReason = mapFinishReason(choice.finish_reason);\n }\n }\n }\n frameEnd = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const finalUsage: LanguageModelUsage = usage ?? EMPTY_USAGE;\n\n // A connection drop or non-conformant provider that closes the stream\n // without finish_reason should still surface tool calls to fullStream.\n const toolCalls: Array<ToolCall> = Array.from(toolCallAcc.entries()).map(\n ([index, acc]) => ({\n type: \"tool-call\" as const,\n toolCallId: acc.id !== \"\" ? acc.id : `tool_call_${index}`,\n toolName: acc.name,\n input: parseToolArguments(acc.args, args.warnings),\n })\n );\n for (const tc of toolCalls) {\n await args.onChunk({\n type: \"tool-call\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n input: tc.input,\n });\n }\n\n await args.onChunk({\n type: \"finish\",\n finishReason,\n rawFinishReason,\n usage: finalUsage,\n });\n\n const response: ResponseMetadata = {\n id: responseId,\n modelId: responseModel,\n timestamp:\n responseCreated != null ? new Date(responseCreated * 1000) : undefined,\n messages: [\n {\n role: \"assistant\",\n content: buildAssistantContent(textBuf, toolCalls),\n },\n ],\n };\n\n return {\n text: textBuf,\n reasoningText: reasoningStarted ? reasoningBuf : undefined,\n toolCalls,\n finishReason,\n rawFinishReason,\n usage: finalUsage,\n request: args.request,\n response,\n };\n}\n\nfunction isErrorFrame(payload: unknown): payload is { error: unknown } {\n return (\n typeof payload === \"object\" &&\n payload != null &&\n \"error\" in payload &&\n (payload as { error: unknown }).error != null\n );\n}\n\nfunction extractErrorMessage(payload: { error: unknown }): string {\n const err = payload.error;\n if (typeof err === \"string\") {\n return err;\n }\n if (typeof err === \"object\" && err != null) {\n const message = (err as { message?: unknown }).message;\n if (typeof message === \"string\") {\n return message;\n }\n }\n return \"LMS chat/completions stream emitted an error frame\";\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"streamStep.js","names":["_getFoundryInternal","buildAssistantContent","buildOpenAiRequestBody","EMPTY_USAGE","getModelApiName","mapFinishReason","mapUsage","parseToolArguments","postChatCompletions","streamStep","input","apiName","model","identifier","body","res","accept","headers","abortSignal","Error","parseSseStream","onChunk","warnings","request","TEXT_PART_ID","REASONING_PART_ID","args","reader","pipeThrough","TextDecoderStream","getReader","buffer","textBuf","reasoningStarted","reasoningBuf","finishReason","rawFinishReason","usage","toolCallAcc","Map","responseInitialized","responseId","responseModel","responseCreated","value","done","read","replace","frameEnd","indexOf","frame","slice","line","split","startsWith","payload","trim","parsed","JSON","parse","push","type","message","isErrorFrame","extractErrorMessage","chunk","id","created","choice","choices","delta","contentDelta","content","length","reasoningDelta","reasoning","reasoning_content","tool_calls","tc","index","acc","get","name","function","arguments","set","finish_reason","releaseLock","finalUsage","toolCalls","Array","from","entries","map","toolCallId","toolName","response","modelId","timestamp","Date","undefined","messages","role","text","reasoningText","error","err"],"sources":["streamStep.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _getFoundryInternal, type LanguageModel } from \"../model.js\";\nimport type {\n FinishReason,\n LanguageModelUsage,\n ModelMessage,\n RequestMetadata,\n ResponseMetadata,\n ToolCall,\n ToolChoice,\n ToolSet,\n Warning,\n} from \"../types.js\";\nimport {\n buildAssistantContent,\n buildOpenAiRequestBody,\n EMPTY_USAGE,\n getModelApiName,\n mapFinishReason,\n mapUsage,\n parseToolArguments,\n postChatCompletions,\n} from \"./openAi.js\";\n\nexport type StreamChunkEvent =\n | { type: \"text-delta\"; id: string; delta: string }\n | { type: \"reasoning-delta\"; id: string; delta: string }\n | {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: unknown;\n }\n | {\n type: \"finish\";\n finishReason: FinishReason;\n rawFinishReason: string | undefined;\n usage: LanguageModelUsage;\n }\n | { type: \"error\"; error: Error };\n\nexport interface StreamStepInput<TOOLS extends ToolSet> {\n model: LanguageModel;\n messages: ReadonlyArray<ModelMessage>;\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n maxOutputTokens: number | undefined;\n temperature: number | undefined;\n topP: number | undefined;\n stopSequences: ReadonlyArray<string> | undefined;\n seed: number | undefined;\n presencePenalty: number | undefined;\n frequencyPenalty: number | undefined;\n abortSignal: AbortSignal | undefined;\n headers: Record<string, string | undefined> | undefined;\n warnings: Array<Warning>;\n onChunk: (chunk: StreamChunkEvent) => void | Promise<void>;\n}\n\nexport interface StreamStepResult {\n text: string;\n reasoningText: string | undefined;\n toolCalls: Array<ToolCall>;\n finishReason: FinishReason;\n rawFinishReason: string | undefined;\n usage: LanguageModelUsage;\n request: RequestMetadata;\n response: ResponseMetadata;\n}\n\ninterface OpenAiStreamChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: \"assistant\";\n content?: string | null;\n reasoning?: string;\n reasoning_content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: \"function\";\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason: string | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: { reasoning_tokens?: number };\n prompt_tokens_details?: { cached_tokens?: number };\n };\n}\n\ninterface ToolCallAccumulator {\n id: string;\n name: string;\n args: string;\n}\n\nexport async function streamStep<TOOLS extends ToolSet>(\n input: StreamStepInput<TOOLS>,\n): Promise<StreamStepResult> {\n const apiName = getModelApiName(_getFoundryInternal(input.model).identifier);\n const body = buildOpenAiRequestBody<TOOLS>({ apiName, ...input }, true);\n\n const res = await postChatCompletions({\n model: input.model,\n body,\n accept: \"text/event-stream\",\n headers: input.headers,\n abortSignal: input.abortSignal,\n });\n\n if (res.body == null) {\n throw new Error(\"LMS chat/completions response had no streaming body\");\n }\n\n return parseSseStream({\n body: res.body,\n onChunk: input.onChunk,\n warnings: input.warnings,\n request: { body },\n });\n}\n\ninterface ParseSseStreamArgs {\n body: ReadableStream<Uint8Array>;\n onChunk: (chunk: StreamChunkEvent) => void | Promise<void>;\n warnings: Array<Warning>;\n request: RequestMetadata;\n}\n\nconst TEXT_PART_ID = \"text-0\";\nconst REASONING_PART_ID = \"reasoning-0\";\n\nasync function parseSseStream(\n args: ParseSseStreamArgs,\n): Promise<StreamStepResult> {\n const reader = args.body.pipeThrough(new TextDecoderStream()).getReader();\n\n let buffer = \"\";\n let textBuf = \"\";\n let reasoningStarted = false;\n let reasoningBuf = \"\";\n let finishReason: FinishReason = \"other\";\n let rawFinishReason: string | undefined;\n let usage: LanguageModelUsage | undefined;\n const toolCallAcc = new Map<number, ToolCallAccumulator>();\n let responseInitialized = false;\n let responseId: string | undefined;\n let responseModel: string | undefined;\n let responseCreated: number | undefined;\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n buffer += value.replace(/\\r\\n/gu, \"\\n\");\n\n let frameEnd = buffer.indexOf(\"\\n\\n\");\n while (frameEnd !== -1) {\n const frame = buffer.slice(0, frameEnd);\n buffer = buffer.slice(frameEnd + 2);\n\n for (const line of frame.split(\"\\n\")) {\n if (!line.startsWith(\"data:\")) {\n continue;\n }\n const payload = line.slice(5).trim();\n if (payload === \"\") {\n continue;\n }\n if (payload === \"[DONE]\") {\n continue;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n args.warnings.push({\n type: \"other\",\n message: `Skipped malformed SSE frame: ${payload.slice(0, 80)}`,\n });\n continue;\n }\n\n if (isErrorFrame(parsed)) {\n throw new Error(extractErrorMessage(parsed));\n }\n\n const chunk = parsed as OpenAiStreamChunk;\n\n if (!responseInitialized) {\n responseId = chunk.id;\n responseModel = chunk.model;\n responseCreated = chunk.created;\n responseInitialized = true;\n }\n\n if (chunk.usage != null) {\n usage = mapUsage(chunk.usage);\n }\n\n for (const choice of chunk.choices ?? []) {\n const delta = choice.delta;\n const contentDelta = delta.content;\n if (typeof contentDelta === \"string\" && contentDelta.length > 0) {\n textBuf += contentDelta;\n await args.onChunk({\n type: \"text-delta\",\n id: TEXT_PART_ID,\n delta: contentDelta,\n });\n }\n\n const reasoningDelta = delta.reasoning ?? delta.reasoning_content;\n if (\n typeof reasoningDelta === \"string\" &&\n reasoningDelta.length > 0\n ) {\n reasoningStarted = true;\n reasoningBuf += reasoningDelta;\n await args.onChunk({\n type: \"reasoning-delta\",\n id: REASONING_PART_ID,\n delta: reasoningDelta,\n });\n }\n\n if (delta.tool_calls != null) {\n for (const tc of delta.tool_calls) {\n if (typeof tc.index !== \"number\") {\n continue;\n }\n const acc = toolCallAcc.get(tc.index) ?? {\n id: \"\",\n name: \"\",\n args: \"\",\n };\n if (tc.id != null) {\n acc.id = tc.id;\n }\n if (tc.function?.name != null) {\n acc.name = tc.function.name;\n }\n if (tc.function?.arguments != null) {\n acc.args += tc.function.arguments;\n }\n toolCallAcc.set(tc.index, acc);\n }\n }\n\n if (choice.finish_reason != null) {\n rawFinishReason = choice.finish_reason;\n finishReason = mapFinishReason(choice.finish_reason);\n }\n }\n }\n frameEnd = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const finalUsage: LanguageModelUsage = usage ?? EMPTY_USAGE;\n\n // A connection drop or non-conformant provider that closes the stream\n // without finish_reason should still surface tool calls to fullStream.\n const toolCalls: Array<ToolCall> = Array.from(toolCallAcc.entries()).map(\n ([index, acc]) => ({\n type: \"tool-call\" as const,\n toolCallId: acc.id !== \"\" ? acc.id : `tool_call_${index}`,\n toolName: acc.name,\n input: parseToolArguments(acc.args, args.warnings),\n }),\n );\n for (const tc of toolCalls) {\n await args.onChunk({\n type: \"tool-call\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n input: tc.input,\n });\n }\n\n await args.onChunk({\n type: \"finish\",\n finishReason,\n rawFinishReason,\n usage: finalUsage,\n });\n\n const response: ResponseMetadata = {\n id: responseId,\n modelId: responseModel,\n timestamp:\n responseCreated != null ? new Date(responseCreated * 1000) : undefined,\n messages: [\n {\n role: \"assistant\",\n content: buildAssistantContent(textBuf, toolCalls),\n },\n ],\n };\n\n return {\n text: textBuf,\n reasoningText: reasoningStarted ? reasoningBuf : undefined,\n toolCalls,\n finishReason,\n rawFinishReason,\n usage: finalUsage,\n request: args.request,\n response,\n };\n}\n\nfunction isErrorFrame(payload: unknown): payload is { error: unknown } {\n return (\n typeof payload === \"object\" &&\n payload != null &&\n \"error\" in payload &&\n (payload as { error: unknown }).error != null\n );\n}\n\nfunction extractErrorMessage(payload: { error: unknown }): string {\n const err = payload.error;\n if (typeof err === \"string\") {\n return err;\n }\n if (typeof err === \"object\" && err != null) {\n const message = (err as { message?: unknown }).message;\n if (typeof message === \"string\") {\n return message;\n }\n }\n return \"LMS chat/completions stream emitted an error frame\";\n}\n"],"mappings":"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","ignoreList":[]}