@jacobbd/relay-ai 0.12.5 → 0.12.8

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.5",
10
+ version: "0.12.8",
11
11
  publishConfig: {
12
12
  access: "public"
13
13
  },
@@ -694,6 +694,13 @@ function decodeAuthEntry(value) {
694
694
  if (typeof value === "string" && value.trim()) return value.trim();
695
695
  if (!value || typeof value !== "object") return null;
696
696
  const record = value;
697
+ if (record["type"] === "api" && typeof record["key"] === "string" && record["key"].trim()) {
698
+ return {
699
+ type: "api",
700
+ key: record["key"],
701
+ metadata: record["metadata"] && typeof record["metadata"] === "object" && !Array.isArray(record["metadata"]) ? record["metadata"] : void 0
702
+ };
703
+ }
697
704
  if (record["type"] === "oauth" && typeof record["access"] === "string" && typeof record["refresh"] === "string" && typeof record["expires"] === "number") {
698
705
  return {
699
706
  type: "oauth",
@@ -747,6 +754,9 @@ function readOpencodeAuthFile(env = process.env) {
747
754
  function isOpencodeOAuth(entry) {
748
755
  return !!entry && typeof entry === "object" && entry.type === "oauth";
749
756
  }
757
+ function isOpencodeApi(entry) {
758
+ return !!entry && typeof entry === "object" && entry.type === "api";
759
+ }
750
760
  function oauthCredentialToKeychainJson(cred) {
751
761
  return JSON.stringify(cred);
752
762
  }
@@ -3585,12 +3595,14 @@ async function createLanguageModel(spec) {
3585
3595
  var ANTHROPIC_EFFORT_LEVELS = ["low", "medium", "high"];
3586
3596
  var OPENAI_EFFORT_LEVELS = ["low", "medium", "high"];
3587
3597
  var GEMINI_EFFORT_LEVELS = ["low", "medium", "high"];
3588
- var MISTRAL_EFFORT_LEVELS = ["high", "off"];
3598
+ var MISTRAL_EFFORT_LEVELS = ["high", "none"];
3589
3599
  var XAI_CHAT_EFFORT_LEVELS = ["low", "high"];
3590
3600
  var XAI_RESPONSES_EFFORT_LEVELS = ["low", "medium", "high"];
3591
3601
  var OPENROUTER_EFFORT_LEVELS = ["none", "minimal", "low", "medium", "high", "xhigh"];
3592
- 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"];
3593
3604
  var GLM_52_EFFORT_LEVELS = ["high", "xhigh"];
3605
+ var GLM_53_EFFORT_LEVELS = ["low", "medium", "high", "xhigh"];
3594
3606
  var EMPTY_REASONING = {
3595
3607
  levels: [],
3596
3608
  defaultLevel: "",
@@ -3656,9 +3668,10 @@ function xaiDefaultReasoningEffort(modelId) {
3656
3668
  if (lower === "grok-4.5" || lower.startsWith("grok-4.5-")) return "high";
3657
3669
  return "low";
3658
3670
  }
3671
+ var DEEPSEEK_V4_REASONING_ID = /^deepseek-v4(?:\.\d+)?-(?:flash|pro)(?:-|$)/;
3659
3672
  function isDeepSeekReasoningModel(modelId) {
3660
3673
  const lower = modelId.toLowerCase();
3661
- 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";
3662
3675
  }
3663
3676
  function isKimiReasoningModel(modelId) {
3664
3677
  const lower = modelId.toLowerCase();
@@ -3668,6 +3681,10 @@ function isGlm52ReasoningModel(modelId) {
3668
3681
  const lower = modelId.toLowerCase();
3669
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";
3670
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
+ }
3671
3688
  function toCamelCase(str) {
3672
3689
  return str.replace(/[-_]([a-z])/g, (_, g) => g.toUpperCase());
3673
3690
  }
@@ -3706,37 +3723,41 @@ function openRouterReasoningCapabilities(metadata) {
3706
3723
  }
3707
3724
  return EMPTY_REASONING;
3708
3725
  }
3709
- 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) {
3710
3734
  switch (effort) {
3711
3735
  case "off":
3712
3736
  case "none":
3713
3737
  return "off";
3714
3738
  case "low":
3739
+ return nativeEfforts ? "low" : "high";
3715
3740
  case "medium":
3741
+ return nativeEfforts ? "medium" : "high";
3716
3742
  case "high":
3717
3743
  return "high";
3718
3744
  case "xhigh":
3719
3745
  case "max":
3720
3746
  return "max";
3721
3747
  default:
3722
- if (effort === "high" || effort === "max") return effort;
3723
3748
  return void 0;
3724
3749
  }
3725
3750
  }
3726
- function deepSeekEffortProviderOptions(effort) {
3727
- const mapped = mapCodexEffortToDeepSeek(effort);
3751
+ function deepSeekEffortProviderOptions(effort, metadata) {
3752
+ const mapped = mapCodexEffortToDeepSeek(effort, deepSeekAcceptsNativeEfforts(metadata));
3728
3753
  if (!mapped) return void 0;
3754
+ const key = metadata?.providerId ? toCamelCase(metadata.providerId) : "openaiCompatible";
3729
3755
  const thinking = { type: mapped === "off" ? "disabled" : "enabled" };
3730
- const spread = { thinking };
3731
3756
  if (mapped === "off") {
3732
- return {
3733
- deepseek: spread,
3734
- openaiCompatible: spread
3735
- };
3757
+ return { [key]: { thinking } };
3736
3758
  }
3737
3759
  return {
3738
- openaiCompatible: { reasoningEffort: mapped, ...spread },
3739
- deepseek: spread
3760
+ [key]: { reasoningEffort: mapped, thinking }
3740
3761
  };
3741
3762
  }
3742
3763
  function mapCodexEffortToAnthropic(effort) {
@@ -3817,6 +3838,21 @@ function mapCodexEffortToGlm52(effort) {
3817
3838
  return void 0;
3818
3839
  }
3819
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
+ }
3820
3856
  function mapCodexEffortToXai(effort, supportsMedium) {
3821
3857
  switch (effort) {
3822
3858
  case "low":
@@ -3960,8 +3996,9 @@ function resolveRawReasoningCapabilities(npm, modelId, metadata) {
3960
3996
  return EMPTY_REASONING;
3961
3997
  }
3962
3998
  if (isDeepSeekReasoningModel(modelId)) {
3999
+ const levels = deepSeekAcceptsNativeEfforts(metadata) ? [...DEEPSEEK_NATIVE_EFFORT_LEVELS] : [...DEEPSEEK_EFFORT_LEVELS];
3963
4000
  return {
3964
- levels: [...DEEPSEEK_EFFORT_LEVELS],
4001
+ levels,
3965
4002
  defaultLevel: "high",
3966
4003
  supportsSummaries: true,
3967
4004
  mode: "controllable",
@@ -3981,6 +4018,17 @@ function resolveRawReasoningCapabilities(npm, modelId, metadata) {
3981
4018
  wireFormat: { kind: "openai-reasoning-effort" }
3982
4019
  };
3983
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
+ }
3984
4032
  if (isGlm52ReasoningModel(modelId)) {
3985
4033
  return {
3986
4034
  levels: [...GLM_52_EFFORT_LEVELS],
@@ -4076,7 +4124,7 @@ function effortProviderOptions(npm, effort, modelId, metadata) {
4076
4124
  if (npm === "@ai-sdk/openai-compatible" || npm === "@ai-sdk/openai") {
4077
4125
  if (!modelId) return void 0;
4078
4126
  if (isDeepSeekReasoningModel(modelId)) {
4079
- return deepSeekEffortProviderOptions(effort);
4127
+ return deepSeekEffortProviderOptions(effort, metadata);
4080
4128
  }
4081
4129
  if (isKimiReasoningModel(modelId)) {
4082
4130
  const reasoningEffort = mapCodexEffortToOpenAICompatible(effort);
@@ -4086,6 +4134,14 @@ function effortProviderOptions(npm, effort, modelId, metadata) {
4086
4134
  }
4087
4135
  return void 0;
4088
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
+ }
4089
4145
  if (isGlm52ReasoningModel(modelId)) {
4090
4146
  const reasoningEffort = mapCodexEffortToGlm52(effort);
4091
4147
  if (reasoningEffort) {
@@ -5190,6 +5246,7 @@ export {
5190
5246
  routeLookupIds,
5191
5247
  readOpencodeAuthFile,
5192
5248
  isOpencodeOAuth,
5249
+ isOpencodeApi,
5193
5250
  oauthCredentialToKeychainJson,
5194
5251
  tokensToStoredCredential,
5195
5252
  supportsNativeOAuth,
@@ -5263,4 +5320,4 @@ export {
5263
5320
  streamAnthropicResponse,
5264
5321
  generateAnthropicResponse
5265
5322
  };
5266
- //# sourceMappingURL=chunk-2LUDFIZX.js.map
5323
+ //# sourceMappingURL=chunk-HLPRPOIV.js.map