@shop-os/modelkit 0.3.5 → 0.3.7

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";
@@ -6706,6 +6751,7 @@ var openaiImageAdapter = {
6706
6751
 
6707
6752
  // src/adapters/prodia.ts
6708
6753
  var PRODIA_JOB_URL = "https://inference.prodia.com/v2/job";
6754
+ var FLUX_2_PRO_T2I_JOB = "inference.flux-2.pro.txt2img.v1";
6709
6755
  var FLUX_2_PRO_JOB = "inference.flux-2.pro.img2img.v1";
6710
6756
  var FLUX_KLEIN_T2I_JOB = "inference.flux-2.klein.txt2img.v1";
6711
6757
  var FLUX_KLEIN_I2I_JOB = "inference.flux-2.klein.img2img.v1";
@@ -6878,7 +6924,7 @@ async function generateProdiaImage(req, ctx) {
6878
6924
  safety_tolerance: 5
6879
6925
  };
6880
6926
  if (req.seed !== void 0) config.seed = req.seed;
6881
- job = { type: FLUX_2_PRO_JOB, config };
6927
+ job = { type: refs.length > 0 ? FLUX_2_PRO_JOB : FLUX_2_PRO_T2I_JOB, config };
6882
6928
  inputs = refs;
6883
6929
  accept = "image/png";
6884
6930
  mime = "image/png";
@@ -8769,6 +8815,7 @@ function keysFromEnv(env, prefix = "") {
8769
8815
 
8770
8816
  // src/text.ts
8771
8817
  import "ai";
8818
+ import { z as z22 } from "zod";
8772
8819
  function mergeTextProviderOptions(catalog, caller) {
8773
8820
  const merged = {};
8774
8821
  const catalogOptions = catalog.providerOptions ?? {};
@@ -8807,11 +8854,18 @@ function passthroughTextModel(model) {
8807
8854
  pricingKind: "token"
8808
8855
  };
8809
8856
  }
8810
- function textUsageEvent(model, provider, usage2) {
8857
+ var perplexityCostSchema = z22.object({
8858
+ perplexity: z22.object({ cost: z22.object({ totalCost: z22.number().finite().nonnegative() }) })
8859
+ });
8860
+ function reportedCostUsd(metadata) {
8861
+ const parsed = perplexityCostSchema.safeParse(metadata);
8862
+ return parsed.success ? parsed.data.perplexity.cost.totalCost : void 0;
8863
+ }
8864
+ function textUsageEvent(model, provider, usage2, providerMetadata) {
8811
8865
  const inputTokens = usage2.inputTokens ?? 0;
8812
8866
  const outputTokens = usage2.outputTokens ?? 0;
8813
8867
  const total = usage2.totalTokens ?? inputTokens + outputTokens;
8814
- return {
8868
+ const event = {
8815
8869
  model: model.id,
8816
8870
  provider,
8817
8871
  modality: "TEXT",
@@ -8820,6 +8874,9 @@ function textUsageEvent(model, provider, usage2) {
8820
8874
  inputTokens,
8821
8875
  outputTokens
8822
8876
  };
8877
+ const cost = reportedCostUsd(providerMetadata);
8878
+ if (cost !== void 0) event.reportedCostUsd = cost;
8879
+ return event;
8823
8880
  }
8824
8881
 
8825
8882
  // src/text-steps.ts
@@ -8846,12 +8903,20 @@ function createTextSteps(initial, resolve, callerProviderOptions) {
8846
8903
  const grouped = /* @__PURE__ */ new Map();
8847
8904
  for (const [index, step] of results.entries()) {
8848
8905
  const target = steps.get(index) ?? initial;
8849
- const event = textUsageEvent(target.entry, target.provider, step.usage);
8906
+ const event = textUsageEvent(
8907
+ target.entry,
8908
+ target.provider,
8909
+ step.usage,
8910
+ step.providerMetadata
8911
+ );
8850
8912
  const previous = grouped.get(target.entry.id);
8851
8913
  if (previous) {
8852
8914
  previous.quantity += event.quantity;
8853
8915
  previous.inputTokens = (previous.inputTokens ?? 0) + (event.inputTokens ?? 0);
8854
8916
  previous.outputTokens = (previous.outputTokens ?? 0) + (event.outputTokens ?? 0);
8917
+ if (event.reportedCostUsd !== void 0) {
8918
+ previous.reportedCostUsd = (previous.reportedCostUsd ?? 0) + event.reportedCostUsd;
8919
+ }
8855
8920
  } else {
8856
8921
  grouped.set(target.entry.id, event);
8857
8922
  }
@@ -8870,7 +8935,7 @@ import {
8870
8935
  streamObject as aiStreamObject2,
8871
8936
  streamText as aiStreamText2
8872
8937
  } from "ai";
8873
- import { z as z22 } from "zod";
8938
+ import { z as z23 } from "zod";
8874
8939
 
8875
8940
  // src/generated-image.ts
8876
8941
  function toGeneratedImage(image) {
@@ -8952,10 +9017,10 @@ function textAbortOptions(sdk, context) {
8952
9017
  if (abortSignal) return { abortSignal };
8953
9018
  return {};
8954
9019
  }
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"]);
9020
+ var catalogId = z23.string();
9021
+ var exactSize = z23.templateLiteral([z23.number(), "x", z23.number()]);
9022
+ var sdkRatio = z23.templateLiteral([z23.number(), ":", z23.number()]);
9023
+ var sizeTier = z23.enum(["512", "1K", "2K", "4K"]);
8959
9024
  function isCatalogId(model) {
8960
9025
  return catalogId.safeParse(model).success;
8961
9026
  }
@@ -9524,7 +9589,9 @@ function createModelKit(config, adapters) {
9524
9589
  providerOptions: mergeTextProviderOptions(entry, options.providerOptions)
9525
9590
  };
9526
9591
  const result = await aiGenerateObject2(sdkOptions);
9527
- await emit(withRowUnit(textUsageEvent(entry, provider, result.usage)));
9592
+ await emit(
9593
+ withRowUnit(textUsageEvent(entry, provider, result.usage, result.providerMetadata))
9594
+ );
9528
9595
  return result;
9529
9596
  },
9530
9597
  streamObject(options, call = {}) {
@@ -9536,7 +9603,11 @@ function createModelKit(config, adapters) {
9536
9603
  model: languageModel2,
9537
9604
  providerOptions: mergeTextProviderOptions(entry, options.providerOptions),
9538
9605
  onFinish: async (event) => {
9539
- await emit(withRowUnit(textUsageEvent(entry, provider, event.usage)));
9606
+ await emit(
9607
+ withRowUnit(
9608
+ textUsageEvent(entry, provider, event.usage, event.providerMetadata)
9609
+ )
9610
+ );
9540
9611
  await callerOnFinish?.(event);
9541
9612
  }
9542
9613
  };