veryfront 0.1.263 → 0.1.264

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 (37) hide show
  1. package/esm/deno.js +1 -1
  2. package/esm/src/agent/index.d.ts +1 -0
  3. package/esm/src/agent/index.d.ts.map +1 -1
  4. package/esm/src/agent/index.js +1 -0
  5. package/esm/src/chat/hosted-ui-chunk-mapping.d.ts +111 -0
  6. package/esm/src/chat/hosted-ui-chunk-mapping.d.ts.map +1 -0
  7. package/esm/src/chat/hosted-ui-chunk-mapping.js +123 -0
  8. package/esm/src/chat/index.d.ts +1 -0
  9. package/esm/src/chat/index.d.ts.map +1 -1
  10. package/esm/src/chat/index.js +1 -0
  11. package/esm/src/provider/runtime-loader/provider-embedding-responses.d.ts +5 -0
  12. package/esm/src/provider/runtime-loader/provider-embedding-responses.d.ts.map +1 -0
  13. package/esm/src/provider/runtime-loader/provider-embedding-responses.js +50 -0
  14. package/esm/src/provider/runtime-loader/provider-finish-reasons.d.ts +9 -0
  15. package/esm/src/provider/runtime-loader/provider-finish-reasons.d.ts.map +1 -0
  16. package/esm/src/provider/runtime-loader/provider-finish-reasons.js +60 -0
  17. package/esm/src/provider/runtime-loader/provider-sse.d.ts +5 -0
  18. package/esm/src/provider/runtime-loader/provider-sse.d.ts.map +1 -0
  19. package/esm/src/provider/runtime-loader/provider-sse.js +23 -0
  20. package/esm/src/provider/runtime-loader/provider-usage.d.ts +19 -0
  21. package/esm/src/provider/runtime-loader/provider-usage.d.ts.map +1 -0
  22. package/esm/src/provider/runtime-loader/provider-usage.js +109 -0
  23. package/esm/src/provider/runtime-loader.d.ts.map +1 -1
  24. package/esm/src/provider/runtime-loader.js +4 -240
  25. package/esm/src/utils/version-constant.d.ts +1 -1
  26. package/esm/src/utils/version-constant.js +1 -1
  27. package/package.json +1 -1
  28. package/src/deno.js +1 -1
  29. package/src/src/agent/index.ts +5 -0
  30. package/src/src/chat/hosted-ui-chunk-mapping.ts +303 -0
  31. package/src/src/chat/index.ts +5 -0
  32. package/src/src/provider/runtime-loader/provider-embedding-responses.ts +61 -0
  33. package/src/src/provider/runtime-loader/provider-finish-reasons.ts +69 -0
  34. package/src/src/provider/runtime-loader/provider-sse.ts +29 -0
  35. package/src/src/provider/runtime-loader/provider-usage.ts +135 -0
  36. package/src/src/provider/runtime-loader.ts +21 -300
  37. package/src/src/utils/version-constant.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-loader.d.ts","sourceRoot":"","sources":["../../../src/src/provider/runtime-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAejE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGtE,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,EAC/B,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,CAAC;AAE3E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAiaD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAilEF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAsEd;AA4jBD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAsEd;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,MAAM,GACd,YAAY,CAyEd;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAkEd;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,gBAAgB,CAuClB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,gBAAgB,CA6ClB"}
