@jacobbd/relay-ai 0.12.6 → 0.12.9

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.
@@ -7,7 +7,7 @@ import { join } from "path";
7
7
  // package.json
8
8
  var package_default = {
9
9
  name: "@jacobbd/relay-ai",
10
- version: "0.12.6",
10
+ version: "0.12.9",
11
11
  publishConfig: {
12
12
  access: "public"
13
13
  },
@@ -3595,12 +3595,14 @@ async function createLanguageModel(spec) {
3595
3595
  var ANTHROPIC_EFFORT_LEVELS = ["low", "medium", "high"];
3596
3596
  var OPENAI_EFFORT_LEVELS = ["low", "medium", "high"];
3597
3597
  var GEMINI_EFFORT_LEVELS = ["low", "medium", "high"];
3598
- var MISTRAL_EFFORT_LEVELS = ["high", "off"];
3598
+ var MISTRAL_EFFORT_LEVELS = ["high", "none"];
3599
3599
  var XAI_CHAT_EFFORT_LEVELS = ["low", "high"];
3600
3600
  var XAI_RESPONSES_EFFORT_LEVELS = ["low", "medium", "high"];
3601
3601
  var OPENROUTER_EFFORT_LEVELS = ["none", "minimal", "low", "medium", "high", "xhigh"];
3602
- var DEEPSEEK_EFFORT_LEVELS = ["high", "max", "off"];
3602
+ var DEEPSEEK_EFFORT_LEVELS = ["high", "max", "none"];
3603
+ var DEEPSEEK_NATIVE_EFFORT_LEVELS = ["low", "medium", "high", "xhigh", "none"];
3603
3604
  var GLM_52_EFFORT_LEVELS = ["high", "xhigh"];
3605
+ var GLM_53_EFFORT_LEVELS = ["low", "medium", "high", "xhigh"];
3604
3606
  var EMPTY_REASONING = {
3605
3607
  levels: [],
3606
3608
  defaultLevel: "",
@@ -3666,9 +3668,10 @@ function xaiDefaultReasoningEffort(modelId) {
3666
3668
  if (lower === "grok-4.5" || lower.startsWith("grok-4.5-")) return "high";
3667
3669
  return "low";
3668
3670
  }
3671
+ var DEEPSEEK_V4_REASONING_ID = /^deepseek-v4(?:\.\d+)?-(?:flash|pro)(?:-|$)/;
3669
3672
  function isDeepSeekReasoningModel(modelId) {
3670
3673
  const lower = modelId.toLowerCase();
3671
- return lower === "deepseek-v4-flash" || lower === "deepseek-v4-pro" || lower.startsWith("deepseek-v4-flash-") || lower.startsWith("deepseek-v4-pro-") || lower === "deepseek-reasoner" || lower === "deepseek-chat";
3674
+ return DEEPSEEK_V4_REASONING_ID.test(lower) || lower === "deepseek-reasoner" || lower === "deepseek-chat";
3672
3675
  }
3673
3676
  function isKimiReasoningModel(modelId) {
3674
3677
  const lower = modelId.toLowerCase();
@@ -3678,6 +3681,10 @@ function isGlm52ReasoningModel(modelId) {
3678
3681
  const lower = modelId.toLowerCase();
3679
3682
  return lower === "glm-5.2" || lower === "z-ai/glm-5.2" || lower === "zai/glm-5.2" || lower === "zai-org/glm-5.2" || lower === "zai-org/glm5.2" || lower === "glm5.2";
3680
3683
  }
3684
+ var GLM_53_REASONING_ID = /^(?:[a-z0-9-]+\/)?glm-?5\.3(?:-|$)/;
3685
+ function isGlm53ReasoningModel(modelId) {
3686
+ return GLM_53_REASONING_ID.test(modelId.toLowerCase().trim());
3687
+ }
3681
3688
  function toCamelCase(str) {
3682
3689
  return str.replace(/[-_]([a-z])/g, (_, g) => g.toUpperCase());
3683
3690
  }
@@ -3716,37 +3723,41 @@ function openRouterReasoningCapabilities(metadata) {
3716
3723
  }
3717
3724
  return EMPTY_REASONING;
3718
3725
  }
3719
- function mapCodexEffortToDeepSeek(effort) {
3726
+ function deepSeekAcceptsNativeEfforts(metadata) {
3727
+ const providerId = metadata?.providerId?.toLowerCase();
3728
+ if (providerId === "go" || providerId === "zen" || providerId === "opencode-go" || providerId === "opencode") {
3729
+ return true;
3730
+ }
3731
+ return metadata?.apiBaseUrl?.includes("opencode.ai") === true;
3732
+ }
3733
+ function mapCodexEffortToDeepSeek(effort, nativeEfforts) {
3720
3734
  switch (effort) {
3721
3735
  case "off":
3722
3736
  case "none":
3723
3737
  return "off";
3724
3738
  case "low":
3739
+ return nativeEfforts ? "low" : "high";
3725
3740
  case "medium":
3741
+ return nativeEfforts ? "medium" : "high";
3726
3742
  case "high":
3727
3743
  return "high";
3728
3744
  case "xhigh":
3729
3745
  case "max":
3730
3746
  return "max";
3731
3747
  default:
3732
- if (effort === "high" || effort === "max") return effort;
3733
3748
  return void 0;
3734
3749
  }
3735
3750
  }
3736
- function deepSeekEffortProviderOptions(effort) {
3737
- const mapped = mapCodexEffortToDeepSeek(effort);
3751
+ function deepSeekEffortProviderOptions(effort, metadata) {
3752
+ const mapped = mapCodexEffortToDeepSeek(effort, deepSeekAcceptsNativeEfforts(metadata));
3738
3753
  if (!mapped) return void 0;
3754
+ const key = metadata?.providerId ? toCamelCase(metadata.providerId) : "openaiCompatible";
3739
3755
  const thinking = { type: mapped === "off" ? "disabled" : "enabled" };
3740
- const spread = { thinking };
3741
3756
  if (mapped === "off") {
3742
- return {
3743
- deepseek: spread,
3744
- openaiCompatible: spread
3745
- };
3757
+ return { [key]: { thinking } };
3746
3758
  }
3747
3759
  return {
3748
- openaiCompatible: { reasoningEffort: mapped, ...spread },
3749
- deepseek: spread
3760
+ [key]: { reasoningEffort: mapped, thinking }
3750
3761
  };
3751
3762
  }
3752
3763
  function mapCodexEffortToAnthropic(effort) {
@@ -3827,6 +3838,21 @@ function mapCodexEffortToGlm52(effort) {
3827
3838
  return void 0;
3828
3839
  }
3829
3840
  }
3841
+ function mapCodexEffortToGlm53(effort) {
3842
+ switch (effort) {
3843
+ case "low":
3844
+ return "low";
3845
+ case "medium":
3846
+ return "medium";
3847
+ case "high":
3848
+ return "high";
3849
+ case "xhigh":
3850
+ case "max":
3851
+ return "max";
3852
+ default:
3853
+ return void 0;
3854
+ }
3855
+ }
3830
3856
  function mapCodexEffortToXai(effort, supportsMedium) {
3831
3857
  switch (effort) {
3832
3858
  case "low":
@@ -3970,8 +3996,9 @@ function resolveRawReasoningCapabilities(npm, modelId, metadata) {
3970
3996
  return EMPTY_REASONING;
3971
3997
  }
3972
3998
  if (isDeepSeekReasoningModel(modelId)) {
3999
+ const levels = deepSeekAcceptsNativeEfforts(metadata) ? [...DEEPSEEK_NATIVE_EFFORT_LEVELS] : [...DEEPSEEK_EFFORT_LEVELS];
3973
4000
  return {
3974
- levels: [...DEEPSEEK_EFFORT_LEVELS],
4001
+ levels,
3975
4002
  defaultLevel: "high",
3976
4003
  supportsSummaries: true,
3977
4004
  mode: "controllable",
@@ -3991,6 +4018,17 @@ function resolveRawReasoningCapabilities(npm, modelId, metadata) {
3991
4018
  wireFormat: { kind: "openai-reasoning-effort" }
3992
4019
  };
3993
4020
  }
4021
+ if (isGlm53ReasoningModel(modelId)) {
4022
+ return {
4023
+ levels: [...GLM_53_EFFORT_LEVELS],
4024
+ defaultLevel: "high",
4025
+ supportsSummaries: false,
4026
+ mode: "controllable",
4027
+ source: "provider-rule",
4028
+ confidence: "documented",
4029
+ wireFormat: { kind: "openai-reasoning-effort" }
4030
+ };
4031
+ }
3994
4032
  if (isGlm52ReasoningModel(modelId)) {
3995
4033
  return {
3996
4034
  levels: [...GLM_52_EFFORT_LEVELS],
@@ -4086,7 +4124,7 @@ function effortProviderOptions(npm, effort, modelId, metadata) {
4086
4124
  if (npm === "@ai-sdk/openai-compatible" || npm === "@ai-sdk/openai") {
4087
4125
  if (!modelId) return void 0;
4088
4126
  if (isDeepSeekReasoningModel(modelId)) {
4089
- return deepSeekEffortProviderOptions(effort);
4127
+ return deepSeekEffortProviderOptions(effort, metadata);
4090
4128
  }
4091
4129
  if (isKimiReasoningModel(modelId)) {
4092
4130
  const reasoningEffort = mapCodexEffortToOpenAICompatible(effort);
@@ -4096,6 +4134,14 @@ function effortProviderOptions(npm, effort, modelId, metadata) {
4096
4134
  }
4097
4135
  return void 0;
4098
4136
  }
4137
+ if (isGlm53ReasoningModel(modelId)) {
4138
+ const reasoningEffort = mapCodexEffortToGlm53(effort);
4139
+ if (reasoningEffort) {
4140
+ const key = metadata?.providerId ? toCamelCase(metadata.providerId) : "openaiCompatible";
4141
+ return { [key]: { reasoningEffort } };
4142
+ }
4143
+ return void 0;
4144
+ }
4099
4145
  if (isGlm52ReasoningModel(modelId)) {
4100
4146
  const reasoningEffort = mapCodexEffortToGlm52(effort);
4101
4147
  if (reasoningEffort) {
@@ -4485,6 +4531,7 @@ function serializeToolResultContent(content) {
4485
4531
 
4486
4532
  // src/codex/upstream-error.ts
4487
4533
  var TRACE_FIELD_LIMIT = 4e3;
4534
+ var MAX_ERROR_MESSAGE_CHARS = 2e3;
4488
4535
  function clipTraceField(value) {
4489
4536
  return value.length <= TRACE_FIELD_LIMIT ? value : `${value.slice(0, TRACE_FIELD_LIMIT)}\u2026`;
4490
4537
  }
@@ -4559,7 +4606,7 @@ function formatUpstreamError(err) {
4559
4606
  }
4560
4607
  if (rec.message) {
4561
4608
  const short = sanitizeMessage(rec.message);
4562
- if (short && !short.includes("file://") && !short.includes("APICallError") && short.length < 240) {
4609
+ if (short && !short.includes("file://") && !short.includes("APICallError") && short.length < MAX_ERROR_MESSAGE_CHARS) {
4563
4610
  return rec.statusCode ? `${short} (HTTP ${rec.statusCode})` : short;
4564
4611
  }
4565
4612
  }
@@ -5274,4 +5321,4 @@ export {
5274
5321
  streamAnthropicResponse,
5275
5322
  generateAnthropicResponse
5276
5323
  };
5277
- //# sourceMappingURL=chunk-VPDX24ZR.js.map
5324
+ //# sourceMappingURL=chunk-3KCKQRRR.js.map