@shop-os/modelkit 0.3.5 → 0.3.6

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/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { ImageModel, experimental_generateVideo, generateText as generateText$1, LanguageModel, FlexibleSchema, InferSchema, ToolSet, Output, streamText as streamText$1, JSONValue, generateObject as generateObject$1, streamObject as streamObject$1, LanguageModelUsage } from 'ai';
1
+ import { ImageModel, experimental_generateVideo, generateText as generateText$1, LanguageModel, FlexibleSchema, InferSchema, ToolSet, Output, streamText as streamText$1, JSONValue, generateObject as generateObject$1, streamObject as streamObject$1, LanguageModelUsage, ProviderMetadata } from 'ai';
2
2
  export * from 'ai';
3
3
  export { Warning as AiWarning } from 'ai';
4
4
  import { z } from 'zod';
@@ -1302,7 +1302,7 @@ declare function mergeTextProviderOptions(catalog: CatalogModel, caller: AiTextP
1302
1302
  */
1303
1303
  declare function passthroughTextModel(model: TextModelInstance): CatalogModel;
1304
1304
  /** Canonical token usage for a completed text call. Quantity is total tokens. */
1305
- declare function textUsageEvent(model: CatalogModel, provider: string, usage: LanguageModelUsage): UsageEvent;
1305
+ declare function textUsageEvent(model: CatalogModel, provider: string, usage: LanguageModelUsage, providerMetadata?: ProviderMetadata): UsageEvent;
1306
1306
 
1307
1307
  /** The SDK's streamText option union; `experimental_prepareStep` is a generateText-only alias. */
1308
1308
  type StreamTextCallOptions<TOOLS extends ToolSet, OUTPUT extends Output.Output = Output.Output<string, string, never>> = ModelkitStreamTextOptions<TOOLS, OUTPUT> & {
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ImageModel, experimental_generateVideo, generateText as generateText$1, LanguageModel, FlexibleSchema, InferSchema, ToolSet, Output, streamText as streamText$1, JSONValue, generateObject as generateObject$1, streamObject as streamObject$1, LanguageModelUsage } from 'ai';
1
+ import { ImageModel, experimental_generateVideo, generateText as generateText$1, LanguageModel, FlexibleSchema, InferSchema, ToolSet, Output, streamText as streamText$1, JSONValue, generateObject as generateObject$1, streamObject as streamObject$1, LanguageModelUsage, ProviderMetadata } from 'ai';
2
2
  export * from 'ai';
3
3
  export { Warning as AiWarning } from 'ai';
4
4
  import { z } from 'zod';
@@ -1302,7 +1302,7 @@ declare function mergeTextProviderOptions(catalog: CatalogModel, caller: AiTextP
1302
1302
  */
1303
1303
  declare function passthroughTextModel(model: TextModelInstance): CatalogModel;
1304
1304
  /** Canonical token usage for a completed text call. Quantity is total tokens. */
1305
- declare function textUsageEvent(model: CatalogModel, provider: string, usage: LanguageModelUsage): UsageEvent;
1305
+ declare function textUsageEvent(model: CatalogModel, provider: string, usage: LanguageModelUsage, providerMetadata?: ProviderMetadata): UsageEvent;
1306
1306
 
1307
1307
  /** The SDK's streamText option union; `experimental_prepareStep` is a generateText-only alias. */
1308
1308
  type StreamTextCallOptions<TOOLS extends ToolSet, OUTPUT extends Output.Output = Output.Output<string, string, never>> = ModelkitStreamTextOptions<TOOLS, OUTPUT> & {
package/dist/index.js CHANGED
@@ -1191,12 +1191,18 @@ var TEXT_MODELS = [
1191
1191
  contextWindow: 1048576
1192
1192
  }
1193
1193
  }),
1194
+ // Perplexity stopped serving Sonar Chat Completions on 2026-09-27; @ai-sdk/perplexity 3.1
1195
+ // speaks the Agent API, which rejects the bare `sonar*` ids. Its migration guide maps Sonar
1196
+ // and Sonar Pro to the `fast` preset and Sonar Reasoning Pro to `low`
1197
+ // (docs.perplexity.ai/docs/agent-api/migrate-from-sonar/overview).
1194
1198
  text("sonar", "Sonar", "sonar", {
1199
+ lifecycle: "deprecated",
1200
+ replacedBy: "perplexity/sonar",
1195
1201
  exposure: [],
1196
1202
  display: {
1197
1203
  provider: "perplexity",
1198
1204
  costTier: 1,
1199
- description: "Perplexity Sonar lightweight web-grounded search model returning cited answers; 128K-token context."
1205
+ description: "Perplexity Sonar on Chat Completions, which Perplexity stopped serving on 2026-09-27; calls now fail."
1200
1206
  },
1201
1207
  capabilities: {
1202
1208
  vision: true,
@@ -1204,11 +1210,13 @@ var TEXT_MODELS = [
1204
1210
  }
1205
1211
  }),
1206
1212
  text("sonar-pro", "Sonar Pro", "sonar-pro", {
1213
+ lifecycle: "deprecated",
1214
+ replacedBy: "perplexity/fast",
1207
1215
  exposure: [],
1208
1216
  display: {
1209
1217
  provider: "perplexity",
1210
1218
  costTier: 2,
1211
- description: "Perplexity Sonar Pro advanced web-grounded search model for complex multi-step queries; 200K-token context."
1219
+ description: "Perplexity Sonar Pro on Chat Completions, which Perplexity stopped serving on 2026-09-27; calls now fail."
1212
1220
  },
1213
1221
  capabilities: {
1214
1222
  vision: true,
@@ -1216,12 +1224,49 @@ var TEXT_MODELS = [
1216
1224
  }
1217
1225
  }),
1218
1226
  text("sonar-reasoning-pro", "Sonar Reasoning Pro", "sonar-reasoning-pro", {
1227
+ lifecycle: "deprecated",
1228
+ replacedBy: "perplexity/fast",
1219
1229
  exposure: [],
1220
1230
  display: {
1221
1231
  provider: "perplexity",
1222
1232
  costTier: 2,
1223
- description: "Perplexity Sonar Reasoning Pro chain-of-thought web-grounded search model for complex problem-solving; 128K-token context."
1233
+ description: "Perplexity Sonar Reasoning Pro on Chat Completions, which Perplexity stopped serving on 2026-09-27; calls now fail."
1234
+ },
1235
+ capabilities: {
1236
+ vision: true,
1237
+ contextWindow: 128e3
1238
+ }
1239
+ }),
1240
+ // Sonar as an Agent API model. A bare model searches only when given the web_search
1241
+ // tool, so the row sends it on every call; the answer's sources come from its results.
1242
+ text("perplexity/sonar", "Perplexity Sonar", "perplexity/sonar", {
1243
+ exposure: [],
1244
+ providerOptions: {
1245
+ modelkit: { provider: "perplexity" },
1246
+ perplexity: { tools: [{ type: "web_search" }] }
1247
+ },
1248
+ display: {
1249
+ provider: "perplexity",
1250
+ costTier: 1,
1251
+ description: "Perplexity Sonar on the Agent API with web search, returning answers grounded in cited sources."
1252
+ },
1253
+ // Perplexity publishes no Agent API context window; Sonar's own is 128K.
1254
+ capabilities: {
1255
+ vision: true,
1256
+ contextWindow: 128e3
1257
+ }
1258
+ }),
1259
+ // The Agent API `fast` preset: openai/gpt-5.6-luna with one web search, Perplexity's
1260
+ // recommended replacement for Sonar and Sonar Pro.
1261
+ text("perplexity/fast", "Perplexity Fast", "fast", {
1262
+ exposure: [],
1263
+ providerOptions: { modelkit: { provider: "perplexity" } },
1264
+ display: {
1265
+ provider: "perplexity",
1266
+ costTier: 1,
1267
+ description: "Perplexity Agent API fast preset: a quick web-grounded answer from one search."
1224
1268
  },
1269
+ // No published preset window; Sonar's 128K, the size the preset replaces.
1225
1270
  capabilities: {
1226
1271
  vision: true,
1227
1272
  contextWindow: 128e3
@@ -2923,7 +2968,7 @@ function detectTextProvider(modelId) {
2923
2968
  if (id.startsWith("claude") || id.includes("anthropic.")) return "anthropic";
2924
2969
  if (id.startsWith("gemini") || id.startsWith("gemma")) return "google";
2925
2970
  if (id.startsWith("grok")) return "xai";
2926
- if (id.startsWith("sonar")) return "perplexity";
2971
+ if (id.startsWith("sonar") || id.startsWith("perplexity/")) return "perplexity";
2927
2972
  if (id.startsWith("deepseek")) return "deepseek";
2928
2973
  if (id.startsWith("kimi") || id.startsWith("moonshot")) return "moonshot";
2929
2974
  if (id.startsWith("minimax")) return "minimax";
@@ -8769,6 +8814,7 @@ function keysFromEnv(env, prefix = "") {
8769
8814
 
8770
8815
  // src/text.ts
8771
8816
  import "ai";
8817
+ import { z as z22 } from "zod";
8772
8818
  function mergeTextProviderOptions(catalog, caller) {
8773
8819
  const merged = {};
8774
8820
  const catalogOptions = catalog.providerOptions ?? {};
@@ -8807,11 +8853,18 @@ function passthroughTextModel(model) {
8807
8853
  pricingKind: "token"
8808
8854
  };
8809
8855
  }
8810
- function textUsageEvent(model, provider, usage2) {
8856
+ var perplexityCostSchema = z22.object({
8857
+ perplexity: z22.object({ cost: z22.object({ totalCost: z22.number().finite().nonnegative() }) })
8858
+ });
8859
+ function reportedCostUsd(metadata) {
8860
+ const parsed = perplexityCostSchema.safeParse(metadata);
8861
+ return parsed.success ? parsed.data.perplexity.cost.totalCost : void 0;
8862
+ }
8863
+ function textUsageEvent(model, provider, usage2, providerMetadata) {
8811
8864
  const inputTokens = usage2.inputTokens ?? 0;
8812
8865
  const outputTokens = usage2.outputTokens ?? 0;
8813
8866
  const total = usage2.totalTokens ?? inputTokens + outputTokens;
8814
- return {
8867
+ const event = {
8815
8868
  model: model.id,
8816
8869
  provider,
8817
8870
  modality: "TEXT",
@@ -8820,6 +8873,9 @@ function textUsageEvent(model, provider, usage2) {
8820
8873
  inputTokens,
8821
8874
  outputTokens
8822
8875
  };
8876
+ const cost = reportedCostUsd(providerMetadata);
8877
+ if (cost !== void 0) event.reportedCostUsd = cost;
8878
+ return event;
8823
8879
  }
8824
8880
 
8825
8881
  // src/text-steps.ts
@@ -8846,12 +8902,20 @@ function createTextSteps(initial, resolve, callerProviderOptions) {
8846
8902
  const grouped = /* @__PURE__ */ new Map();
8847
8903
  for (const [index, step] of results.entries()) {
8848
8904
  const target = steps.get(index) ?? initial;
8849
- const event = textUsageEvent(target.entry, target.provider, step.usage);
8905
+ const event = textUsageEvent(
8906
+ target.entry,
8907
+ target.provider,
8908
+ step.usage,
8909
+ step.providerMetadata
8910
+ );
8850
8911
  const previous = grouped.get(target.entry.id);
8851
8912
  if (previous) {
8852
8913
  previous.quantity += event.quantity;
8853
8914
  previous.inputTokens = (previous.inputTokens ?? 0) + (event.inputTokens ?? 0);
8854
8915
  previous.outputTokens = (previous.outputTokens ?? 0) + (event.outputTokens ?? 0);
8916
+ if (event.reportedCostUsd !== void 0) {
8917
+ previous.reportedCostUsd = (previous.reportedCostUsd ?? 0) + event.reportedCostUsd;
8918
+ }
8855
8919
  } else {
8856
8920
  grouped.set(target.entry.id, event);
8857
8921
  }
@@ -8870,7 +8934,7 @@ import {
8870
8934
  streamObject as aiStreamObject2,
8871
8935
  streamText as aiStreamText2
8872
8936
  } from "ai";
8873
- import { z as z22 } from "zod";
8937
+ import { z as z23 } from "zod";
8874
8938
 
8875
8939
  // src/generated-image.ts
8876
8940
  function toGeneratedImage(image) {
@@ -8952,10 +9016,10 @@ function textAbortOptions(sdk, context) {
8952
9016
  if (abortSignal) return { abortSignal };
8953
9017
  return {};
8954
9018
  }
8955
- var catalogId = z22.string();
8956
- var exactSize = z22.templateLiteral([z22.number(), "x", z22.number()]);
8957
- var sdkRatio = z22.templateLiteral([z22.number(), ":", z22.number()]);
8958
- var sizeTier = z22.enum(["512", "1K", "2K", "4K"]);
9019
+ var catalogId = z23.string();
9020
+ var exactSize = z23.templateLiteral([z23.number(), "x", z23.number()]);
9021
+ var sdkRatio = z23.templateLiteral([z23.number(), ":", z23.number()]);
9022
+ var sizeTier = z23.enum(["512", "1K", "2K", "4K"]);
8959
9023
  function isCatalogId(model) {
8960
9024
  return catalogId.safeParse(model).success;
8961
9025
  }
@@ -9524,7 +9588,9 @@ function createModelKit(config, adapters) {
9524
9588
  providerOptions: mergeTextProviderOptions(entry, options.providerOptions)
9525
9589
  };
9526
9590
  const result = await aiGenerateObject2(sdkOptions);
9527
- await emit(withRowUnit(textUsageEvent(entry, provider, result.usage)));
9591
+ await emit(
9592
+ withRowUnit(textUsageEvent(entry, provider, result.usage, result.providerMetadata))
9593
+ );
9528
9594
  return result;
9529
9595
  },
9530
9596
  streamObject(options, call = {}) {
@@ -9536,7 +9602,11 @@ function createModelKit(config, adapters) {
9536
9602
  model: languageModel2,
9537
9603
  providerOptions: mergeTextProviderOptions(entry, options.providerOptions),
9538
9604
  onFinish: async (event) => {
9539
- await emit(withRowUnit(textUsageEvent(entry, provider, event.usage)));
9605
+ await emit(
9606
+ withRowUnit(
9607
+ textUsageEvent(entry, provider, event.usage, event.providerMetadata)
9608
+ )
9609
+ );
9540
9610
  await callerOnFinish?.(event);
9541
9611
  }
9542
9612
  };