1
+ {"version":3,"file":"runtime-loader.d.ts","sourceRoot":"","sources":["../../../src/src/provider/runtime-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAoCjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGtE,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,EAC/B,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,CAAC;AAE3E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAqWD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAm5DF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAsEd;AA0gBD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAsEd;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,MAAM,GACd,YAAY,CAyEd;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAkEd;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,gBAAgB,CAuClB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,gBAAgB,CA6ClB"}
@@ -1,59 +1,14 @@
1
1
  import { getAnthropicMessagesUrl, getGoogleEmbeddingUrl, getGoogleGenerateContentUrl, getGoogleStreamGenerateContentUrl, getOpenAIChatCompletionsUrl, getOpenAIEmbeddingUrl, getOpenAIResponsesUrl, } from "./runtime-loader/provider-endpoints.js";
2
+ import { extractGoogleEmbedding, extractGoogleUsageTokens, extractOpenAIEmbeddings, extractOpenAIUsageTokens, } from "./runtime-loader/provider-embedding-responses.js";
3
+ import { normalizeAnthropicFinishReason, normalizeGoogleFinishReason, normalizeOpenAIFinishReason, normalizeOpenAIResponsesFinishReason, } from "./runtime-loader/provider-finish-reasons.js";
2
4
  import { createAnthropicRequestInit, createGoogleRequestInit, createOpenAIRequestInit, } from "./runtime-loader/provider-request-init.js";
5
+ import { parseSseChunk } from "./runtime-loader/provider-sse.js";
6
+ import { extractAnthropicUsage, extractGoogleUsage, extractOpenAIResponsesUsage, extractOpenAIUsage, mergeUsage, } from "./runtime-loader/provider-usage.js";
3
7
  import { requestJson, requestStream } from "./runtime-loader/provider-http.js";
4
8
  import { readRecord } from "./runtime-loader/provider-records.js";
5
9
  import { TOOL_INPUT_PENDING_THRESHOLD_MS, withToolInputStatusTransitions, } from "./runtime-loader/tool-input-status.js";
6
10
  export { ProviderError, ProviderOverloadedError, ProviderQuotaError, ProviderRateLimitError, ProviderRequestError, } from "./runtime-loader/provider-http.js";
7
11
  export { TOOL_INPUT_PENDING_THRESHOLD_MS, withToolInputStatusTransitions };
8
- function isNumberArray(value) {
9
- return Array.isArray(value) && value.every((entry) => typeof entry === "number");
10
- }
11
- function extractOpenAIEmbeddings(payload) {
12
- const record = readRecord(payload);
13
- const data = record?.data;
14
- if (!Array.isArray(data)) {
15
- throw new Error("Invalid OpenAI embedding response: data array missing");
16
- }
17
- const embeddings = [];
18
- for (const item of data) {
19
- const itemRecord = readRecord(item);
20
- const embedding = itemRecord?.embedding;
21
- if (!isNumberArray(embedding)) {
22
- throw new Error("Invalid OpenAI embedding response: embedding vector missing");
23
- }
24
- embeddings.push(embedding);
25
- }
26
- return embeddings;
27
- }
28
- function extractOpenAIUsageTokens(payload) {
29
- const record = readRecord(payload);
30
- const usage = readRecord(record?.usage);
31
- const totalTokens = usage?.total_tokens;
32
- return typeof totalTokens === "number" ? totalTokens : undefined;
33
- }
34
- function extractGoogleEmbedding(payload) {
35
- const record = readRecord(payload);
36
- const embeddings = record?.embeddings;
37
- if (Array.isArray(embeddings) && embeddings.length > 0) {
38
- const firstEmbedding = readRecord(embeddings[0]);
39
- const values = firstEmbedding?.values;
40
- if (isNumberArray(values)) {
41
- return values;
42
- }
43
- }
44
- const embedding = readRecord(record?.embedding);
45
- const values = embedding?.values;
46
- if (isNumberArray(values)) {
47
- return values;
48
- }
49
- throw new Error("Invalid Google embedding response: embedding vector missing");
50
- }
51
- function extractGoogleUsageTokens(payload) {
52
- const record = readRecord(payload);
53
- const usageMetadata = readRecord(record?.usageMetadata);
54
- const promptTokenCount = usageMetadata?.promptTokenCount;
55
- return typeof promptTokenCount === "number" ? promptTokenCount : undefined;
56
- }
57
12
  function createWarningCollector() {
58
13
  const list = [];
59
14
  return {
@@ -162,63 +117,6 @@ function readProviderOptions(providerOptions, ...providerNames) {
162
117
  }
163
118
  return merged;
164
119
  }
165
- function normalizeAnthropicFinishReason(raw) {
166
- if (typeof raw !== "string") {
167
- return null;
168
- }
169
- switch (raw) {
170
- case "tool_use":
171
- return { unified: "tool-calls", raw };
172
- case "end_turn":
173
- case "stop_sequence":
174
- return { unified: "stop", raw };
175
- case "max_tokens":
176
- return { unified: "length", raw };
177
- default:
178
- return raw;
179
- }
180
- }
181
- function extractAnthropicUsage(payload) {
182
- const record = readRecord(payload);
183
- const usage = readRecord(record?.usage);
184
- if (!usage) {
185
- return undefined;
186
- }
187
- const inputTokens = usage.input_tokens;
188
- const outputTokens = usage.output_tokens;
189
- const cacheCreationInputTokens = usage.cache_creation_input_tokens;
190
- const cacheReadInputTokens = usage.cache_read_input_tokens;
191
- return {
192
- inputTokens: typeof inputTokens === "number" ? inputTokens : undefined,
193
- outputTokens: typeof outputTokens === "number" ? outputTokens : undefined,
194
- totalTokens: typeof inputTokens === "number" || typeof outputTokens === "number"
195
- ? (typeof inputTokens === "number" ? inputTokens : 0) +
196
- (typeof outputTokens === "number" ? outputTokens : 0)
197
- : undefined,
198
- ...(typeof cacheCreationInputTokens === "number" ? { cacheCreationInputTokens } : {}),
199
- ...(typeof cacheReadInputTokens === "number" ? { cacheReadInputTokens } : {}),
200
- };
201
- }
202
- function mergeUsage(current, next) {
203
- if (!current) {
204
- return next;
205
- }
206
- if (!next) {
207
- return current;
208
- }
209
- const inputTokens = next.inputTokens ?? current.inputTokens;
210
- const outputTokens = next.outputTokens ?? current.outputTokens;
211
- const cacheCreationInputTokens = next.cacheCreationInputTokens ??
212
- current.cacheCreationInputTokens;
213
- const cacheReadInputTokens = next.cacheReadInputTokens ?? current.cacheReadInputTokens;
214
- return {
215
- inputTokens,
216
- outputTokens,
217
- totalTokens: (inputTokens ?? 0) + (outputTokens ?? 0),
218
- ...(cacheCreationInputTokens !== undefined ? { cacheCreationInputTokens } : {}),
219
- ...(cacheReadInputTokens !== undefined ? { cacheReadInputTokens } : {}),
220
- };
221
- }
222
120
  function normalizeAnthropicToolChoice(toolChoice) {
223
121
  if (typeof toolChoice === "string") {
224
122
  return { type: toolChoice };
@@ -730,29 +628,6 @@ function buildAnthropicGenerateResult(payload) {
730
628
  usage: extractAnthropicUsage(payload),
731
629
  };
732
630
  }
733
- function parseSseChunk(chunk) {
734
- const blocks = chunk.split(/\r?\n\r?\n/);
735
- const remainder = blocks.pop() ?? "";
736
- const events = blocks.flatMap((block) => {
737
- const dataLines = block.split(/\r?\n/)
738
- .filter((line) => line.startsWith("data:"))
739
- .map((line) => line.slice(5).trimStart());
740
- if (!dataLines.length) {
741
- return [];
742
- }
743
- const payload = dataLines.join("\n").trim();
744
- if (payload === "[DONE]") {
745
- return ["[DONE]"];
746
- }
747
- try {
748
- return [JSON.parse(payload)];
749
- }
750
- catch {
751
- return [];
752
- }
753
- });
754
- return { events, remainder };
755
- }
756
631
  async function* streamAnthropicCompatibleParts(stream) {
757
632
  const decoder = new TextDecoder();
758
633
  let buffer = "";
@@ -951,36 +826,6 @@ async function* streamAnthropicCompatibleParts(stream) {
951
826
  ...(usage ? { usage } : {}),
952
827
  };
953
828
  }
954
- function normalizeOpenAIFinishReason(raw) {
955
- if (typeof raw !== "string") {
956
- return null;
957
- }
958
- if (raw === "tool_calls") {
959
- return { unified: "tool-calls", raw };
960
- }
961
- if (raw === "content_filter") {
962
- return { unified: "content-filter", raw };
963
- }
964
- return raw;
965
- }
966
- function extractOpenAIUsage(payload) {
967
- const record = readRecord(payload);
968
- const usage = readRecord(record?.usage);
969
- if (!usage) {
970
- return undefined;
971
- }
972
- const inputTokens = usage.prompt_tokens;
973
- const outputTokens = usage.completion_tokens;
974
- const totalTokens = usage.total_tokens;
975
- const promptTokensDetails = readRecord(usage.prompt_tokens_details);
976
- const cachedTokens = promptTokensDetails?.cached_tokens;
977
- return {
978
- inputTokens: typeof inputTokens === "number" ? inputTokens : undefined,
979
- outputTokens: typeof outputTokens === "number" ? outputTokens : undefined,
980
- totalTokens: typeof totalTokens === "number" ? totalTokens : undefined,
981
- ...(typeof cachedTokens === "number" ? { cacheReadInputTokens: cachedTokens } : {}),
982
- };
983
- }
984
829
  function extractOpenAIContentText(content) {
985
830
  if (typeof content === "string") {
986
831
  return content;
@@ -1173,41 +1018,6 @@ function buildOpenAIChatRequest(modelId, providerName, options, stream, warnings
1173
1018
  Object.assign(body, providerOpts);
1174
1019
  return body;
1175
1020
  }
1176
- function normalizeGoogleFinishReason(raw) {
1177
- if (typeof raw !== "string") {
1178
- return null;
1179
- }
1180
- switch (raw) {
1181
- case "STOP":
1182
- return { unified: "stop", raw };
1183
- case "MAX_TOKENS":
1184
- return { unified: "length", raw };
1185
- case "SAFETY":
1186
- case "RECITATION":
1187
- return { unified: "content-filter", raw };
1188
- default:
1189
- return raw.toLowerCase();
1190
- }
1191
- }
1192
- function extractGoogleUsage(payload) {
1193
- const record = readRecord(payload);
1194
- const usage = readRecord(record?.usageMetadata);
1195
- if (!usage) {
1196
- return undefined;
1197
- }
1198
- const inputTokens = usage.promptTokenCount;
1199
- const outputTokens = usage.candidatesTokenCount;
1200
- const totalTokens = usage.totalTokenCount;
1201
- const cachedContentTokenCount = usage.cachedContentTokenCount;
1202
- return {
1203
- inputTokens: typeof inputTokens === "number" ? inputTokens : undefined,
1204
- outputTokens: typeof outputTokens === "number" ? outputTokens : undefined,
1205
- totalTokens: typeof totalTokens === "number" ? totalTokens : undefined,
1206
- ...(typeof cachedContentTokenCount === "number"
1207
- ? { cacheReadInputTokens: cachedContentTokenCount }
1208
- : {}),
1209
- };
1210
- }
1211
1021
  function toGoogleContents(prompt) {
1212
1022
  const systemParts = [];
1213
1023
  const contents = [];
@@ -2047,52 +1857,6 @@ function buildOpenAIResponsesRequest(modelId, providerName, options, stream, war
2047
1857
  Object.assign(body, readProviderOptions(options.providerOptions, "openai", providerName));
2048
1858
  return body;
2049
1859
  }
2050
- /**
2051
- * The Responses API uses `input_tokens` / `output_tokens` field names
2052
- * instead of Chat Completions' `prompt_tokens` / `completion_tokens`.
2053
- * It also nests cached input tokens under `input_tokens_details` and
2054
- * exposes reasoning tokens via `output_tokens_details.reasoning_tokens`.
2055
- */
2056
- function extractOpenAIResponsesUsage(payload) {
2057
- const record = readRecord(payload);
2058
- // Streaming usage lives on response.completed inside `response.usage`;
2059
- // non-streaming has it at the top level.
2060
- const responseRecord = readRecord(record?.response);
2061
- const usage = readRecord(responseRecord?.usage) ?? readRecord(record?.usage);
2062
- if (!usage)
2063
- return undefined;
2064
- const inputTokens = typeof usage.input_tokens === "number" ? usage.input_tokens : undefined;
2065
- const outputTokens = typeof usage.output_tokens === "number" ? usage.output_tokens : undefined;
2066
- const totalTokens = typeof usage.total_tokens === "number"
2067
- ? usage.total_tokens
2068
- : (inputTokens !== undefined || outputTokens !== undefined
2069
- ? (inputTokens ?? 0) + (outputTokens ?? 0)
2070
- : undefined);
2071
- const inputDetails = readRecord(usage.input_tokens_details);
2072
- const cachedTokens = inputDetails?.cached_tokens;
2073
- return {
2074
- inputTokens,
2075
- outputTokens,
2076
- totalTokens,
2077
- ...(typeof cachedTokens === "number" ? { cacheReadInputTokens: cachedTokens } : {}),
2078
- };
2079
- }
2080
- function normalizeOpenAIResponsesFinishReason(raw) {
2081
- if (typeof raw !== "string")
2082
- return null;
2083
- switch (raw) {
2084
- case "completed":
2085
- return { unified: "stop", raw };
2086
- case "incomplete":
2087
- return { unified: "length", raw };
2088
- case "failed":
2089
- return { unified: "error", raw };
2090
- case "in_progress":
2091
- return null;
2092
- default:
2093
- return raw;
2094
- }
2095
- }
2096
1860
  function buildOpenAIResponsesGenerateResult(payload) {
2097
1861
  const record = readRecord(payload);
2098
1862
  const output = Array.isArray(record?.output) ? record.output : [];
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.263";
1
+ export declare const VERSION = "0.1.264";
2
2
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.263";
3
+ export const VERSION = "0.1.264";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.263",
3
+ "version": "0.1.264",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
package/src/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.263",
3
+ "version": "0.1.264",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "workspace": [
@@ -398,6 +398,11 @@ export {
398
398
  normalizeChatUiMessageChunk,
399
399
  normalizeChatUiMessageStream,
400
400
  } from "../chat/chat-ui-message-helpers.js";
401
+ export {
402
+ type HostedStreamPartForUiChunkMapping,
403
+ type HostedUiChunkMappingOptions,
404
+ mapHostedStreamPartToChatUiChunks,
405
+ } from "../chat/hosted-ui-chunk-mapping.js";
401
406
  export {
402
407
  expandAllowedRemoteToolNames,
403
408
  getProviderNativeToolNames,
@@ -0,0 +1,303 @@
1
+ import type { ChatMessageMetadata, ChatUiMessageChunk } from "./protocol.js";
2
+
3
+ export type HostedUiChunkMappingOptions = {
4
+ messageId?: string | null;
5
+ reasoningMessageId?: string | null;
6
+ sendReasoning?: boolean;
7
+ sendSources?: boolean;
8
+ onError?: (error: unknown) => string;
9
+ };
10
+
11
+ export type HostedStreamSourcePart =
12
+ | {
13
+ type: "source";
14
+ id: string;
15
+ sourceType: "url";
16
+ url: string;
17
+ title?: string;
18
+ }
19
+ | {
20
+ type: "source";
21
+ id: string;
22
+ sourceType: "document";
23
+ mediaType: string;
24
+ title?: string;
25
+ filename?: string;
26
+ };
27
+
28
+ export type HostedStreamPartForUiChunkMapping =
29
+ | {
30
+ type: "start";
31
+ }
32
+ | {
33
+ type: "start-step";
34
+ }
35
+ | {
36
+ type: "finish-step";
37
+ }
38
+ | {
39
+ type: "finish";
40
+ finishReason?: string;
41
+ }
42
+ | {
43
+ type: "abort";
44
+ }
45
+ | {
46
+ type: "reasoning-start";
47
+ id: string;
48
+ }
49
+ | {
50
+ type: "reasoning-delta";
51
+ id: string;
52
+ text: string;
53
+ }
54
+ | {
55
+ type: "reasoning-end";
56
+ id: string;
57
+ }
58
+ | {
59
+ type: "text-start";
60
+ id: string;
61
+ }
62
+ | {
63
+ type: "text-delta";
64
+ id: string;
65
+ text: string;
66
+ }
67
+ | {
68
+ type: "text-end";
69
+ id: string;
70
+ }
71
+ | HostedStreamSourcePart
72
+ | {
73
+ type: "file";
74
+ file: {
75
+ mediaType: string;
76
+ base64: string;
77
+ };
78
+ }
79
+ | {
80
+ type: "tool-input-start";
81
+ id: string;
82
+ toolName: string;
83
+ }
84
+ | {
85
+ type: "tool-input-delta";
86
+ id: string;
87
+ delta: string;
88
+ }
89
+ | {
90
+ type: "tool-call";
91
+ toolCallId: string;
92
+ toolName: string;
93
+ input: unknown;
94
+ invalid: true;
95
+ error: unknown;
96
+ }
97
+ | {
98
+ type: "tool-call";
99
+ toolCallId: string;
100
+ toolName: string;
101
+ input: unknown;
102
+ invalid?: false;
103
+ }
104
+ | {
105
+ type: "tool-approval-request";
106
+ approvalId: string;
107
+ toolCall: {
108
+ toolCallId: string;
109
+ };
110
+ }
111
+ | {
112
+ type: "tool-result";
113
+ toolCallId: string;
114
+ toolName: string;
115
+ input: unknown;
116
+ output: unknown;
117
+ }
118
+ | {
119
+ type: "tool-error";
120
+ toolCallId: string;
121
+ toolName: string;
122
+ input: unknown;
123
+ error: unknown;
124
+ }
125
+ | {
126
+ type: "tool-output-denied";
127
+ toolCallId: string;
128
+ }
129
+ | {
130
+ type: "error";
131
+ error: unknown;
132
+ }
133
+ | {
134
+ type: "tool-input-end";
135
+ }
136
+ | {
137
+ type: "raw";
138
+ };
139
+
140
+ function defaultOnError(error: unknown): string {
141
+ return error instanceof Error ? error.message : String(error);
142
+ }
143
+
144
+ function mapHostedStreamSourceToUiChunks(
145
+ part: HostedStreamSourcePart,
146
+ sendSources: boolean,
147
+ ): ChatUiMessageChunk<ChatMessageMetadata>[] {
148
+ if (!sendSources) {
149
+ return [];
150
+ }
151
+
152
+ if (part.sourceType === "url") {
153
+ return [{
154
+ type: "source-url",
155
+ sourceId: part.id,
156
+ url: part.url,
157
+ ...(part.title ? { title: part.title } : {}),
158
+ }];
159
+ }
160
+
161
+ return [
162
+ {
163
+ type: "source-document",
164
+ sourceId: part.id,
165
+ mediaType: part.mediaType,
166
+ title: part.title ?? part.filename ?? part.id,
167
+ ...(part.filename ? { filename: part.filename } : {}),
168
+ },
169
+ ];
170
+ }
171
+
172
+ function mapToolCallPartToUiChunks(
173
+ part: Extract<HostedStreamPartForUiChunkMapping, { type: "tool-call" }>,
174
+ onError: (error: unknown) => string,
175
+ ): ChatUiMessageChunk<ChatMessageMetadata>[] {
176
+ if (part.invalid) {
177
+ return [{
178
+ type: "tool-input-error",
179
+ toolCallId: part.toolCallId,
180
+ toolName: part.toolName,
181
+ input: part.input,
182
+ errorText: onError(part.error),
183
+ }];
184
+ }
185
+
186
+ return [{
187
+ type: "tool-input-available",
188
+ toolCallId: part.toolCallId,
189
+ toolName: part.toolName,
190
+ input: part.input,
191
+ }];
192
+ }
193
+
194
+ function mapToolErrorPartToUiChunks(
195
+ part: Extract<HostedStreamPartForUiChunkMapping, { type: "tool-error" }>,
196
+ onError: (error: unknown) => string,
197
+ ): ChatUiMessageChunk<ChatMessageMetadata>[] {
198
+ return [
199
+ {
200
+ type: "tool-input-start",
201
+ toolCallId: part.toolCallId,
202
+ toolName: part.toolName,
203
+ },
204
+ {
205
+ type: "tool-input-error",
206
+ toolCallId: part.toolCallId,
207
+ toolName: part.toolName,
208
+ input: part.input,
209
+ errorText: onError(part.error),
210
+ },
211
+ ];
212
+ }
213
+
214
+ export function mapHostedStreamPartToChatUiChunks(
215
+ part: HostedStreamPartForUiChunkMapping,
216
+ options: HostedUiChunkMappingOptions = {},
217
+ ): ChatUiMessageChunk<ChatMessageMetadata>[] {
218
+ const onError = options.onError ?? defaultOnError;
219
+ const sendReasoning = options.sendReasoning ?? true;
220
+ const sendSources = options.sendSources ?? true;
221
+
222
+ switch (part.type) {
223
+ case "start":
224
+ return [{ type: "start", ...(options.messageId ? { messageId: options.messageId } : {}) }];
225
+
226
+ case "start-step":
227
+ return [{ type: "start-step" }];
228
+
229
+ case "finish-step":
230
+ return [{ type: "finish-step" }];
231
+
232
+ case "finish":
233
+ return [{
234
+ type: "finish",
235
+ ...(part.finishReason ? { finishReason: part.finishReason } : {}),
236
+ }];
237
+
238
+ case "abort":
239
+ return [{ type: "abort" }];
240
+
241
+ case "reasoning-start":
242
+ return [{ type: "reasoning-start", id: options.reasoningMessageId ?? part.id }];
243
+
244
+ case "reasoning-delta":
245
+ return sendReasoning
246
+ ? [{ type: "reasoning-delta", id: options.reasoningMessageId ?? part.id, delta: part.text }]
247
+ : [];
248
+
249
+ case "reasoning-end":
250
+ return [{ type: "reasoning-end", id: options.reasoningMessageId ?? part.id }];
251
+
252
+ case "text-start":
253
+ return [{ type: "text-start", id: options.messageId ?? part.id }];
254
+
255
+ case "text-delta":
256
+ return [{ type: "text-delta", id: options.messageId ?? part.id, delta: part.text }];
257
+
258
+ case "text-end":
259
+ return [{ type: "text-end", id: options.messageId ?? part.id }];
260
+
261
+ case "source":
262
+ return mapHostedStreamSourceToUiChunks(part, sendSources);
263
+
264
+ case "file":
265
+ return [{
266
+ type: "file",
267
+ mediaType: part.file.mediaType,
268
+ url: `data:${part.file.mediaType};base64,${part.file.base64}`,
269
+ }];
270
+
271
+ case "tool-input-start":
272
+ return [{ type: "tool-input-start", toolCallId: part.id, toolName: part.toolName }];
273
+
274
+ case "tool-input-delta":
275
+ return [{ type: "tool-input-delta", toolCallId: part.id, inputTextDelta: part.delta }];
276
+
277
+ case "tool-call":
278
+ return mapToolCallPartToUiChunks(part, onError);
279
+
280
+ case "tool-approval-request":
281
+ return [{
282
+ type: "tool-approval-request",
283
+ approvalId: part.approvalId,
284
+ toolCallId: part.toolCall.toolCallId,
285
+ }];
286
+
287
+ case "tool-result":
288
+ return [{ type: "tool-output-available", toolCallId: part.toolCallId, output: part.output }];
289
+
290
+ case "tool-error":
291
+ return mapToolErrorPartToUiChunks(part, onError);
292
+
293
+ case "tool-output-denied":
294
+ return [{ type: "tool-output-denied", toolCallId: part.toolCallId }];
295
+
296
+ case "error":
297
+ return [{ type: "error", errorText: onError(part.error) }];
298
+
299
+ case "tool-input-end":
300
+ case "raw":
301
+ return [];
302
+ }
303
+ }
@@ -236,6 +236,11 @@ export {
236
236
  normalizeChatUiMessageChunk,
237
237
  normalizeChatUiMessageStream,
238
238
  } from "./chat-ui-message-helpers.js";
239
+ export {
240
+ type HostedStreamPartForUiChunkMapping,
241
+ type HostedUiChunkMappingOptions,
242
+ mapHostedStreamPartToChatUiChunks,
243
+ } from "./hosted-ui-chunk-mapping.js";
239
244
 
240
245
  export {
241
246
  useCompletion,