@osdk/aip-core 0.2.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.
- package/CHANGELOG.md +20 -0
- package/README.md +211 -0
- package/ai-sdk.d.ts +17 -0
- package/build/browser/ai-sdk/convert-prompt.js +136 -0
- package/build/browser/ai-sdk/convert-prompt.js.map +1 -0
- package/build/browser/ai-sdk/foundry-chat-language-model.js +386 -0
- package/build/browser/ai-sdk/foundry-chat-language-model.js.map +1 -0
- package/build/browser/ai-sdk/map-finish-reason.js +42 -0
- package/build/browser/ai-sdk/map-finish-reason.js.map +1 -0
- package/build/browser/ai-sdk/provider.js +62 -0
- package/build/browser/ai-sdk/provider.js.map +1 -0
- package/build/browser/ai-sdk/types.js +2 -0
- package/build/browser/ai-sdk/types.js.map +1 -0
- package/build/browser/generateText.js +76 -0
- package/build/browser/generateText.js.map +1 -0
- package/build/browser/index.js +23 -0
- package/build/browser/index.js.map +1 -0
- package/build/browser/internal/__test__/mockPlatformClient.js +36 -0
- package/build/browser/internal/__test__/mockPlatformClient.js.map +1 -0
- package/build/browser/internal/ids.js +23 -0
- package/build/browser/internal/ids.js.map +1 -0
- package/build/browser/internal/openAi.js +293 -0
- package/build/browser/internal/openAi.js.map +1 -0
- package/build/browser/internal/options.js +58 -0
- package/build/browser/internal/options.js.map +1 -0
- package/build/browser/internal/runStep.js +107 -0
- package/build/browser/internal/runStep.js.map +1 -0
- package/build/browser/internal/streamStep.js +223 -0
- package/build/browser/internal/streamStep.js.map +1 -0
- package/build/browser/internal/uiMessageBridge.js +55 -0
- package/build/browser/internal/uiMessageBridge.js.map +1 -0
- package/build/browser/lmsChatTransport.js +185 -0
- package/build/browser/lmsChatTransport.js.map +1 -0
- package/build/browser/model.js +74 -0
- package/build/browser/model.js.map +1 -0
- package/build/browser/public/ai-sdk.js +18 -0
- package/build/browser/public/ai-sdk.js.map +1 -0
- package/build/browser/streamText.js +210 -0
- package/build/browser/streamText.js.map +1 -0
- package/build/browser/types.js +2 -0
- package/build/browser/types.js.map +1 -0
- package/build/browser/uiMessage.js +34 -0
- package/build/browser/uiMessage.js.map +1 -0
- package/build/cjs/index.cjs +1012 -0
- package/build/cjs/index.cjs.map +1 -0
- package/build/cjs/index.d.cts +467 -0
- package/build/cjs/model-B5uS56VB.d.cts +45 -0
- package/build/cjs/public/ai-sdk.cjs +534 -0
- package/build/cjs/public/ai-sdk.cjs.map +1 -0
- package/build/cjs/public/ai-sdk.d.cts +49 -0
- package/build/esm/ai-sdk/convert-prompt.js +136 -0
- package/build/esm/ai-sdk/convert-prompt.js.map +1 -0
- package/build/esm/ai-sdk/foundry-chat-language-model.js +386 -0
- package/build/esm/ai-sdk/foundry-chat-language-model.js.map +1 -0
- package/build/esm/ai-sdk/map-finish-reason.js +42 -0
- package/build/esm/ai-sdk/map-finish-reason.js.map +1 -0
- package/build/esm/ai-sdk/provider.js +62 -0
- package/build/esm/ai-sdk/provider.js.map +1 -0
- package/build/esm/ai-sdk/types.js +2 -0
- package/build/esm/ai-sdk/types.js.map +1 -0
- package/build/esm/generateText.js +76 -0
- package/build/esm/generateText.js.map +1 -0
- package/build/esm/index.js +23 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/internal/__test__/mockPlatformClient.js +36 -0
- package/build/esm/internal/__test__/mockPlatformClient.js.map +1 -0
- package/build/esm/internal/ids.js +23 -0
- package/build/esm/internal/ids.js.map +1 -0
- package/build/esm/internal/openAi.js +293 -0
- package/build/esm/internal/openAi.js.map +1 -0
- package/build/esm/internal/options.js +58 -0
- package/build/esm/internal/options.js.map +1 -0
- package/build/esm/internal/runStep.js +107 -0
- package/build/esm/internal/runStep.js.map +1 -0
- package/build/esm/internal/streamStep.js +223 -0
- package/build/esm/internal/streamStep.js.map +1 -0
- package/build/esm/internal/uiMessageBridge.js +55 -0
- package/build/esm/internal/uiMessageBridge.js.map +1 -0
- package/build/esm/lmsChatTransport.js +185 -0
- package/build/esm/lmsChatTransport.js.map +1 -0
- package/build/esm/model.js +74 -0
- package/build/esm/model.js.map +1 -0
- package/build/esm/public/ai-sdk.js +18 -0
- package/build/esm/public/ai-sdk.js.map +1 -0
- package/build/esm/streamText.js +210 -0
- package/build/esm/streamText.js.map +1 -0
- package/build/esm/types.js +2 -0
- package/build/esm/types.js.map +1 -0
- package/build/esm/uiMessage.js +34 -0
- package/build/esm/uiMessage.js.map +1 -0
- package/build/types/ai-sdk/convert-prompt.d.ts +19 -0
- package/build/types/ai-sdk/convert-prompt.d.ts.map +1 -0
- package/build/types/ai-sdk/foundry-chat-language-model.d.ts +20 -0
- package/build/types/ai-sdk/foundry-chat-language-model.d.ts.map +1 -0
- package/build/types/ai-sdk/map-finish-reason.d.ts +2 -0
- package/build/types/ai-sdk/map-finish-reason.d.ts.map +1 -0
- package/build/types/ai-sdk/provider.d.ts +46 -0
- package/build/types/ai-sdk/provider.d.ts.map +1 -0
- package/build/types/ai-sdk/types.d.ts +1 -0
- package/build/types/ai-sdk/types.d.ts.map +1 -0
- package/build/types/generateText.d.ts +56 -0
- package/build/types/generateText.d.ts.map +1 -0
- package/build/types/index.d.ts +12 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/internal/__test__/mockPlatformClient.d.ts +13 -0
- package/build/types/internal/__test__/mockPlatformClient.d.ts.map +1 -0
- package/build/types/internal/ids.d.ts +1 -0
- package/build/types/internal/ids.d.ts.map +1 -0
- package/build/types/internal/openAi.d.ts +107 -0
- package/build/types/internal/openAi.d.ts.map +1 -0
- package/build/types/internal/options.d.ts +4 -0
- package/build/types/internal/options.d.ts.map +1 -0
- package/build/types/internal/runStep.d.ts +29 -0
- package/build/types/internal/runStep.d.ts.map +1 -0
- package/build/types/internal/streamStep.d.ts +52 -0
- package/build/types/internal/streamStep.d.ts.map +1 -0
- package/build/types/internal/uiMessageBridge.d.ts +15 -0
- package/build/types/internal/uiMessageBridge.d.ts.map +1 -0
- package/build/types/lmsChatTransport.d.ts +35 -0
- package/build/types/lmsChatTransport.d.ts.map +1 -0
- package/build/types/model.d.ts +42 -0
- package/build/types/model.d.ts.map +1 -0
- package/build/types/public/ai-sdk.d.ts +2 -0
- package/build/types/public/ai-sdk.d.ts.map +1 -0
- package/build/types/streamText.d.ts +82 -0
- package/build/types/streamText.d.ts.map +1 -0
- package/build/types/types.d.ts +189 -0
- package/build/types/types.d.ts.map +1 -0
- package/build/types/uiMessage.d.ts +85 -0
- package/build/types/uiMessage.d.ts.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { getOpenAiBaseUrl } from "@osdk/language-models";
|
|
18
|
+
import { convertPrompt } from "./convert-prompt.js";
|
|
19
|
+
import { mapFinishReason } from "./map-finish-reason.js";
|
|
20
|
+
export class FoundryChatLanguageModel {
|
|
21
|
+
specificationVersion = "v3";
|
|
22
|
+
supportedUrls = {};
|
|
23
|
+
constructor(modelId, config) {
|
|
24
|
+
this.provider = "foundry-lms";
|
|
25
|
+
this.modelId = modelId;
|
|
26
|
+
this.config = config;
|
|
27
|
+
}
|
|
28
|
+
async doGenerate(options) {
|
|
29
|
+
const warnings = [];
|
|
30
|
+
const {
|
|
31
|
+
body,
|
|
32
|
+
url
|
|
33
|
+
} = this.buildRequest(options, warnings);
|
|
34
|
+
const res = await this.config.client.fetch(url, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: filterHeaders({
|
|
37
|
+
"Content-Type": "application/json",
|
|
38
|
+
Accept: "application/json",
|
|
39
|
+
...(options.headers ?? {})
|
|
40
|
+
}),
|
|
41
|
+
body: JSON.stringify(body),
|
|
42
|
+
signal: options.abortSignal
|
|
43
|
+
});
|
|
44
|
+
if (!res.ok) {
|
|
45
|
+
const errBody = await safeReadText(res);
|
|
46
|
+
throw new Error(`LMS chat/completions request failed: ${res.status} ${res.statusText}` + (errBody ? ` — ${errBody}` : ""));
|
|
47
|
+
}
|
|
48
|
+
const data = await res.json();
|
|
49
|
+
return this.parseGenerateResponse(data, body, warnings);
|
|
50
|
+
}
|
|
51
|
+
async doStream(options) {
|
|
52
|
+
const warnings = [];
|
|
53
|
+
const {
|
|
54
|
+
body,
|
|
55
|
+
url
|
|
56
|
+
} = this.buildRequest(options, warnings);
|
|
57
|
+
body.stream = true;
|
|
58
|
+
const res = await this.config.client.fetch(url, {
|
|
59
|
+
method: "POST",
|
|
60
|
+
headers: filterHeaders({
|
|
61
|
+
"Content-Type": "application/json",
|
|
62
|
+
Accept: "text/event-stream",
|
|
63
|
+
...(options.headers ?? {})
|
|
64
|
+
}),
|
|
65
|
+
body: JSON.stringify(body),
|
|
66
|
+
signal: options.abortSignal
|
|
67
|
+
});
|
|
68
|
+
if (!res.ok) {
|
|
69
|
+
const errBody = await safeReadText(res);
|
|
70
|
+
throw new Error(`LMS chat/completions request failed: ${res.status} ${res.statusText}` + (errBody ? ` — ${errBody}` : ""));
|
|
71
|
+
}
|
|
72
|
+
const stream = this.parseStreamResponse(res, body, warnings);
|
|
73
|
+
return {
|
|
74
|
+
stream,
|
|
75
|
+
request: {
|
|
76
|
+
body
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
buildRequest(options, warnings) {
|
|
81
|
+
const baseUrl = getOpenAiBaseUrl(this.config.client);
|
|
82
|
+
const url = new URL("chat/completions", `${baseUrl}/`).toString();
|
|
83
|
+
const apiName = this.config.identifier.type === "lmsModel" ? this.config.identifier.apiName : this.config.identifier.registeredModelRid;
|
|
84
|
+
const messages = convertPrompt(options.prompt, warnings);
|
|
85
|
+
const tools = options.tools?.filter(t => {
|
|
86
|
+
if (t.type === "function") return true;
|
|
87
|
+
warnings.push({
|
|
88
|
+
type: "unsupported",
|
|
89
|
+
feature: `${t.type} tool type`,
|
|
90
|
+
details: `Only "function" tools are supported; "${t.type}" tools are ignored`
|
|
91
|
+
});
|
|
92
|
+
return false;
|
|
93
|
+
}).map(t => ({
|
|
94
|
+
type: "function",
|
|
95
|
+
function: {
|
|
96
|
+
name: t.name,
|
|
97
|
+
description: t.description,
|
|
98
|
+
parameters: t.inputSchema
|
|
99
|
+
}
|
|
100
|
+
}));
|
|
101
|
+
const toolChoice = convertToolChoice(options.toolChoice);
|
|
102
|
+
if (options.topK != null) {
|
|
103
|
+
warnings.push({
|
|
104
|
+
type: "unsupported",
|
|
105
|
+
feature: "topK",
|
|
106
|
+
details: "topK is not supported by the Foundry LMS OpenAI proxy — ignored"
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (options.responseFormat?.type === "json") {
|
|
110
|
+
warnings.push({
|
|
111
|
+
type: "unsupported",
|
|
112
|
+
feature: "JSON response format",
|
|
113
|
+
details: "Structured JSON output is not supported in v0 — ignored"
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const body = {
|
|
117
|
+
model: apiName,
|
|
118
|
+
messages,
|
|
119
|
+
max_tokens: options.maxOutputTokens,
|
|
120
|
+
temperature: options.temperature,
|
|
121
|
+
top_p: options.topP,
|
|
122
|
+
stop: options.stopSequences,
|
|
123
|
+
seed: options.seed,
|
|
124
|
+
presence_penalty: options.presencePenalty,
|
|
125
|
+
frequency_penalty: options.frequencyPenalty,
|
|
126
|
+
tools: tools != null && tools.length > 0 ? tools : undefined,
|
|
127
|
+
tool_choice: toolChoice,
|
|
128
|
+
stream: false
|
|
129
|
+
};
|
|
130
|
+
return {
|
|
131
|
+
body,
|
|
132
|
+
url
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
parseGenerateResponse(res, request, warnings) {
|
|
136
|
+
const choice = res.choices[0];
|
|
137
|
+
if (choice == null) {
|
|
138
|
+
throw new Error("LMS chat/completions response did not include any choices");
|
|
139
|
+
}
|
|
140
|
+
const message = choice.message;
|
|
141
|
+
const content = [];
|
|
142
|
+
if (message.content != null && message.content.length > 0) {
|
|
143
|
+
content.push({
|
|
144
|
+
type: "text",
|
|
145
|
+
text: message.content
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
const reasoningText = message.reasoning ?? message.reasoning_content;
|
|
149
|
+
if (reasoningText != null) {
|
|
150
|
+
content.push({
|
|
151
|
+
type: "reasoning",
|
|
152
|
+
text: reasoningText
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (message.tool_calls != null) {
|
|
156
|
+
for (const tc of message.tool_calls) {
|
|
157
|
+
content.push({
|
|
158
|
+
type: "tool-call",
|
|
159
|
+
toolCallId: tc.id,
|
|
160
|
+
toolName: tc.function.name,
|
|
161
|
+
input: tc.function.arguments
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
content,
|
|
167
|
+
finishReason: mapFinishReason(choice.finish_reason),
|
|
168
|
+
usage: mapUsage(res.usage),
|
|
169
|
+
request: {
|
|
170
|
+
body: request
|
|
171
|
+
},
|
|
172
|
+
response: {
|
|
173
|
+
id: res.id,
|
|
174
|
+
modelId: res.model,
|
|
175
|
+
timestamp: new Date(res.created * 1000),
|
|
176
|
+
body: res
|
|
177
|
+
},
|
|
178
|
+
warnings
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
parseStreamResponse(res, request, warnings) {
|
|
182
|
+
const body = res.body;
|
|
183
|
+
if (body == null) {
|
|
184
|
+
throw new Error("LMS streaming response has no body");
|
|
185
|
+
}
|
|
186
|
+
const reader = body.getReader();
|
|
187
|
+
const decoder = new TextDecoder();
|
|
188
|
+
let buffer = "";
|
|
189
|
+
let sentStart = false;
|
|
190
|
+
const textId = "text-0";
|
|
191
|
+
let textStarted = false;
|
|
192
|
+
const toolInputStarted = new Set();
|
|
193
|
+
return new ReadableStream({
|
|
194
|
+
pull: async controller => {
|
|
195
|
+
while (true) {
|
|
196
|
+
const {
|
|
197
|
+
done,
|
|
198
|
+
value
|
|
199
|
+
} = await reader.read();
|
|
200
|
+
if (done) {
|
|
201
|
+
if (textStarted) {
|
|
202
|
+
controller.enqueue({
|
|
203
|
+
type: "text-end",
|
|
204
|
+
id: textId
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
controller.close();
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
buffer += decoder.decode(value, {
|
|
211
|
+
stream: true
|
|
212
|
+
});
|
|
213
|
+
const lines = buffer.split("\n");
|
|
214
|
+
buffer = lines.pop() ?? "";
|
|
215
|
+
for (const line of lines) {
|
|
216
|
+
const trimmed = line.trim();
|
|
217
|
+
if (!trimmed.startsWith("data:")) continue;
|
|
218
|
+
const data = trimmed.slice(5).trim();
|
|
219
|
+
if (data === "[DONE]") {
|
|
220
|
+
if (textStarted) {
|
|
221
|
+
controller.enqueue({
|
|
222
|
+
type: "text-end",
|
|
223
|
+
id: textId
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
controller.close();
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
let chunk;
|
|
230
|
+
try {
|
|
231
|
+
chunk = JSON.parse(data);
|
|
232
|
+
} catch {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
if (!sentStart) {
|
|
236
|
+
sentStart = true;
|
|
237
|
+
controller.enqueue({
|
|
238
|
+
type: "stream-start",
|
|
239
|
+
warnings
|
|
240
|
+
});
|
|
241
|
+
controller.enqueue({
|
|
242
|
+
type: "response-metadata",
|
|
243
|
+
id: chunk.id,
|
|
244
|
+
modelId: chunk.model,
|
|
245
|
+
timestamp: new Date(chunk.created * 1000)
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
const delta = chunk.choices?.[0]?.delta;
|
|
249
|
+
if (delta == null) {
|
|
250
|
+
if (chunk.usage != null) {
|
|
251
|
+
controller.enqueue({
|
|
252
|
+
type: "finish",
|
|
253
|
+
usage: mapUsage(chunk.usage),
|
|
254
|
+
finishReason: mapFinishReason(chunk.choices?.[0]?.finish_reason ?? undefined)
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (delta.content != null && delta.content.length > 0) {
|
|
260
|
+
if (!textStarted) {
|
|
261
|
+
textStarted = true;
|
|
262
|
+
controller.enqueue({
|
|
263
|
+
type: "text-start",
|
|
264
|
+
id: textId
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
controller.enqueue({
|
|
268
|
+
type: "text-delta",
|
|
269
|
+
id: textId,
|
|
270
|
+
delta: delta.content
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
if (delta.tool_calls != null) {
|
|
274
|
+
for (const tc of delta.tool_calls) {
|
|
275
|
+
const id = tc.id ?? `tool-${tc.index}`;
|
|
276
|
+
if (tc.function?.name != null && !toolInputStarted.has(id)) {
|
|
277
|
+
if (textStarted) {
|
|
278
|
+
textStarted = false;
|
|
279
|
+
controller.enqueue({
|
|
280
|
+
type: "text-end",
|
|
281
|
+
id: textId
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
toolInputStarted.add(id);
|
|
285
|
+
controller.enqueue({
|
|
286
|
+
type: "tool-input-start",
|
|
287
|
+
id,
|
|
288
|
+
toolName: tc.function.name
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
if (tc.function?.arguments != null) {
|
|
292
|
+
controller.enqueue({
|
|
293
|
+
type: "tool-input-delta",
|
|
294
|
+
id,
|
|
295
|
+
delta: tc.function.arguments
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const finishReason = chunk.choices?.[0]?.finish_reason;
|
|
301
|
+
if (finishReason != null) {
|
|
302
|
+
if (textStarted) {
|
|
303
|
+
textStarted = false;
|
|
304
|
+
controller.enqueue({
|
|
305
|
+
type: "text-end",
|
|
306
|
+
id: textId
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
for (const id of toolInputStarted) {
|
|
310
|
+
controller.enqueue({
|
|
311
|
+
type: "tool-input-end",
|
|
312
|
+
id
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
controller.enqueue({
|
|
316
|
+
type: "finish",
|
|
317
|
+
usage: mapUsage(chunk.usage),
|
|
318
|
+
finishReason: mapFinishReason(finishReason)
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
cancel: () => {
|
|
325
|
+
void reader.cancel();
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// ---------------------------------------------------------------------------
|
|
332
|
+
// OpenAI types
|
|
333
|
+
// ---------------------------------------------------------------------------
|
|
334
|
+
|
|
335
|
+
// ---------------------------------------------------------------------------
|
|
336
|
+
// Helpers
|
|
337
|
+
// ---------------------------------------------------------------------------
|
|
338
|
+
|
|
339
|
+
function convertToolChoice(choice) {
|
|
340
|
+
if (choice == null) return undefined;
|
|
341
|
+
switch (choice.type) {
|
|
342
|
+
case "auto":
|
|
343
|
+
return "auto";
|
|
344
|
+
case "none":
|
|
345
|
+
return "none";
|
|
346
|
+
case "required":
|
|
347
|
+
return "required";
|
|
348
|
+
case "tool":
|
|
349
|
+
return {
|
|
350
|
+
type: "function",
|
|
351
|
+
function: {
|
|
352
|
+
name: choice.toolName
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
function mapUsage(usage) {
|
|
358
|
+
return {
|
|
359
|
+
inputTokens: {
|
|
360
|
+
total: usage?.prompt_tokens,
|
|
361
|
+
noCache: undefined,
|
|
362
|
+
cacheRead: usage?.prompt_tokens_details?.cached_tokens,
|
|
363
|
+
cacheWrite: undefined
|
|
364
|
+
},
|
|
365
|
+
outputTokens: {
|
|
366
|
+
total: usage?.completion_tokens,
|
|
367
|
+
text: undefined,
|
|
368
|
+
reasoning: usage?.completion_tokens_details?.reasoning_tokens
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
function filterHeaders(input) {
|
|
373
|
+
const out = {};
|
|
374
|
+
for (const [k, v] of Object.entries(input)) {
|
|
375
|
+
if (v != null) out[k] = v;
|
|
376
|
+
}
|
|
377
|
+
return out;
|
|
378
|
+
}
|
|
379
|
+
async function safeReadText(res) {
|
|
380
|
+
try {
|
|
381
|
+
return await res.text();
|
|
382
|
+
} catch {
|
|
383
|
+
return undefined;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=foundry-chat-language-model.js.map
|
|
@@ -0,0 +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\";\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 = 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(\n (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:\n `Only \"function\" tools are supported; \"${t.type}\" tools are ignored`,\n });\n return false;\n },\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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAeA,SAASA,gBAAgB,QAAQ,uBAAuB;AAExD,SAASC,aAAa,QAAQ,qBAAqB;AACnD,SAASC,eAAe,QAAQ,wBAAwB;AAQxD,OAAO,MAAMC,wBAAwB,CAA4B;EACtDC,oBAAoB,GAAG,IAAI;EAG3BC,aAAa,GAA6B,CAAC,CAAC;EAIrDC,WAAWA,CAACC,OAAe,EAAEC,MAAsC,EAAE;IACnE,IAAI,CAACC,QAAQ,GAAG,aAAa;IAC7B,IAAI,CAACF,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;EAEA,MAAME,UAAUA,CACdC,OAAmC,EACK;IACxC,MAAMC,QAAgC,GAAG,EAAE;IAC3C,MAAM;MAAEC,IAAI;MAAEC;IAAI,CAAC,GAAG,IAAI,CAACC,YAAY,CAACJ,OAAO,EAAEC,QAAQ,CAAC;IAE1D,MAAMI,GAAG,GAAG,MAAM,IAAI,CAACR,MAAM,CAACS,MAAM,CAACC,KAAK,CAACJ,GAAG,EAAE;MAC9CK,MAAM,EAAE,MAAM;MACdC,OAAO,EAAEC,aAAa,CAAC;QACrB,cAAc,EAAE,kBAAkB;QAClCC,MAAM,EAAE,kBAAkB;QAC1B,IAAIX,OAAO,CAACS,OAAO,IAAI,CAAC,CAAC;MAC3B,CAAC,CAAC;MACFP,IAAI,EAAEU,IAAI,CAACC,SAAS,CAACX,IAAI,CAAC;MAC1BY,MAAM,EAAEd,OAAO,CAACe;IAClB,CAAC,CAAC;IAEF,IAAI,CAACV,GAAG,CAACW,EAAE,EAAE;MACX,MAAMC,OAAO,GAAG,MAAMC,YAAY,CAACb,GAAG,CAAC;MACvC,MAAM,IAAIc,KAAK,CACb,wCAAwCd,GAAG,CAACe,MAAM,IAAIf,GAAG,CAACgB,UAAU,EAAE,IACjEJ,OAAO,GAAG,MAAMA,OAAO,EAAE,GAAG,EAAE,CACrC,CAAC;IACH;IAEA,MAAMK,IAAI,GAAI,MAAMjB,GAAG,CAACkB,IAAI,CAAC,CAAkC;IAC/D,OAAO,IAAI,CAACC,qBAAqB,CAACF,IAAI,EAAEpB,IAAI,EAAED,QAAQ,CAAC;EACzD;EAEA,MAAMwB,QAAQA,CACZzB,OAAmC,EACG;IACtC,MAAMC,QAAgC,GAAG,EAAE;IAC3C,MAAM;MAAEC,IAAI;MAAEC;IAAI,CAAC,GAAG,IAAI,CAACC,YAAY,CAACJ,OAAO,EAAEC,QAAQ,CAAC;IAC1DC,IAAI,CAACwB,MAAM,GAAG,IAAI;IAElB,MAAMrB,GAAG,GAAG,MAAM,IAAI,CAACR,MAAM,CAACS,MAAM,CAACC,KAAK,CAACJ,GAAG,EAAE;MAC9CK,MAAM,EAAE,MAAM;MACdC,OAAO,EAAEC,aAAa,CAAC;QACrB,cAAc,EAAE,kBAAkB;QAClCC,MAAM,EAAE,mBAAmB;QAC3B,IAAIX,OAAO,CAACS,OAAO,IAAI,CAAC,CAAC;MAC3B,CAAC,CAAC;MACFP,IAAI,EAAEU,IAAI,CAACC,SAAS,CAACX,IAAI,CAAC;MAC1BY,MAAM,EAAEd,OAAO,CAACe;IAClB,CAAC,CAAC;IAEF,IAAI,CAACV,GAAG,CAACW,EAAE,EAAE;MACX,MAAMC,OAAO,GAAG,MAAMC,YAAY,CAACb,GAAG,CAAC;MACvC,MAAM,IAAIc,KAAK,CACb,wCAAwCd,GAAG,CAACe,MAAM,IAAIf,GAAG,CAACgB,UAAU,EAAE,IACjEJ,OAAO,GAAG,MAAMA,OAAO,EAAE,GAAG,EAAE,CACrC,CAAC;IACH;IAEA,MAAMS,MAAM,GAAG,IAAI,CAACC,mBAAmB,CAACtB,GAAG,EAAEH,IAAI,EAAED,QAAQ,CAAC;IAE5D,OAAO;MACLyB,MAAM;MACNE,OAAO,EAAE;QAAE1B;MAAK;IAClB,CAAC;EACH;EAEQE,YAAYA,CAClBJ,OAAmC,EACnCC,QAAgC,EACU;IAC1C,MAAM4B,OAAO,GAAGxC,gBAAgB,CAAC,IAAI,CAACQ,MAAM,CAACS,MAAM,CAAC;IACpD,MAAMH,GAAG,GAAG,IAAI2B,GAAG,CAAC,kBAAkB,EAAE,GAAGD,OAAO,GAAG,CAAC,CAACE,QAAQ,CAAC,CAAC;IACjE,MAAMC,OAAO,GAAG,IAAI,CAACnC,MAAM,CAACoC,UAAU,CAACC,IAAI,KAAK,UAAU,GACtD,IAAI,CAACrC,MAAM,CAACoC,UAAU,CAACD,OAAO,GAC9B,IAAI,CAACnC,MAAM,CAACoC,UAAU,CAACE,kBAAkB;IAE7C,MAAMC,QAAQ,GAAG9C,aAAa,CAACU,OAAO,CAACqC,MAAM,EAAEpC,QAAQ,CAAC;IAExD,MAAMqC,KAAK,GAAGtC,OAAO,CAACsC,KAAK,EACvBC,MAAM,CACLC,CAAC,IAAuC;MACvC,IAAIA,CAAC,CAACN,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI;MACtCjC,QAAQ,CAACwC,IAAI,CAAC;QACZP,IAAI,EAAE,aAAa;QACnBQ,OAAO,EAAE,GAAGF,CAAC,CAACN,IAAI,YAAY;QAC9BS,OAAO,EACL,yCAAyCH,CAAC,CAACN,IAAI;MACnD,CAAC,CAAC;MACF,OAAO,KAAK;IACd,CACF,CAAC,CACAU,GAAG,CAAEJ,CAAC,KAAM;MACXN,IAAI,EAAE,UAAmB;MACzBW,QAAQ,EAAE;QACRC,IAAI,EAAEN,CAAC,CAACM,IAAI;QACZC,WAAW,EAAEP,CAAC,CAACO,WAAW;QAC1BC,UAAU,EAAER,CAAC,CAACS;MAChB;IACF,CAAC,CAAC,CAAC;IAEL,MAAMC,UAAU,GAAGC,iBAAiB,CAACnD,OAAO,CAACkD,UAAU,CAAC;IAExD,IAAIlD,OAAO,CAACoD,IAAI,IAAI,IAAI,EAAE;MACxBnD,QAAQ,CAACwC,IAAI,CAAC;QACZP,IAAI,EAAE,aAAa;QACnBQ,OAAO,EAAE,MAAM;QACfC,OAAO,EACL;MACJ,CAAC,CAAC;IACJ;IAEA,IAAI3C,OAAO,CAACqD,cAAc,EAAEnB,IAAI,KAAK,MAAM,EAAE;MAC3CjC,QAAQ,CAACwC,IAAI,CAAC;QACZP,IAAI,EAAE,aAAa;QACnBQ,OAAO,EAAE,sBAAsB;QAC/BC,OAAO,EAAE;MACX,CAAC,CAAC;IACJ;IAEA,MAAMzC,IAAuB,GAAG;MAC9BoD,KAAK,EAAEtB,OAAO;MACdI,QAAQ;MACRmB,UAAU,EAAEvD,OAAO,CAACwD,eAAe;MACnCC,WAAW,EAAEzD,OAAO,CAACyD,WAAW;MAChCC,KAAK,EAAE1D,OAAO,CAAC2D,IAAI;MACnBC,IAAI,EAAE5D,OAAO,CAAC6D,aAAa;MAC3BC,IAAI,EAAE9D,OAAO,CAAC8D,IAAI;MAClBC,gBAAgB,EAAE/D,OAAO,CAACgE,eAAe;MACzCC,iBAAiB,EAAEjE,OAAO,CAACkE,gBAAgB;MAC3C5B,KAAK,EAAEA,KAAK,IAAI,IAAI,IAAIA,KAAK,CAAC6B,MAAM,GAAG,CAAC,GAAG7B,KAAK,GAAG8B,SAAS;MAC5DC,WAAW,EAAEnB,UAAU;MACvBxB,MAAM,EAAE;IACV,CAAC;IAED,OAAO;MAAExB,IAAI;MAAEC;IAAI,CAAC;EACtB;EAEQqB,qBAAqBA,CAC3BnB,GAAiC,EACjCuB,OAA0B,EAC1B3B,QAAgC,EACD;IAC/B,MAAMqE,MAAM,GAAGjE,GAAG,CAACkE,OAAO,CAAC,CAAC,CAAC;IAC7B,IAAID,MAAM,IAAI,IAAI,EAAE;MAClB,MAAM,IAAInD,KAAK,CACb,2DACF,CAAC;IACH;IAEA,MAAMqD,OAAO,GAAGF,MAAM,CAACE,OAAO;IAC9B,MAAMC,OAAsC,GAAG,EAAE;IAEjD,IAAID,OAAO,CAACC,OAAO,IAAI,IAAI,IAAID,OAAO,CAACC,OAAO,CAACN,MAAM,GAAG,CAAC,EAAE;MACzDM,OAAO,CAAChC,IAAI,CAAC;QAAEP,IAAI,EAAE,MAAM;QAAEwC,IAAI,EAAEF,OAAO,CAACC;MAAQ,CAAC,CAAC;IACvD;IAEA,MAAME,aAAa,GAAGH,OAAO,CAACI,SAAS,IAAIJ,OAAO,CAACK,iBAAiB;IACpE,IAAIF,aAAa,IAAI,IAAI,EAAE;MACzBF,OAAO,CAAChC,IAAI,CAAC;QAAEP,IAAI,EAAE,WAAW;QAAEwC,IAAI,EAAEC;MAAc,CAAC,CAAC;IAC1D;IAEA,IAAIH,OAAO,CAACM,UAAU,IAAI,IAAI,EAAE;MAC9B,KAAK,MAAMC,EAAE,IAAIP,OAAO,CAACM,UAAU,EAAE;QACnCL,OAAO,CAAChC,IAAI,CAAC;UACXP,IAAI,EAAE,WAAW;UACjB8C,UAAU,EAAED,EAAE,CAACE,EAAE;UACjBC,QAAQ,EAAEH,EAAE,CAAClC,QAAQ,CAACC,IAAI;UAC1BqC,KAAK,EAAEJ,EAAE,CAAClC,QAAQ,CAACuC;QACrB,CAAC,CAAC;MACJ;IACF;IAEA,OAAO;MACLX,OAAO;MACPY,YAAY,EAAE9F,eAAe,CAAC+E,MAAM,CAACgB,aAAa,CAAC;MACnDC,KAAK,EAAEC,QAAQ,CAACnF,GAAG,CAACkF,KAAK,CAAC;MAC1B3D,OAAO,EAAE;QAAE1B,IAAI,EAAE0B;MAAQ,CAAC;MAC1B6D,QAAQ,EAAE;QACRR,EAAE,EAAE5E,GAAG,CAAC4E,EAAE;QACVrF,OAAO,EAAES,GAAG,CAACiD,KAAK;QAClBoC,SAAS,EAAE,IAAIC,IAAI,CAACtF,GAAG,CAACuF,OAAO,GAAG,IAAI,CAAC;QACvC1F,IAAI,EAAEG;MACR,CAAC;MACDJ;IACF,CAAC;EACH;EAEQ0B,mBAAmBA,CACzBtB,GAAa,EACbuB,OAA0B,EAC1B3B,QAAgC,EACW;IAC3C,MAAMC,IAAI,GAAGG,GAAG,CAACH,IAAI;IACrB,IAAIA,IAAI,IAAI,IAAI,EAAE;MAChB,MAAM,IAAIiB,KAAK,CAAC,oCAAoC,CAAC;IACvD;IAEA,MAAM0E,MAAM,GAAG3F,IAAI,CAAC4F,SAAS,CAAC,CAAC;IAC/B,MAAMC,OAAO,GAAG,IAAIC,WAAW,CAAC,CAAC;IACjC,IAAIC,MAAM,GAAG,EAAE;IACf,IAAIC,SAAS,GAAG,KAAK;IACrB,MAAMC,MAAM,GAAG,QAAQ;IACvB,IAAIC,WAAW,GAAG,KAAK;IACvB,MAAMC,gBAAgB,GAAG,IAAIC,GAAG,CAAS,CAAC;IAE1C,OAAO,IAAIC,cAAc,CAA4B;MACnDC,IAAI,EAAE,MAAOC,UAAU,IAAK;QAC1B,OAAO,IAAI,EAAE;UACX,MAAM;YAAEC,IAAI;YAAEC;UAAM,CAAC,GAAG,MAAMd,MAAM,CAACe,IAAI,CAAC,CAAC;UAC3C,IAAIF,IAAI,EAAE;YACR,IAAIN,WAAW,EAAE;cACfK,UAAU,CAACI,OAAO,CAAC;gBAAE3E,IAAI,EAAE,UAAU;gBAAE+C,EAAE,EAAEkB;cAAO,CAAC,CAAC;YACtD;YACAM,UAAU,CAACK,KAAK,CAAC,CAAC;YAClB;UACF;UAEAb,MAAM,IAAIF,OAAO,CAACgB,MAAM,CAACJ,KAAK,EAAE;YAAEjF,MAAM,EAAE;UAAK,CAAC,CAAC;UACjD,MAAMsF,KAAK,GAAGf,MAAM,CAACgB,KAAK,CAAC,IAAI,CAAC;UAChChB,MAAM,GAAGe,KAAK,CAACE,GAAG,CAAC,CAAC,IAAI,EAAE;UAE1B,KAAK,MAAMC,IAAI,IAAIH,KAAK,EAAE;YACxB,MAAMI,OAAO,GAAGD,IAAI,CAACE,IAAI,CAAC,CAAC;YAC3B,IAAI,CAACD,OAAO,CAACE,UAAU,CAAC,OAAO,CAAC,EAAE;YAClC,MAAMhG,IAAI,GAAG8F,OAAO,CAACG,KAAK,CAAC,CAAC,CAAC,CAACF,IAAI,CAAC,CAAC;YACpC,IAAI/F,IAAI,KAAK,QAAQ,EAAE;cACrB,IAAI8E,WAAW,EAAE;gBACfK,UAAU,CAACI,OAAO,CAAC;kBAAE3E,IAAI,EAAE,UAAU;kBAAE+C,EAAE,EAAEkB;gBAAO,CAAC,CAAC;cACtD;cACAM,UAAU,CAACK,KAAK,CAAC,CAAC;cAClB;YACF;YAEA,IAAIU,KAAwB;YAC5B,IAAI;cACFA,KAAK,GAAG5G,IAAI,CAAC6G,KAAK,CAACnG,IAAI,CAAC;YAC1B,CAAC,CAAC,MAAM;cACN;YACF;YAEA,IAAI,CAAC4E,SAAS,EAAE;cACdA,SAAS,GAAG,IAAI;cAChBO,UAAU,CAACI,OAAO,CAAC;gBAAE3E,IAAI,EAAE,cAAc;gBAAEjC;cAAS,CAAC,CAAC;cACtDwG,UAAU,CAACI,OAAO,CAAC;gBACjB3E,IAAI,EAAE,mBAAmB;gBACzB+C,EAAE,EAAEuC,KAAK,CAACvC,EAAE;gBACZrF,OAAO,EAAE4H,KAAK,CAAClE,KAAK;gBACpBoC,SAAS,EAAE,IAAIC,IAAI,CAAC6B,KAAK,CAAC5B,OAAO,GAAG,IAAI;cAC1C,CAAC,CAAC;YACJ;YAEA,MAAM8B,KAAK,GAAGF,KAAK,CAACjD,OAAO,GAAG,CAAC,CAAC,EAAEmD,KAAK;YACvC,IAAIA,KAAK,IAAI,IAAI,EAAE;cACjB,IAAIF,KAAK,CAACjC,KAAK,IAAI,IAAI,EAAE;gBACvBkB,UAAU,CAACI,OAAO,CAAC;kBACjB3E,IAAI,EAAE,QAAQ;kBACdqD,KAAK,EAAEC,QAAQ,CAACgC,KAAK,CAACjC,KAAK,CAAC;kBAC5BF,YAAY,EAAE9F,eAAe,CAC3BiI,KAAK,CAACjD,OAAO,GAAG,CAAC,CAAC,EAAEe,aAAa,IAAIlB,SACvC;gBACF,CAAC,CAAC;cACJ;cACA;YACF;YAEA,IAAIsD,KAAK,CAACjD,OAAO,IAAI,IAAI,IAAIiD,KAAK,CAACjD,OAAO,CAACN,MAAM,GAAG,CAAC,EAAE;cACrD,IAAI,CAACiC,WAAW,EAAE;gBAChBA,WAAW,GAAG,IAAI;gBAClBK,UAAU,CAACI,OAAO,CAAC;kBAAE3E,IAAI,EAAE,YAAY;kBAAE+C,EAAE,EAAEkB;gBAAO,CAAC,CAAC;cACxD;cACAM,UAAU,CAACI,OAAO,CAAC;gBACjB3E,IAAI,EAAE,YAAY;gBAClB+C,EAAE,EAAEkB,MAAM;gBACVuB,KAAK,EAAEA,KAAK,CAACjD;cACf,CAAC,CAAC;YACJ;YAEA,IAAIiD,KAAK,CAAC5C,UAAU,IAAI,IAAI,EAAE;cAC5B,KAAK,MAAMC,EAAE,IAAI2C,KAAK,CAAC5C,UAAU,EAAE;gBACjC,MAAMG,EAAE,GAAGF,EAAE,CAACE,EAAE,IAAI,QAAQF,EAAE,CAAC4C,KAAK,EAAE;gBACtC,IAAI5C,EAAE,CAAClC,QAAQ,EAAEC,IAAI,IAAI,IAAI,IAAI,CAACuD,gBAAgB,CAACuB,GAAG,CAAC3C,EAAE,CAAC,EAAE;kBAC1D,IAAImB,WAAW,EAAE;oBACfA,WAAW,GAAG,KAAK;oBACnBK,UAAU,CAACI,OAAO,CAAC;sBAAE3E,IAAI,EAAE,UAAU;sBAAE+C,EAAE,EAAEkB;oBAAO,CAAC,CAAC;kBACtD;kBACAE,gBAAgB,CAACwB,GAAG,CAAC5C,EAAE,CAAC;kBACxBwB,UAAU,CAACI,OAAO,CAAC;oBACjB3E,IAAI,EAAE,kBAAkB;oBACxB+C,EAAE;oBACFC,QAAQ,EAAEH,EAAE,CAAClC,QAAQ,CAACC;kBACxB,CAAC,CAAC;gBACJ;gBACA,IAAIiC,EAAE,CAAClC,QAAQ,EAAEuC,SAAS,IAAI,IAAI,EAAE;kBAClCqB,UAAU,CAACI,OAAO,CAAC;oBACjB3E,IAAI,EAAE,kBAAkB;oBACxB+C,EAAE;oBACFyC,KAAK,EAAE3C,EAAE,CAAClC,QAAQ,CAACuC;kBACrB,CAAC,CAAC;gBACJ;cACF;YACF;YAEA,MAAMC,YAAY,GAAGmC,KAAK,CAACjD,OAAO,GAAG,CAAC,CAAC,EAAEe,aAAa;YACtD,IAAID,YAAY,IAAI,IAAI,EAAE;cACxB,IAAIe,WAAW,EAAE;gBACfA,WAAW,GAAG,KAAK;gBACnBK,UAAU,CAACI,OAAO,CAAC;kBAAE3E,IAAI,EAAE,UAAU;kBAAE+C,EAAE,EAAEkB;gBAAO,CAAC,CAAC;cACtD;cACA,KAAK,MAAMlB,EAAE,IAAIoB,gBAAgB,EAAE;gBACjCI,UAAU,CAACI,OAAO,CAAC;kBAAE3E,IAAI,EAAE,gBAAgB;kBAAE+C;gBAAG,CAAC,CAAC;cACpD;cACAwB,UAAU,CAACI,OAAO,CAAC;gBACjB3E,IAAI,EAAE,QAAQ;gBACdqD,KAAK,EAAEC,QAAQ,CAACgC,KAAK,CAACjC,KAAK,CAAC;gBAC5BF,YAAY,EAAE9F,eAAe,CAAC8F,YAAY;cAC5C,CAAC,CAAC;YACJ;UACF;QACF;MACF,CAAC;MACDyC,MAAM,EAAEA,CAAA,KAAM;QACZ,KAAKjC,MAAM,CAACiC,MAAM,CAAC,CAAC;MACtB;IACF,CAAC,CAAC;EACJ;AACF;;AAEA;AACA;AACA;;AA+EA;AACA;AACA;;AAEA,SAAS3E,iBAAiBA,CACxBmB,MAA6C,EACV;EACnC,IAAIA,MAAM,IAAI,IAAI,EAAE,OAAOF,SAAS;EACpC,QAAQE,MAAM,CAACpC,IAAI;IACjB,KAAK,MAAM;MACT,OAAO,MAAM;IACf,KAAK,MAAM;MACT,OAAO,MAAM;IACf,KAAK,UAAU;MACb,OAAO,UAAU;IACnB,KAAK,MAAM;MACT,OAAO;QAAEA,IAAI,EAAE,UAAU;QAAEW,QAAQ,EAAE;UAAEC,IAAI,EAAEwB,MAAM,CAACY;QAAS;MAAE,CAAC;EACpE;AACF;AAEA,SAASM,QAAQA,CAACD,KAA8B,EAAwB;EACtE,OAAO;IACLwC,WAAW,EAAE;MACXC,KAAK,EAAEzC,KAAK,EAAE0C,aAAa;MAC3BC,OAAO,EAAE9D,SAAS;MAClB+D,SAAS,EAAE5C,KAAK,EAAE6C,qBAAqB,EAAEC,aAAa;MACtDC,UAAU,EAAElE;IACd,CAAC;IACDmE,YAAY,EAAE;MACZP,KAAK,EAAEzC,KAAK,EAAEiD,iBAAiB;MAC/B9D,IAAI,EAAEN,SAAS;MACfQ,SAAS,EAAEW,KAAK,EAAEkD,yBAAyB,EAAEC;IAC/C;EACF,CAAC;AACH;AAEA,SAAShI,aAAaA,CACpByE,KAAyC,EACjB;EACxB,MAAMwD,GAA2B,GAAG,CAAC,CAAC;EACtC,KAAK,MAAM,CAACC,CAAC,EAAEC,CAAC,CAAC,IAAIC,MAAM,CAACC,OAAO,CAAC5D,KAAK,CAAC,EAAE;IAC1C,IAAI0D,CAAC,IAAI,IAAI,EAAEF,GAAG,CAACC,CAAC,CAAC,GAAGC,CAAC;EAC3B;EACA,OAAOF,GAAG;AACZ;AAEA,eAAezH,YAAYA,CAACb,GAAa,EAA+B;EACtE,IAAI;IACF,OAAO,MAAMA,GAAG,CAACqE,IAAI,CAAC,CAAC;EACzB,CAAC,CAAC,MAAM;IACN,OAAON,SAAS;EAClB;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export function mapFinishReason(raw) {
|
|
18
|
+
let unified;
|
|
19
|
+
switch (raw) {
|
|
20
|
+
case "stop":
|
|
21
|
+
unified = "stop";
|
|
22
|
+
break;
|
|
23
|
+
case "length":
|
|
24
|
+
unified = "length";
|
|
25
|
+
break;
|
|
26
|
+
case "tool_calls":
|
|
27
|
+
case "function_call":
|
|
28
|
+
unified = "tool-calls";
|
|
29
|
+
break;
|
|
30
|
+
case "content_filter":
|
|
31
|
+
unified = "content-filter";
|
|
32
|
+
break;
|
|
33
|
+
default:
|
|
34
|
+
unified = "other";
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
unified,
|
|
39
|
+
raw
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=map-finish-reason.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { FoundryChatLanguageModel } from "./foundry-chat-language-model.js";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A Foundry AI provider for the AI SDK.
|
|
21
|
+
*
|
|
22
|
+
* Can be called directly as a function to get a language model, or use
|
|
23
|
+
* the `.languageModel()` method.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { generateText } from "ai";
|
|
28
|
+
* import { createFoundryAI } from "@osdk/aip-core/ai-sdk";
|
|
29
|
+
*
|
|
30
|
+
* const foundryAI = createFoundryAI({ client });
|
|
31
|
+
* const { text } = await generateText({
|
|
32
|
+
* model: foundryAI("gpt-4o"),
|
|
33
|
+
* prompt: "Hello, world",
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create a Foundry AI provider for the AI SDK.
|
|
40
|
+
*
|
|
41
|
+
* @param options - Configuration including the Foundry PlatformClient.
|
|
42
|
+
* @returns A provider that can be called directly or via `.languageModel()`.
|
|
43
|
+
*/
|
|
44
|
+
export function createFoundryAI(options) {
|
|
45
|
+
const createLanguageModel = model => {
|
|
46
|
+
const identifier = typeof model === "string" ? {
|
|
47
|
+
type: "lmsModel",
|
|
48
|
+
apiName: model
|
|
49
|
+
} : model;
|
|
50
|
+
const id = identifier.type === "lmsModel" ? identifier.apiName : identifier.registeredModelRid;
|
|
51
|
+
return new FoundryChatLanguageModel(`foundry/${id}`, {
|
|
52
|
+
client: options.client,
|
|
53
|
+
identifier
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
const provider = function (model) {
|
|
57
|
+
return createLanguageModel(model);
|
|
58
|
+
};
|
|
59
|
+
provider.languageModel = createLanguageModel;
|
|
60
|
+
return provider;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +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\";\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 = typeof model === \"string\"\n ? { type: \"lmsModel\", apiName: model }\n : model;\n\n const id = 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(\n model: string | ModelIdentifier,\n ): 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;;AAIA,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,GAAG,OAAOD,KAAK,KAAK,QAAQ,GACzD;MAAEE,IAAI,EAAE,UAAU;MAAEC,OAAO,EAAEH;IAAM,CAAC,GACpCA,KAAK;IAET,MAAMI,EAAE,GAAGH,UAAU,CAACC,IAAI,KAAK,UAAU,GACrCD,UAAU,CAACE,OAAO,GAClBF,UAAU,CAACI,kBAAkB;IAEjC,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,CACfP,KAA+B,EACd;IACjB,OAAOD,mBAAmB,CAACC,KAAK,CAAC;EACnC,CAAC;EAEDO,QAAQ,CAACC,aAAa,GAAGT,mBAAmB;EAE5C,OAAOQ,QAAQ;AACjB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["types.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\nexport type { ModelIdentifier } from \"../model.js\";\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { resolveMessages } from "./internal/options.js";
|
|
18
|
+
import { runStep } from "./internal/runStep.js";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Options for {@link generateText}.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Result of {@link generateText}.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Generate a text completion via the Foundry Language Model Service.
|
|
30
|
+
*
|
|
31
|
+
* v0: single-step. Multi-step tool execution loops, image/file content,
|
|
32
|
+
* structured output, and Zod tool schemas are not yet supported.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* import { foundryModel, generateText } from "@osdk/aip-core";
|
|
37
|
+
*
|
|
38
|
+
* const { text } = await generateText({
|
|
39
|
+
* model: foundryModel({ client, model: "gpt-4o" }),
|
|
40
|
+
* system: "You are a concise assistant.",
|
|
41
|
+
* prompt: "Summarise this PR.",
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export async function generateText(options) {
|
|
46
|
+
const messages = resolveMessages("generateText", options.system, options.prompt, options.messages);
|
|
47
|
+
const step = await runStep({
|
|
48
|
+
model: options.model,
|
|
49
|
+
messages,
|
|
50
|
+
tools: options.tools,
|
|
51
|
+
toolChoice: options.toolChoice,
|
|
52
|
+
maxOutputTokens: options.maxOutputTokens,
|
|
53
|
+
temperature: options.temperature,
|
|
54
|
+
topP: options.topP,
|
|
55
|
+
stopSequences: options.stopSequences,
|
|
56
|
+
seed: options.seed,
|
|
57
|
+
presencePenalty: options.presencePenalty,
|
|
58
|
+
frequencyPenalty: options.frequencyPenalty,
|
|
59
|
+
abortSignal: options.abortSignal,
|
|
60
|
+
headers: options.headers,
|
|
61
|
+
warnings: []
|
|
62
|
+
});
|
|
63
|
+
await options.onStepFinish?.(step);
|
|
64
|
+
const totalUsage = step.usage;
|
|
65
|
+
await options.onFinish?.({
|
|
66
|
+
...step,
|
|
67
|
+
steps: [step],
|
|
68
|
+
totalUsage
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
...step,
|
|
72
|
+
totalUsage,
|
|
73
|
+
steps: [step]
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=generateText.js.map
|
|
@@ -0,0 +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:\n & StepResult<TOOLS>\n & { steps: Array<StepResult<TOOLS>>; totalUsage: LanguageModelUsage },\n ) => void | PromiseLike<void>;\n}\n\n/**\n * Result of {@link generateText}.\n */\nexport type GenerateTextResult<TOOLS extends ToolSet = ToolSet> =\n & StepResult<TOOLS>\n & {\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;;AA4CA;AACA;AACA;;AAQA;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":[]}
|