@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.
@@ -50,7 +50,7 @@ import { join as join2 } from "path";
50
50
  // package.json
51
51
  var package_default = {
52
52
  name: "@jacobbd/relay-ai",
53
- version: "0.12.5",
53
+ version: "0.12.8",
54
54
  publishConfig: {
55
55
  access: "public"
56
56
  },
@@ -1513,12 +1513,14 @@ async function createLanguageModel(spec) {
1513
1513
  var ANTHROPIC_EFFORT_LEVELS = ["low", "medium", "high"];
1514
1514
  var OPENAI_EFFORT_LEVELS = ["low", "medium", "high"];
1515
1515
  var GEMINI_EFFORT_LEVELS = ["low", "medium", "high"];
1516
- var MISTRAL_EFFORT_LEVELS = ["high", "off"];
1516
+ var MISTRAL_EFFORT_LEVELS = ["high", "none"];
1517
1517
  var XAI_CHAT_EFFORT_LEVELS = ["low", "high"];
1518
1518
  var XAI_RESPONSES_EFFORT_LEVELS = ["low", "medium", "high"];
1519
1519
  var OPENROUTER_EFFORT_LEVELS = ["none", "minimal", "low", "medium", "high", "xhigh"];
1520
- var DEEPSEEK_EFFORT_LEVELS = ["high", "max", "off"];
1520
+ var DEEPSEEK_EFFORT_LEVELS = ["high", "max", "none"];
1521
+ var DEEPSEEK_NATIVE_EFFORT_LEVELS = ["low", "medium", "high", "xhigh", "none"];
1521
1522
  var GLM_52_EFFORT_LEVELS = ["high", "xhigh"];
1523
+ var GLM_53_EFFORT_LEVELS = ["low", "medium", "high", "xhigh"];
1522
1524
  var EMPTY_REASONING = {
1523
1525
  levels: [],
1524
1526
  defaultLevel: "",
@@ -1574,9 +1576,10 @@ function xaiDefaultReasoningEffort(modelId) {
1574
1576
  if (lower === "grok-4.5" || lower.startsWith("grok-4.5-")) return "high";
1575
1577
  return "low";
1576
1578
  }
1579
+ var DEEPSEEK_V4_REASONING_ID = /^deepseek-v4(?:\.\d+)?-(?:flash|pro)(?:-|$)/;
1577
1580
  function isDeepSeekReasoningModel(modelId) {
1578
1581
  const lower = modelId.toLowerCase();
1579
- 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";
1582
+ return DEEPSEEK_V4_REASONING_ID.test(lower) || lower === "deepseek-reasoner" || lower === "deepseek-chat";
1580
1583
  }
1581
1584
  function isKimiReasoningModel(modelId) {
1582
1585
  const lower = modelId.toLowerCase();
@@ -1586,6 +1589,10 @@ function isGlm52ReasoningModel(modelId) {
1586
1589
  const lower = modelId.toLowerCase();
1587
1590
  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";
1588
1591
  }
1592
+ var GLM_53_REASONING_ID = /^(?:[a-z0-9-]+\/)?glm-?5\.3(?:-|$)/;
1593
+ function isGlm53ReasoningModel(modelId) {
1594
+ return GLM_53_REASONING_ID.test(modelId.toLowerCase().trim());
1595
+ }
1589
1596
  function toCamelCase(str) {
1590
1597
  return str.replace(/[-_]([a-z])/g, (_, g) => g.toUpperCase());
1591
1598
  }
@@ -1624,37 +1631,41 @@ function openRouterReasoningCapabilities(metadata) {
1624
1631
  }
1625
1632
  return EMPTY_REASONING;
1626
1633
  }
1627
- function mapCodexEffortToDeepSeek(effort) {
1634
+ function deepSeekAcceptsNativeEfforts(metadata) {
1635
+ const providerId = metadata?.providerId?.toLowerCase();
1636
+ if (providerId === "go" || providerId === "zen" || providerId === "opencode-go" || providerId === "opencode") {
1637
+ return true;
1638
+ }
1639
+ return metadata?.apiBaseUrl?.includes("opencode.ai") === true;
1640
+ }
1641
+ function mapCodexEffortToDeepSeek(effort, nativeEfforts) {
1628
1642
  switch (effort) {
1629
1643
  case "off":
1630
1644
  case "none":
1631
1645
  return "off";
1632
1646
  case "low":
1647
+ return nativeEfforts ? "low" : "high";
1633
1648
  case "medium":
1649
+ return nativeEfforts ? "medium" : "high";
1634
1650
  case "high":
1635
1651
  return "high";
1636
1652
  case "xhigh":
1637
1653
  case "max":
1638
1654
  return "max";
1639
1655
  default:
1640
- if (effort === "high" || effort === "max") return effort;
1641
1656
  return void 0;
1642
1657
  }
1643
1658
  }
1644
- function deepSeekEffortProviderOptions(effort) {
1645
- const mapped = mapCodexEffortToDeepSeek(effort);
1659
+ function deepSeekEffortProviderOptions(effort, metadata) {
1660
+ const mapped = mapCodexEffortToDeepSeek(effort, deepSeekAcceptsNativeEfforts(metadata));
1646
1661
  if (!mapped) return void 0;
1662
+ const key = metadata?.providerId ? toCamelCase(metadata.providerId) : "openaiCompatible";
1647
1663
  const thinking = { type: mapped === "off" ? "disabled" : "enabled" };
1648
- const spread = { thinking };
1649
1664
  if (mapped === "off") {
1650
- return {
1651
- deepseek: spread,
1652
- openaiCompatible: spread
1653
- };
1665
+ return { [key]: { thinking } };
1654
1666
  }
1655
1667
  return {
1656
- openaiCompatible: { reasoningEffort: mapped, ...spread },
1657
- deepseek: spread
1668
+ [key]: { reasoningEffort: mapped, thinking }
1658
1669
  };
1659
1670
  }
1660
1671
  function mapCodexEffortToAnthropic(effort) {
@@ -1735,6 +1746,21 @@ function mapCodexEffortToGlm52(effort) {
1735
1746
  return void 0;
1736
1747
  }
1737
1748
  }
1749
+ function mapCodexEffortToGlm53(effort) {
1750
+ switch (effort) {
1751
+ case "low":
1752
+ return "low";
1753
+ case "medium":
1754
+ return "medium";
1755
+ case "high":
1756
+ return "high";
1757
+ case "xhigh":
1758
+ case "max":
1759
+ return "max";
1760
+ default:
1761
+ return void 0;
1762
+ }
1763
+ }
1738
1764
  function mapCodexEffortToXai(effort, supportsMedium) {
1739
1765
  switch (effort) {
1740
1766
  case "low":
@@ -1878,8 +1904,9 @@ function resolveRawReasoningCapabilities(npm, modelId, metadata) {
1878
1904
  return EMPTY_REASONING;
1879
1905
  }
1880
1906
  if (isDeepSeekReasoningModel(modelId)) {
1907
+ const levels = deepSeekAcceptsNativeEfforts(metadata) ? [...DEEPSEEK_NATIVE_EFFORT_LEVELS] : [...DEEPSEEK_EFFORT_LEVELS];
1881
1908
  return {
1882
- levels: [...DEEPSEEK_EFFORT_LEVELS],
1909
+ levels,
1883
1910
  defaultLevel: "high",
1884
1911
  supportsSummaries: true,
1885
1912
  mode: "controllable",
@@ -1899,6 +1926,17 @@ function resolveRawReasoningCapabilities(npm, modelId, metadata) {
1899
1926
  wireFormat: { kind: "openai-reasoning-effort" }
1900
1927
  };
1901
1928
  }
1929
+ if (isGlm53ReasoningModel(modelId)) {
1930
+ return {
1931
+ levels: [...GLM_53_EFFORT_LEVELS],
1932
+ defaultLevel: "high",
1933
+ supportsSummaries: false,
1934
+ mode: "controllable",
1935
+ source: "provider-rule",
1936
+ confidence: "documented",
1937
+ wireFormat: { kind: "openai-reasoning-effort" }
1938
+ };
1939
+ }
1902
1940
  if (isGlm52ReasoningModel(modelId)) {
1903
1941
  return {
1904
1942
  levels: [...GLM_52_EFFORT_LEVELS],
@@ -1988,7 +2026,7 @@ function effortProviderOptions(npm, effort, modelId, metadata) {
1988
2026
  if (npm === "@ai-sdk/openai-compatible" || npm === "@ai-sdk/openai") {
1989
2027
  if (!modelId) return void 0;
1990
2028
  if (isDeepSeekReasoningModel(modelId)) {
1991
- return deepSeekEffortProviderOptions(effort);
2029
+ return deepSeekEffortProviderOptions(effort, metadata);
1992
2030
  }
1993
2031
  if (isKimiReasoningModel(modelId)) {
1994
2032
  const reasoningEffort = mapCodexEffortToOpenAICompatible(effort);
@@ -1998,6 +2036,14 @@ function effortProviderOptions(npm, effort, modelId, metadata) {
1998
2036
  }
1999
2037
  return void 0;
2000
2038
  }
2039
+ if (isGlm53ReasoningModel(modelId)) {
2040
+ const reasoningEffort = mapCodexEffortToGlm53(effort);
2041
+ if (reasoningEffort) {
2042
+ const key = metadata?.providerId ? toCamelCase(metadata.providerId) : "openaiCompatible";
2043
+ return { [key]: { reasoningEffort } };
2044
+ }
2045
+ return void 0;
2046
+ }
2001
2047
  if (isGlm52ReasoningModel(modelId)) {
2002
2048
  const reasoningEffort = mapCodexEffortToGlm52(effort);
2003
2049
  if (reasoningEffort) {