@jaypie/llm 1.3.8 → 1.3.10

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.
Files changed (187) hide show
  1. package/dist/cjs/{src/constants.d.ts → constants.d.ts} +56 -7
  2. package/dist/cjs/index.cjs +404 -124
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs/index.d.cts +69 -10
  5. package/dist/{esm/src → cjs}/index.d.ts +1 -0
  6. package/dist/cjs/{src/operate → operate}/adapters/AnthropicAdapter.d.ts +3 -2
  7. package/dist/{esm/src → cjs}/operate/adapters/BedrockAdapter.d.ts +1 -1
  8. package/dist/cjs/{src/operate → operate}/adapters/GoogleAdapter.d.ts +1 -1
  9. package/dist/{esm/src → cjs}/operate/adapters/OpenAiAdapter.d.ts +7 -1
  10. package/dist/{esm/src → cjs}/operate/adapters/OpenRouterAdapter.d.ts +5 -1
  11. package/dist/cjs/operate/adapters/XaiAdapter.d.ts +24 -0
  12. package/dist/cjs/{src/operate → operate}/types.d.ts +5 -0
  13. package/dist/cjs/{src/providers → providers}/google/types.d.ts +5 -0
  14. package/dist/{esm/src → cjs}/types/LlmProvider.interface.d.ts +9 -0
  15. package/dist/cjs/util/effort.d.ts +42 -0
  16. package/dist/cjs/{src/util → util}/index.d.ts +1 -0
  17. package/dist/cjs/util/tallyOperate.d.ts +14 -0
  18. package/dist/esm/{src/constants.d.ts → constants.d.ts} +56 -7
  19. package/dist/esm/index.d.ts +69 -10
  20. package/dist/esm/index.js +404 -124
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/{src/operate → operate}/adapters/AnthropicAdapter.d.ts +3 -2
  23. package/dist/{cjs/src → esm}/operate/adapters/BedrockAdapter.d.ts +1 -1
  24. package/dist/esm/{src/operate → operate}/adapters/GoogleAdapter.d.ts +1 -1
  25. package/dist/{cjs/src → esm}/operate/adapters/OpenAiAdapter.d.ts +7 -1
  26. package/dist/{cjs/src → esm}/operate/adapters/OpenRouterAdapter.d.ts +5 -1
  27. package/dist/esm/operate/adapters/XaiAdapter.d.ts +24 -0
  28. package/dist/esm/{src/operate → operate}/types.d.ts +5 -0
  29. package/dist/esm/{src/providers → providers}/google/types.d.ts +5 -0
  30. package/dist/{cjs/src → esm}/types/LlmProvider.interface.d.ts +9 -0
  31. package/dist/esm/util/effort.d.ts +42 -0
  32. package/dist/esm/{src/util → util}/index.d.ts +1 -0
  33. package/dist/esm/util/tallyOperate.d.ts +14 -0
  34. package/package.json +1 -1
  35. package/dist/cjs/src/index.d.ts +0 -17
  36. package/dist/cjs/src/operate/adapters/XaiAdapter.d.ts +0 -14
  37. package/dist/esm/src/operate/adapters/XaiAdapter.d.ts +0 -14
  38. /package/dist/cjs/{src/Llm.d.ts → Llm.d.ts} +0 -0
  39. /package/dist/cjs/{src/observability → observability}/llmobs.d.ts +0 -0
  40. /package/dist/cjs/{src/operate → operate}/OperateLoop.d.ts +0 -0
  41. /package/dist/cjs/{src/operate → operate}/StreamLoop.d.ts +0 -0
  42. /package/dist/cjs/{src/operate → operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
  43. /package/dist/cjs/{src/operate → operate}/adapters/index.d.ts +0 -0
  44. /package/dist/cjs/{src/operate → operate}/hooks/HookRunner.d.ts +0 -0
  45. /package/dist/cjs/{src/operate → operate}/hooks/index.d.ts +0 -0
  46. /package/dist/cjs/{src/operate → operate}/index.d.ts +0 -0
  47. /package/dist/cjs/{src/operate → operate}/input/InputProcessor.d.ts +0 -0
  48. /package/dist/cjs/{src/operate → operate}/input/index.d.ts +0 -0
  49. /package/dist/cjs/{src/operate → operate}/progress/emitProgress.d.ts +0 -0
  50. /package/dist/cjs/{src/operate → operate}/progress/index.d.ts +0 -0
  51. /package/dist/cjs/{src/operate → operate}/response/ResponseBuilder.d.ts +0 -0
  52. /package/dist/cjs/{src/operate → operate}/response/index.d.ts +0 -0
  53. /package/dist/cjs/{src/operate → operate}/retry/RetryExecutor.d.ts +0 -0
  54. /package/dist/cjs/{src/operate → operate}/retry/RetryPolicy.d.ts +0 -0
  55. /package/dist/cjs/{src/operate → operate}/retry/createStaleRejectionGuard.d.ts +0 -0
  56. /package/dist/cjs/{src/operate → operate}/retry/index.d.ts +0 -0
  57. /package/dist/cjs/{src/operate → operate}/retry/isTransientNetworkError.d.ts +0 -0
  58. /package/dist/cjs/{src/providers → providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
  59. /package/dist/cjs/{src/providers → providers}/anthropic/client.d.ts +0 -0
  60. /package/dist/cjs/{src/providers → providers}/anthropic/index.d.ts +0 -0
  61. /package/dist/cjs/{src/providers → providers}/anthropic/types.d.ts +0 -0
  62. /package/dist/cjs/{src/providers → providers}/anthropic/utils.d.ts +0 -0
  63. /package/dist/cjs/{src/providers → providers}/bedrock/BedrockProvider.class.d.ts +0 -0
  64. /package/dist/cjs/{src/providers → providers}/bedrock/index.d.ts +0 -0
  65. /package/dist/cjs/{src/providers → providers}/bedrock/utils.d.ts +0 -0
  66. /package/dist/cjs/{src/providers → providers}/google/GoogleProvider.class.d.ts +0 -0
  67. /package/dist/cjs/{src/providers → providers}/google/client.d.ts +0 -0
  68. /package/dist/cjs/{src/providers → providers}/google/index.d.ts +0 -0
  69. /package/dist/cjs/{src/providers → providers}/google/utils.d.ts +0 -0
  70. /package/dist/cjs/{src/providers → providers}/openai/OpenAiProvider.class.d.ts +0 -0
  71. /package/dist/cjs/{src/providers → providers}/openai/client.d.ts +0 -0
  72. /package/dist/cjs/{src/providers → providers}/openai/index.d.ts +0 -0
  73. /package/dist/cjs/{src/providers → providers}/openai/responseFormat.d.ts +0 -0
  74. /package/dist/cjs/{src/providers → providers}/openai/types.d.ts +0 -0
  75. /package/dist/cjs/{src/providers → providers}/openai/utils.d.ts +0 -0
  76. /package/dist/cjs/{src/providers → providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
  77. /package/dist/cjs/{src/providers → providers}/openrouter/client.d.ts +0 -0
  78. /package/dist/cjs/{src/providers → providers}/openrouter/index.d.ts +0 -0
  79. /package/dist/cjs/{src/providers → providers}/openrouter/utils.d.ts +0 -0
  80. /package/dist/cjs/{src/providers → providers}/xai/XaiProvider.class.d.ts +0 -0
  81. /package/dist/cjs/{src/providers → providers}/xai/index.d.ts +0 -0
  82. /package/dist/cjs/{src/providers → providers}/xai/utils.d.ts +0 -0
  83. /package/dist/cjs/{src/tools → tools}/Toolkit.class.d.ts +0 -0
  84. /package/dist/cjs/{src/tools → tools}/index.d.ts +0 -0
  85. /package/dist/cjs/{src/tools → tools}/random.d.ts +0 -0
  86. /package/dist/cjs/{src/tools → tools}/roll.d.ts +0 -0
  87. /package/dist/cjs/{src/tools → tools}/time.d.ts +0 -0
  88. /package/dist/cjs/{src/tools → tools}/weather.d.ts +0 -0
  89. /package/dist/cjs/{src/types → types}/LlmOperateInput.guards.d.ts +0 -0
  90. /package/dist/cjs/{src/types → types}/LlmStreamChunk.interface.d.ts +0 -0
  91. /package/dist/cjs/{src/types → types}/LlmTool.interface.d.ts +0 -0
  92. /package/dist/cjs/{src/upload → upload}/detectMimeType.d.ts +0 -0
  93. /package/dist/cjs/{src/upload → upload}/extractPdfPages.d.ts +0 -0
  94. /package/dist/cjs/{src/upload → upload}/index.d.ts +0 -0
  95. /package/dist/cjs/{src/upload → upload}/loadLocalFile.d.ts +0 -0
  96. /package/dist/cjs/{src/upload → upload}/loadS3File.d.ts +0 -0
  97. /package/dist/cjs/{src/upload → upload}/resolveOperateInput.d.ts +0 -0
  98. /package/dist/cjs/{src/util → util}/determineModelProvider.d.ts +0 -0
  99. /package/dist/cjs/{src/util → util}/extractReasoning.d.ts +0 -0
  100. /package/dist/cjs/{src/util → util}/fillFormatArrays.d.ts +0 -0
  101. /package/dist/cjs/{src/util → util}/formatOperateInput.d.ts +0 -0
  102. /package/dist/cjs/{src/util → util}/formatOperateMessage.d.ts +0 -0
  103. /package/dist/cjs/{src/util → util}/jsonSchema.d.ts +0 -0
  104. /package/dist/cjs/{src/util → util}/jsonSchemaToOpenApi3.d.ts +0 -0
  105. /package/dist/cjs/{src/util → util}/logger.d.ts +0 -0
  106. /package/dist/cjs/{src/util → util}/maxOutputTokens.d.ts +0 -0
  107. /package/dist/cjs/{src/util → util}/maxTurnsFromOptions.d.ts +0 -0
  108. /package/dist/cjs/{src/util → util}/naturalZodSchema.d.ts +0 -0
  109. /package/dist/cjs/{src/util → util}/random.d.ts +0 -0
  110. /package/dist/cjs/{src/util → util}/repairFormatKeys.d.ts +0 -0
  111. /package/dist/cjs/{src/util → util}/sse.d.ts +0 -0
  112. /package/dist/cjs/{src/util → util}/tryParseNumber.d.ts +0 -0
  113. /package/dist/esm/{src/Llm.d.ts → Llm.d.ts} +0 -0
  114. /package/dist/esm/{src/observability → observability}/llmobs.d.ts +0 -0
  115. /package/dist/esm/{src/operate → operate}/OperateLoop.d.ts +0 -0
  116. /package/dist/esm/{src/operate → operate}/StreamLoop.d.ts +0 -0
  117. /package/dist/esm/{src/operate → operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
  118. /package/dist/esm/{src/operate → operate}/adapters/index.d.ts +0 -0
  119. /package/dist/esm/{src/operate → operate}/hooks/HookRunner.d.ts +0 -0
  120. /package/dist/esm/{src/operate → operate}/hooks/index.d.ts +0 -0
  121. /package/dist/esm/{src/operate → operate}/index.d.ts +0 -0
  122. /package/dist/esm/{src/operate → operate}/input/InputProcessor.d.ts +0 -0
  123. /package/dist/esm/{src/operate → operate}/input/index.d.ts +0 -0
  124. /package/dist/esm/{src/operate → operate}/progress/emitProgress.d.ts +0 -0
  125. /package/dist/esm/{src/operate → operate}/progress/index.d.ts +0 -0
  126. /package/dist/esm/{src/operate → operate}/response/ResponseBuilder.d.ts +0 -0
  127. /package/dist/esm/{src/operate → operate}/response/index.d.ts +0 -0
  128. /package/dist/esm/{src/operate → operate}/retry/RetryExecutor.d.ts +0 -0
  129. /package/dist/esm/{src/operate → operate}/retry/RetryPolicy.d.ts +0 -0
  130. /package/dist/esm/{src/operate → operate}/retry/createStaleRejectionGuard.d.ts +0 -0
  131. /package/dist/esm/{src/operate → operate}/retry/index.d.ts +0 -0
  132. /package/dist/esm/{src/operate → operate}/retry/isTransientNetworkError.d.ts +0 -0
  133. /package/dist/esm/{src/providers → providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
  134. /package/dist/esm/{src/providers → providers}/anthropic/client.d.ts +0 -0
  135. /package/dist/esm/{src/providers → providers}/anthropic/index.d.ts +0 -0
  136. /package/dist/esm/{src/providers → providers}/anthropic/types.d.ts +0 -0
  137. /package/dist/esm/{src/providers → providers}/anthropic/utils.d.ts +0 -0
  138. /package/dist/esm/{src/providers → providers}/bedrock/BedrockProvider.class.d.ts +0 -0
  139. /package/dist/esm/{src/providers → providers}/bedrock/index.d.ts +0 -0
  140. /package/dist/esm/{src/providers → providers}/bedrock/utils.d.ts +0 -0
  141. /package/dist/esm/{src/providers → providers}/google/GoogleProvider.class.d.ts +0 -0
  142. /package/dist/esm/{src/providers → providers}/google/client.d.ts +0 -0
  143. /package/dist/esm/{src/providers → providers}/google/index.d.ts +0 -0
  144. /package/dist/esm/{src/providers → providers}/google/utils.d.ts +0 -0
  145. /package/dist/esm/{src/providers → providers}/openai/OpenAiProvider.class.d.ts +0 -0
  146. /package/dist/esm/{src/providers → providers}/openai/client.d.ts +0 -0
  147. /package/dist/esm/{src/providers → providers}/openai/index.d.ts +0 -0
  148. /package/dist/esm/{src/providers → providers}/openai/responseFormat.d.ts +0 -0
  149. /package/dist/esm/{src/providers → providers}/openai/types.d.ts +0 -0
  150. /package/dist/esm/{src/providers → providers}/openai/utils.d.ts +0 -0
  151. /package/dist/esm/{src/providers → providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
  152. /package/dist/esm/{src/providers → providers}/openrouter/client.d.ts +0 -0
  153. /package/dist/esm/{src/providers → providers}/openrouter/index.d.ts +0 -0
  154. /package/dist/esm/{src/providers → providers}/openrouter/utils.d.ts +0 -0
  155. /package/dist/esm/{src/providers → providers}/xai/XaiProvider.class.d.ts +0 -0
  156. /package/dist/esm/{src/providers → providers}/xai/index.d.ts +0 -0
  157. /package/dist/esm/{src/providers → providers}/xai/utils.d.ts +0 -0
  158. /package/dist/esm/{src/tools → tools}/Toolkit.class.d.ts +0 -0
  159. /package/dist/esm/{src/tools → tools}/index.d.ts +0 -0
  160. /package/dist/esm/{src/tools → tools}/random.d.ts +0 -0
  161. /package/dist/esm/{src/tools → tools}/roll.d.ts +0 -0
  162. /package/dist/esm/{src/tools → tools}/time.d.ts +0 -0
  163. /package/dist/esm/{src/tools → tools}/weather.d.ts +0 -0
  164. /package/dist/esm/{src/types → types}/LlmOperateInput.guards.d.ts +0 -0
  165. /package/dist/esm/{src/types → types}/LlmStreamChunk.interface.d.ts +0 -0
  166. /package/dist/esm/{src/types → types}/LlmTool.interface.d.ts +0 -0
  167. /package/dist/esm/{src/upload → upload}/detectMimeType.d.ts +0 -0
  168. /package/dist/esm/{src/upload → upload}/extractPdfPages.d.ts +0 -0
  169. /package/dist/esm/{src/upload → upload}/index.d.ts +0 -0
  170. /package/dist/esm/{src/upload → upload}/loadLocalFile.d.ts +0 -0
  171. /package/dist/esm/{src/upload → upload}/loadS3File.d.ts +0 -0
  172. /package/dist/esm/{src/upload → upload}/resolveOperateInput.d.ts +0 -0
  173. /package/dist/esm/{src/util → util}/determineModelProvider.d.ts +0 -0
  174. /package/dist/esm/{src/util → util}/extractReasoning.d.ts +0 -0
  175. /package/dist/esm/{src/util → util}/fillFormatArrays.d.ts +0 -0
  176. /package/dist/esm/{src/util → util}/formatOperateInput.d.ts +0 -0
  177. /package/dist/esm/{src/util → util}/formatOperateMessage.d.ts +0 -0
  178. /package/dist/esm/{src/util → util}/jsonSchema.d.ts +0 -0
  179. /package/dist/esm/{src/util → util}/jsonSchemaToOpenApi3.d.ts +0 -0
  180. /package/dist/esm/{src/util → util}/logger.d.ts +0 -0
  181. /package/dist/esm/{src/util → util}/maxOutputTokens.d.ts +0 -0
  182. /package/dist/esm/{src/util → util}/maxTurnsFromOptions.d.ts +0 -0
  183. /package/dist/esm/{src/util → util}/naturalZodSchema.d.ts +0 -0
  184. /package/dist/esm/{src/util → util}/random.d.ts +0 -0
  185. /package/dist/esm/{src/util → util}/repairFormatKeys.d.ts +0 -0
  186. /package/dist/esm/{src/util → util}/sse.d.ts +0 -0
  187. /package/dist/esm/{src/util → util}/tryParseNumber.d.ts +0 -0
@@ -14,61 +14,61 @@ var aws = require('@jaypie/aws');
14
14
  var openmeteo = require('openmeteo');
15
15
 
16
16
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
17
- const FIRST_CLASS_PROVIDER = {
18
- // https://docs.anthropic.com/en/docs/about-claude/models/overview
19
- ANTHROPIC: {
20
- DEFAULT: "claude-sonnet-4-6",
21
- LARGE: "claude-opus-4-8",
22
- SMALL: "claude-sonnet-4-6",
23
- TINY: "claude-haiku-4-5",
24
- },
25
- // https://ai.google.dev/gemini-api/docs/models
26
- GOOGLE: {
27
- DEFAULT: "gemini-3.1-pro-preview",
28
- LARGE: "gemini-3.1-pro-preview",
29
- SMALL: "gemini-3.5-flash",
30
- TINY: "gemini-3.1-flash-lite",
31
- },
32
- // https://developers.openai.com/api/docs/models
33
- OPENAI: {
34
- DEFAULT: "gpt-5.4",
35
- LARGE: "gpt-5.5",
36
- SMALL: "gpt-5.4-mini",
37
- TINY: "gpt-5.4-nano",
38
- },
39
- // https://docs.x.ai/developers/models
40
- XAI: {
41
- DEFAULT: "grok-latest",
42
- LARGE: "grok-4.3-latest",
43
- SMALL: "grok-4-1-fast-reasoning",
44
- TINY: "grok-4-1-fast-non-reasoning",
45
- },
17
+ /**
18
+ * Provider-neutral reasoning-effort levels — a five-point relative scale that
19
+ * deliberately borrows no provider's vocabulary. Each adapter translates these
20
+ * to its provider's native control (OpenAI `reasoning.effort`, Anthropic
21
+ * `output_config.effort`, Gemini `thinkingLevel`/`thinkingBudget`, Grok
22
+ * `reasoning_effort`, OpenRouter `reasoning.effort`), spreading the scale across
23
+ * the provider's available range. Omitting `effort` leaves the provider default
24
+ * untouched, so it is safe to set across a fallback chain.
25
+ */
26
+ const EFFORT = {
27
+ LOWEST: "lowest",
28
+ LOW: "low",
29
+ MEDIUM: "medium",
30
+ HIGH: "high",
31
+ HIGHEST: "highest",
46
32
  };
47
33
  const MODEL = {
48
34
  // Anthropic
35
+ FABLE: "claude-fable-5",
49
36
  OPUS: "claude-opus-4-8",
50
- SONNET: "claude-sonnet-4-6",
37
+ SONNET: "claude-sonnet-5",
51
38
  HAIKU: "claude-haiku-4-5",
52
- FABLE: "claude-fable-5",
53
39
  MYTHOS: "claude-mythos-5",
54
40
  // Google
55
41
  GEMINI_FLASH: "gemini-3.5-flash",
56
42
  GEMINI_FLASH_LITE: "gemini-3.1-flash-lite",
57
43
  GEMINI_PRO: "gemini-3.1-pro-preview",
58
44
  // OpenAI
45
+ SOL: "gpt-5.6-sol",
46
+ TERRA: "gpt-5.6-terra",
47
+ LUNA: "gpt-5.6-luna",
48
+ /** @deprecated use MODEL.SOL (gpt-5.6-sol) */
59
49
  GPT: "gpt-5.5",
50
+ /** @deprecated use MODEL.TERRA (gpt-5.6-terra) */
60
51
  GPT_MINI: "gpt-5.4-mini",
52
+ /** @deprecated use MODEL.LUNA (gpt-5.6-luna) */
61
53
  GPT_NANO: "gpt-5.4-nano",
62
54
  // xAI
63
55
  GROK: "grok-latest",
56
+ // OpenRouter (provider-prefixed routes; traversed by the OpenRouter hot test)
57
+ OPENROUTER: {
58
+ GLM: "z-ai/glm-5.2",
59
+ LUNA: "openai/gpt-5.6-luna",
60
+ SONNET: "anthropic/claude-sonnet-5",
61
+ },
64
62
  };
65
63
  const GOOGLE_PROVIDER = {
66
64
  // https://ai.google.dev/gemini-api/docs/models
65
+ DEFAULT: MODEL.GEMINI_FLASH,
66
+ /** @deprecated Size tiers are retired in 2.0. Use PROVIDER.GOOGLE.DEFAULT, or pick a specific model from MODEL.*. */
67
67
  MODEL: {
68
- DEFAULT: FIRST_CLASS_PROVIDER.GOOGLE.DEFAULT,
69
- LARGE: FIRST_CLASS_PROVIDER.GOOGLE.LARGE,
70
- SMALL: FIRST_CLASS_PROVIDER.GOOGLE.SMALL,
71
- TINY: FIRST_CLASS_PROVIDER.GOOGLE.TINY,
68
+ DEFAULT: "gemini-3.1-pro-preview",
69
+ LARGE: "gemini-3.1-pro-preview",
70
+ SMALL: "gemini-3.5-flash",
71
+ TINY: "gemini-3.1-flash-lite",
72
72
  },
73
73
  MODEL_MATCH_WORDS: ["gemini", "google"],
74
74
  NAME: "google",
@@ -80,6 +80,10 @@ const GOOGLE_PROVIDER = {
80
80
  const PROVIDER = {
81
81
  // https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html
82
82
  BEDROCK: {
83
+ // Bedrock has no MODEL.* catalog entry yet; keep the literal default id.
84
+ // nova-pro is the Amazon-native model that reliably does tools+structured.
85
+ DEFAULT: "amazon.nova-pro-v1:0",
86
+ /** @deprecated Size tiers are retired in 2.0. Use PROVIDER.BEDROCK.DEFAULT. */
83
87
  MODEL: {
84
88
  DEFAULT: "amazon.nova-lite-v1:0",
85
89
  LARGE: "amazon.nova-pro-v1:0",
@@ -100,22 +104,26 @@ const PROVIDER = {
100
104
  },
101
105
  ANTHROPIC: {
102
106
  // https://docs.anthropic.com/en/docs/about-claude/models/overview
107
+ DEFAULT: MODEL.SONNET,
103
108
  MAX_TOKENS: {
104
109
  // Non-streaming ceiling: responses above ~16K output tokens risk HTTP
105
110
  // timeouts; streaming requests resolve to the model maximum instead
106
111
  // (see util/maxOutputTokens.ts)
107
112
  DEFAULT: 16384,
108
113
  },
114
+ /** @deprecated Size tiers are retired in 2.0. Use PROVIDER.ANTHROPIC.DEFAULT, or pick a specific model from MODEL.*. */
109
115
  MODEL: {
110
- DEFAULT: FIRST_CLASS_PROVIDER.ANTHROPIC.DEFAULT,
111
- LARGE: FIRST_CLASS_PROVIDER.ANTHROPIC.LARGE,
112
- SMALL: FIRST_CLASS_PROVIDER.ANTHROPIC.SMALL,
113
- TINY: FIRST_CLASS_PROVIDER.ANTHROPIC.TINY,
116
+ DEFAULT: "claude-sonnet-4-6",
117
+ LARGE: "claude-opus-4-8",
118
+ SMALL: "claude-sonnet-4-6",
119
+ TINY: "claude-haiku-4-5",
114
120
  },
115
121
  MODEL_MATCH_WORDS: [
116
122
  "anthropic",
117
123
  "claude",
124
+ "fable",
118
125
  "haiku",
126
+ "mythos",
119
127
  "opus",
120
128
  "sonnet",
121
129
  ],
@@ -138,21 +146,25 @@ const PROVIDER = {
138
146
  GOOGLE: GOOGLE_PROVIDER,
139
147
  OPENAI: {
140
148
  // https://platform.openai.com/docs/models
149
+ DEFAULT: MODEL.SOL,
150
+ /** @deprecated Size tiers are retired in 2.0. Use PROVIDER.OPENAI.DEFAULT, or pick a specific model from MODEL.*. */
141
151
  MODEL: {
142
- DEFAULT: FIRST_CLASS_PROVIDER.OPENAI.DEFAULT,
143
- LARGE: FIRST_CLASS_PROVIDER.OPENAI.LARGE,
144
- SMALL: FIRST_CLASS_PROVIDER.OPENAI.SMALL,
145
- TINY: FIRST_CLASS_PROVIDER.OPENAI.TINY,
152
+ DEFAULT: "gpt-5.4",
153
+ LARGE: "gpt-5.5",
154
+ SMALL: "gpt-5.4-mini",
155
+ TINY: "gpt-5.4-nano",
146
156
  },
147
- MODEL_MATCH_WORDS: ["openai", "gpt", /^o\d/],
157
+ MODEL_MATCH_WORDS: ["gpt", "luna", "openai", "sol", "terra", /^o\d/],
148
158
  NAME: "openai",
149
159
  },
150
160
  OPENROUTER: {
161
+ DEFAULT: MODEL.OPENROUTER.SONNET,
162
+ /** @deprecated Size tiers are retired in 2.0. Use PROVIDER.OPENROUTER.DEFAULT, or pick a specific route from MODEL.OPENROUTER.*. */
151
163
  MODEL: {
152
- DEFAULT: `anthropic/${FIRST_CLASS_PROVIDER.ANTHROPIC.DEFAULT}`,
153
- LARGE: `anthropic/${FIRST_CLASS_PROVIDER.ANTHROPIC.LARGE}`,
154
- SMALL: `anthropic/${FIRST_CLASS_PROVIDER.ANTHROPIC.SMALL}`,
155
- TINY: `anthropic/${FIRST_CLASS_PROVIDER.ANTHROPIC.TINY}`,
164
+ DEFAULT: "anthropic/claude-sonnet-4-6",
165
+ LARGE: "anthropic/claude-opus-4-8",
166
+ SMALL: "anthropic/claude-sonnet-4-6",
167
+ TINY: "anthropic/claude-haiku-4-5",
156
168
  },
157
169
  MODEL_MATCH_WORDS: ["openrouter"],
158
170
  NAME: "openrouter",
@@ -167,11 +179,13 @@ const PROVIDER = {
167
179
  // https://docs.x.ai/docs/models
168
180
  API_KEY: "XAI_API_KEY",
169
181
  BASE_URL: "https://api.x.ai/v1",
182
+ DEFAULT: MODEL.GROK,
183
+ /** @deprecated Size tiers are retired in 2.0. Use PROVIDER.XAI.DEFAULT, or pick a specific model from MODEL.*. */
170
184
  MODEL: {
171
- DEFAULT: FIRST_CLASS_PROVIDER.XAI.DEFAULT,
172
- LARGE: FIRST_CLASS_PROVIDER.XAI.LARGE,
173
- SMALL: FIRST_CLASS_PROVIDER.XAI.SMALL,
174
- TINY: FIRST_CLASS_PROVIDER.XAI.TINY,
185
+ DEFAULT: "grok-latest",
186
+ LARGE: "grok-latest",
187
+ SMALL: "grok-4-1-fast-reasoning",
188
+ TINY: "grok-4-1-fast-non-reasoning",
175
189
  },
176
190
  MODEL_MATCH_WORDS: ["grok", "xai"],
177
191
  NAME: "xai",
@@ -179,6 +193,7 @@ const PROVIDER = {
179
193
  };
180
194
  // Last: Defaults
181
195
  const DEFAULT = {
196
+ /** @deprecated Size tiers are retired in 2.0. Use DEFAULT.PROVIDER.DEFAULT, or pick a specific model from MODEL.*. */
182
197
  MODEL: {
183
198
  BASE: PROVIDER.OPENAI.MODEL.DEFAULT,
184
199
  LARGE: PROVIDER.OPENAI.MODEL.LARGE,
@@ -187,6 +202,10 @@ const DEFAULT = {
187
202
  },
188
203
  PROVIDER: PROVIDER.OPENAI,
189
204
  };
205
+ /**
206
+ * @deprecated Size-tier catalogs are retired in 2.0. Pick specific models from
207
+ * MODEL.* (grouped by provider via MODEL_MATCH_WORDS / determineModelProvider).
208
+ */
190
209
  // Only include "first class" models, not OpenRouter or other proxy services
191
210
  const ALL = {
192
211
  BASE: [
@@ -239,6 +258,7 @@ var constants = /*#__PURE__*/Object.freeze({
239
258
  __proto__: null,
240
259
  ALL: ALL,
241
260
  DEFAULT: DEFAULT,
261
+ EFFORT: EFFORT,
242
262
  MODEL: MODEL,
243
263
  PROVIDER: PROVIDER
244
264
  });
@@ -246,7 +266,7 @@ var constants = /*#__PURE__*/Object.freeze({
246
266
  function determineModelProvider(input) {
247
267
  if (!input) {
248
268
  return {
249
- model: DEFAULT.PROVIDER.MODEL.DEFAULT,
269
+ model: DEFAULT.PROVIDER.DEFAULT,
250
270
  provider: DEFAULT.PROVIDER.NAME,
251
271
  };
252
272
  }
@@ -269,85 +289,42 @@ function determineModelProvider(input) {
269
289
  // Check if input is a provider name
270
290
  if (input === PROVIDER.BEDROCK.NAME) {
271
291
  return {
272
- model: PROVIDER.BEDROCK.MODEL.DEFAULT,
292
+ model: PROVIDER.BEDROCK.DEFAULT,
273
293
  provider: PROVIDER.BEDROCK.NAME,
274
294
  };
275
295
  }
276
296
  if (input === PROVIDER.ANTHROPIC.NAME) {
277
297
  return {
278
- model: PROVIDER.ANTHROPIC.MODEL.DEFAULT,
298
+ model: PROVIDER.ANTHROPIC.DEFAULT,
279
299
  provider: PROVIDER.ANTHROPIC.NAME,
280
300
  };
281
301
  }
282
302
  if (input === PROVIDER.GOOGLE.NAME || input === "gemini") {
283
303
  return {
284
- model: PROVIDER.GOOGLE.MODEL.DEFAULT,
304
+ model: PROVIDER.GOOGLE.DEFAULT,
285
305
  provider: PROVIDER.GOOGLE.NAME,
286
306
  };
287
307
  }
288
308
  if (input === PROVIDER.OPENAI.NAME) {
289
309
  return {
290
- model: PROVIDER.OPENAI.MODEL.DEFAULT,
310
+ model: PROVIDER.OPENAI.DEFAULT,
291
311
  provider: PROVIDER.OPENAI.NAME,
292
312
  };
293
313
  }
294
314
  if (input === PROVIDER.OPENROUTER.NAME) {
295
315
  return {
296
- model: PROVIDER.OPENROUTER.MODEL.DEFAULT,
316
+ model: PROVIDER.OPENROUTER.DEFAULT,
297
317
  provider: PROVIDER.OPENROUTER.NAME,
298
318
  };
299
319
  }
300
320
  if (input === PROVIDER.XAI.NAME) {
301
321
  return {
302
- model: PROVIDER.XAI.MODEL.DEFAULT,
322
+ model: PROVIDER.XAI.DEFAULT,
303
323
  provider: PROVIDER.XAI.NAME,
304
324
  };
305
325
  }
306
- // Check if input matches an Anthropic model exactly
307
- for (const [, modelValue] of Object.entries(PROVIDER.ANTHROPIC.MODEL)) {
308
- if (input === modelValue) {
309
- return {
310
- model: input,
311
- provider: PROVIDER.ANTHROPIC.NAME,
312
- };
313
- }
314
- }
315
- // Check if input matches a Gemini model exactly
316
- for (const [, modelValue] of Object.entries(PROVIDER.GOOGLE.MODEL)) {
317
- if (input === modelValue) {
318
- return {
319
- model: input,
320
- provider: PROVIDER.GOOGLE.NAME,
321
- };
322
- }
323
- }
324
- // Check if input matches an OpenAI model exactly
325
- for (const [, modelValue] of Object.entries(PROVIDER.OPENAI.MODEL)) {
326
- if (input === modelValue) {
327
- return {
328
- model: input,
329
- provider: PROVIDER.OPENAI.NAME,
330
- };
331
- }
332
- }
333
- // Check if input matches an OpenRouter model exactly
334
- for (const [, modelValue] of Object.entries(PROVIDER.OPENROUTER.MODEL)) {
335
- if (input === modelValue) {
336
- return {
337
- model: input,
338
- provider: PROVIDER.OPENROUTER.NAME,
339
- };
340
- }
341
- }
342
- // Check if input matches an xAI model exactly
343
- for (const [, modelValue] of Object.entries(PROVIDER.XAI.MODEL)) {
344
- if (input === modelValue) {
345
- return {
346
- model: input,
347
- provider: PROVIDER.XAI.NAME,
348
- };
349
- }
350
- }
326
+ // Exact model ids are classified by the "/" rule and MODEL_MATCH_WORDS below,
327
+ // so no per-provider id catalog is consulted here.
351
328
  // Assume OpenRouter for models containing "/" (e.g., "openai/gpt-4", "anthropic/claude-3-opus")
352
329
  // This check must come before match words so that "openai/gpt-4" is not matched by "openai" keyword
353
330
  if (input.includes("/")) {
@@ -464,6 +441,125 @@ class BaseProviderAdapter {
464
441
  }
465
442
  }
466
443
 
444
+ /**
445
+ * Per-provider translation of the provider-neutral {@link LlmEffort} scale.
446
+ *
447
+ * The neutral enum (lowest → low → medium → high → highest) is a relative
448
+ * five-point scale. Each table below maps it onto the target provider's native
449
+ * effort control, keeping `medium`/`high` semantically aligned across providers
450
+ * and using each provider's extra bottom (`minimal`) or top (`xhigh`/`max`)
451
+ * rung where one exists. Providers with fewer levels collapse the ends and mark
452
+ * the result `papered`. A single `effort` value is therefore safe to reuse
453
+ * across providers and fallback chains.
454
+ */
455
+ /** Consistent debug message for a papered-over effort level. */
456
+ function paperedEffortMessage({ model, provider, requested, value, }) {
457
+ return `[llm] effort '${requested}' has no distinct tier on ${provider} model '${model}'; using '${value}'`;
458
+ }
459
+ // OpenAI Responses API `reasoning.effort`.
460
+ // Full ladder: minimal | low | medium | high | xhigh (plus `none`). Availability
461
+ // is not uniform across the gpt-5 line:
462
+ // - `xhigh` was introduced at gpt-5.2 and has been continuous since, so it is
463
+ // safe for our gpt-5.4 default and everything newer.
464
+ // - `minimal` shipped on gpt-5/5.1, was dropped at gpt-5.2, and returned on
465
+ // the current line; because that history is non-monotonic we only trust it
466
+ // from gpt-5.4 (our default floor) onward.
467
+ // Outside those windows (older gpt-5, o-series) the extreme rung is clamped and
468
+ // the mapping reports `papered: true`.
469
+ const OPENAI_EFFORT = {
470
+ [EFFORT.LOWEST]: "minimal",
471
+ [EFFORT.LOW]: "low",
472
+ [EFFORT.MEDIUM]: "medium",
473
+ [EFFORT.HIGH]: "high",
474
+ [EFFORT.HIGHEST]: "xhigh",
475
+ };
476
+ function openAiGptVersion(model) {
477
+ const match = model.match(/^gpt-(\d+)(?:\.(\d+))?/);
478
+ if (!match)
479
+ return null;
480
+ return { major: Number(match[1]), minor: match[2] ? Number(match[2]) : 0 };
481
+ }
482
+ function atLeast(version, major, minor) {
483
+ if (!version)
484
+ return false;
485
+ return (version.major > major || (version.major === major && version.minor >= minor));
486
+ }
487
+ function toOpenAiEffort(effort, { model }) {
488
+ const native = OPENAI_EFFORT[effort];
489
+ const version = openAiGptVersion(model);
490
+ // `minimal` only from gpt-5.4 (non-monotonic history; absent on o-series)
491
+ if (native === "minimal" && !atLeast(version, 5, 4)) {
492
+ return { papered: true, value: "low" };
493
+ }
494
+ // `xhigh` from gpt-5.2 onward (absent on older gpt-5 and o-series)
495
+ if (native === "xhigh" && !atLeast(version, 5, 2)) {
496
+ return { papered: true, value: "high" };
497
+ }
498
+ return { papered: false, value: native };
499
+ }
500
+ // xAI Grok `reasoning_effort` — low | medium | high. No sub-low or top rung, so
501
+ // `lowest` collapses onto `low` and `highest` onto `high`.
502
+ const XAI_EFFORT = {
503
+ [EFFORT.LOWEST]: { papered: true, value: "low" },
504
+ [EFFORT.LOW]: { papered: false, value: "low" },
505
+ [EFFORT.MEDIUM]: { papered: false, value: "medium" },
506
+ [EFFORT.HIGH]: { papered: false, value: "high" },
507
+ [EFFORT.HIGHEST]: { papered: true, value: "high" },
508
+ };
509
+ function toXaiEffort(effort) {
510
+ return XAI_EFFORT[effort];
511
+ }
512
+ // Anthropic `output_config.effort` — low | medium | high | xhigh | max. No
513
+ // sub-low rung, so `lowest` collapses onto `low`; `highest` reaches `max`.
514
+ const ANTHROPIC_EFFORT = {
515
+ [EFFORT.LOWEST]: { papered: true, value: "low" },
516
+ [EFFORT.LOW]: { papered: false, value: "low" },
517
+ [EFFORT.MEDIUM]: { papered: false, value: "medium" },
518
+ [EFFORT.HIGH]: { papered: false, value: "high" },
519
+ [EFFORT.HIGHEST]: { papered: false, value: "max" },
520
+ };
521
+ function toAnthropicEffort(effort) {
522
+ return ANTHROPIC_EFFORT[effort];
523
+ }
524
+ // Gemini 3.x `thinkingConfig.thinkingLevel` — MINIMAL | LOW | MEDIUM | HIGH. No
525
+ // top rung above HIGH, so `highest` collapses onto HIGH.
526
+ const GEMINI_THINKING_LEVEL = {
527
+ [EFFORT.LOWEST]: { papered: false, value: "MINIMAL" },
528
+ [EFFORT.LOW]: { papered: false, value: "LOW" },
529
+ [EFFORT.MEDIUM]: { papered: false, value: "MEDIUM" },
530
+ [EFFORT.HIGH]: { papered: false, value: "HIGH" },
531
+ [EFFORT.HIGHEST]: { papered: true, value: "HIGH" },
532
+ };
533
+ function toGeminiThinkingLevel(effort) {
534
+ return GEMINI_THINKING_LEVEL[effort];
535
+ }
536
+ // Gemini 2.5 `thinkingConfig.thinkingBudget` — every tier is a distinct token
537
+ // budget, so nothing is papered over. Floor (512) clears every 2.5 minimum;
538
+ // ceiling (24,576) is valid across 2.5 Pro (max 32,768) and Flash (max 24,576).
539
+ const GEMINI_THINKING_BUDGET = {
540
+ [EFFORT.LOWEST]: 512,
541
+ [EFFORT.LOW]: 4096,
542
+ [EFFORT.MEDIUM]: 8192,
543
+ [EFFORT.HIGH]: 16384,
544
+ [EFFORT.HIGHEST]: 24576,
545
+ };
546
+ function toGeminiThinkingBudget(effort) {
547
+ return { papered: false, value: GEMINI_THINKING_BUDGET[effort] };
548
+ }
549
+ // OpenRouter `reasoning.effort` — accepts the full minimal..xhigh ladder and
550
+ // maps to the routed provider's nearest supported level itself, so nothing is
551
+ // papered here.
552
+ const OPENROUTER_EFFORT = {
553
+ [EFFORT.LOWEST]: "minimal",
554
+ [EFFORT.LOW]: "low",
555
+ [EFFORT.MEDIUM]: "medium",
556
+ [EFFORT.HIGH]: "high",
557
+ [EFFORT.HIGHEST]: "xhigh",
558
+ };
559
+ function toOpenRouterEffort(effort) {
560
+ return { papered: false, value: OPENROUTER_EFFORT[effort] };
561
+ }
562
+
467
563
  // Enums
468
564
  exports.LlmMessageRole = void 0;
469
565
  (function (LlmMessageRole) {
@@ -1297,6 +1393,43 @@ async function* parseSseStream(body, { doneSentinel = DEFAULT_DONE_SENTINEL } =
1297
1393
  }
1298
1394
  }
1299
1395
 
1396
+ const UNKNOWN = "unknown";
1397
+ /**
1398
+ * Tally loop totals onto the root logger's report session so handlers
1399
+ * (express, lambda) include llm activity in the report emitted at teardown.
1400
+ * Silently no-ops outside an active session or when the logger predates
1401
+ * tally support.
1402
+ */
1403
+ function tallyOperate({ toolCallNames = [], turns, usage = [], }) {
1404
+ if (typeof log$1.log.tally !== "function")
1405
+ return;
1406
+ const llm = {
1407
+ operates: 1,
1408
+ toolCalls: toolCallNames.length,
1409
+ turns,
1410
+ };
1411
+ if (toolCallNames.length > 0) {
1412
+ const tools = {};
1413
+ for (const name of toolCallNames) {
1414
+ tools[name] = (tools[name] ?? 0) + 1;
1415
+ }
1416
+ llm.tools = tools;
1417
+ }
1418
+ if (usage.length > 0) {
1419
+ const usageByModel = {};
1420
+ for (const item of usage) {
1421
+ const key = [item.provider, item.model].filter(Boolean).join(":") || UNKNOWN;
1422
+ usageByModel[key] ?? (usageByModel[key] = { input: 0, output: 0, reasoning: 0, total: 0 });
1423
+ usageByModel[key].input += item.input;
1424
+ usageByModel[key].output += item.output;
1425
+ usageByModel[key].reasoning += item.reasoning;
1426
+ usageByModel[key].total += item.total;
1427
+ }
1428
+ llm.usage = usageByModel;
1429
+ }
1430
+ log$1.log.tally({ llm });
1431
+ }
1432
+
1300
1433
  /**
1301
1434
  * Helper function to safely call a function that might throw
1302
1435
  * @param fn Function to call safely
@@ -1457,6 +1590,22 @@ function isTransientNetworkError(error) {
1457
1590
  // Constants
1458
1591
  //
1459
1592
  const STRUCTURED_OUTPUT_TOOL_NAME$3 = "structured_output";
1593
+ /**
1594
+ * Whether `output_config.effort` may be sent for this model. Anthropic added
1595
+ * the effort control on the Claude 4.5 line and up (the 5 family); older models
1596
+ * reject it. Parsing major/minor avoids matching a minor "5" in legacy ids
1597
+ * like `claude-3-5-sonnet`.
1598
+ */
1599
+ function supportsAnthropicEffort(model) {
1600
+ const match = model.match(/claude-[a-z]+-(\d+)(?:-(\d+))?/);
1601
+ if (!match)
1602
+ return false;
1603
+ const major = Number(match[1]);
1604
+ const minor = match[2] !== undefined ? Number(match[2]) : 0;
1605
+ if (major >= 5)
1606
+ return true;
1607
+ return major === 4 && minor >= 5;
1608
+ }
1460
1609
  const STRUCTURED_OUTPUT_NON_PARSE_STOP_REASONS = new Set([
1461
1610
  "refusal",
1462
1611
  "max_tokens",
@@ -1722,7 +1871,7 @@ class AnthropicAdapter extends BaseProviderAdapter {
1722
1871
  constructor() {
1723
1872
  super(...arguments);
1724
1873
  this.name = PROVIDER.ANTHROPIC.NAME;
1725
- this.defaultModel = PROVIDER.ANTHROPIC.MODEL.DEFAULT;
1874
+ this.defaultModel = PROVIDER.ANTHROPIC.DEFAULT;
1726
1875
  // Session-level cache of models observed to reject `temperature` at runtime.
1727
1876
  // Populated by executeRequest on 400 errors so repeat calls skip the param.
1728
1877
  this.runtimeNoTemperatureModels = new Set();
@@ -1862,6 +2011,24 @@ class AnthropicAdapter extends BaseProviderAdapter {
1862
2011
  if (request.providerOptions) {
1863
2012
  Object.assign(anthropicRequest, request.providerOptions);
1864
2013
  }
2014
+ // Normalized reasoning effort -> output_config.effort (merged so a format
2015
+ // config above survives). First-class effort wins over providerOptions.
2016
+ if (request.effort &&
2017
+ supportsAnthropicEffort(anthropicRequest.model)) {
2018
+ const mapping = toAnthropicEffort(request.effort);
2019
+ if (mapping.papered) {
2020
+ log$1.log.debug(paperedEffortMessage({
2021
+ model: anthropicRequest.model,
2022
+ provider: this.name,
2023
+ requested: request.effort,
2024
+ value: mapping.value,
2025
+ }));
2026
+ }
2027
+ anthropicRequest.output_config = {
2028
+ ...anthropicRequest.output_config,
2029
+ effort: mapping.value,
2030
+ };
2031
+ }
1865
2032
  // First-class temperature takes precedence over providerOptions
1866
2033
  if (request.temperature !== undefined) {
1867
2034
  anthropicRequest.temperature = request.temperature;
@@ -1956,9 +2123,13 @@ class AnthropicAdapter extends BaseProviderAdapter {
1956
2123
  */
1957
2124
  toFallbackStructuredOutputRequest(request) {
1958
2125
  const { output_config, ...rest } = request;
1959
- if (!output_config)
2126
+ if (!output_config?.format)
1960
2127
  return request;
1961
2128
  const fallbackRequest = { ...rest };
2129
+ // Preserve an effort setting; only the structured-output format falls back.
2130
+ if (output_config.effort) {
2131
+ fallbackRequest.output_config = { effort: output_config.effort };
2132
+ }
1962
2133
  const fakeTool = {
1963
2134
  name: STRUCTURED_OUTPUT_TOOL_NAME$3,
1964
2135
  description: "Output a structured JSON object, " +
@@ -2402,7 +2573,7 @@ class BedrockAdapter extends BaseProviderAdapter {
2402
2573
  constructor() {
2403
2574
  super(...arguments);
2404
2575
  this.name = PROVIDER.BEDROCK.NAME;
2405
- this.defaultModel = PROVIDER.BEDROCK.MODEL.DEFAULT;
2576
+ this.defaultModel = PROVIDER.BEDROCK.DEFAULT;
2406
2577
  this._modelsFallbackToStructuredOutputTool = new Set();
2407
2578
  this._modelsWithoutTemperature = new Set();
2408
2579
  }
@@ -2908,6 +3079,11 @@ const STRUCTURED_OUTPUT_TOOL_NAME$1 = "structured_output";
2908
3079
  // (including 2.5 thinking) do not support the combo and fall back to the
2909
3080
  // legacy `structured_output` fake-tool emulation.
2910
3081
  const GEMINI_3_PATTERN = /^gemini-3/;
3082
+ // Reasoning-effort control differs by generation: Gemini 3.x takes the
3083
+ // `thinkingLevel` enum, Gemini 2.5 takes an integer `thinkingBudget`. Sending
3084
+ // the wrong one errors, and models outside these families have no thinking
3085
+ // control, so effort is only applied when one of these matches.
3086
+ const GEMINI_25_PATTERN = /^gemini-2\.5/;
2911
3087
  /**
2912
3088
  * Detect 4xx errors that indicate the model itself does not support the
2913
3089
  * `responseJsonSchema` + tools combo. Triggers the runtime fallback to the
@@ -2954,7 +3130,7 @@ class GoogleAdapter extends BaseProviderAdapter {
2954
3130
  constructor() {
2955
3131
  super(...arguments);
2956
3132
  this.name = PROVIDER.GOOGLE.NAME;
2957
- this.defaultModel = PROVIDER.GOOGLE.MODEL.DEFAULT;
3133
+ this.defaultModel = PROVIDER.GOOGLE.DEFAULT;
2958
3134
  // Session-level cache of Gemini 3 models observed to reject the native
2959
3135
  // `responseJsonSchema` + tools combo. When a model is in this set,
2960
3136
  // buildRequest engages the legacy fake-tool path instead.
@@ -3082,6 +3258,42 @@ class GoogleAdapter extends BaseProviderAdapter {
3082
3258
  ...request.providerOptions,
3083
3259
  };
3084
3260
  }
3261
+ // Normalized reasoning effort -> thinkingConfig. Gemini 3.x uses the
3262
+ // thinkingLevel enum; 2.5 uses an integer thinkingBudget. Merged so a
3263
+ // providerOptions.thinkingConfig survives; first-class effort wins.
3264
+ if (request.effort) {
3265
+ const model = geminiRequest.model;
3266
+ let thinkingConfig;
3267
+ let papered = false;
3268
+ let value;
3269
+ if (GEMINI_3_PATTERN.test(model)) {
3270
+ const mapping = toGeminiThinkingLevel(request.effort);
3271
+ ({ papered, value } = mapping);
3272
+ thinkingConfig = { thinkingLevel: mapping.value };
3273
+ }
3274
+ else if (GEMINI_25_PATTERN.test(model)) {
3275
+ const mapping = toGeminiThinkingBudget(request.effort);
3276
+ ({ papered, value } = mapping);
3277
+ thinkingConfig = { thinkingBudget: mapping.value };
3278
+ }
3279
+ if (thinkingConfig) {
3280
+ if (papered) {
3281
+ log$1.log.debug(paperedEffortMessage({
3282
+ model,
3283
+ provider: this.name,
3284
+ requested: request.effort,
3285
+ value: value,
3286
+ }));
3287
+ }
3288
+ geminiRequest.config = {
3289
+ ...geminiRequest.config,
3290
+ thinkingConfig: {
3291
+ ...geminiRequest.config?.thinkingConfig,
3292
+ ...thinkingConfig,
3293
+ },
3294
+ };
3295
+ }
3296
+ }
3085
3297
  // First-class temperature takes precedence over providerOptions
3086
3298
  if (request.temperature !== undefined) {
3087
3299
  geminiRequest.config = {
@@ -4001,7 +4213,7 @@ class OpenAiAdapter extends BaseProviderAdapter {
4001
4213
  constructor() {
4002
4214
  super(...arguments);
4003
4215
  this.name = PROVIDER.OPENAI.NAME;
4004
- this.defaultModel = PROVIDER.OPENAI.MODEL.DEFAULT;
4216
+ this.defaultModel = PROVIDER.OPENAI.DEFAULT;
4005
4217
  // Session-level cache of models observed to reject `temperature` at runtime.
4006
4218
  // Populated by executeRequest on 400 errors so repeat calls skip the param.
4007
4219
  this.runtimeNoTemperatureModels = new Set();
@@ -4017,6 +4229,14 @@ class OpenAiAdapter extends BaseProviderAdapter {
4017
4229
  return false;
4018
4230
  return !MODELS_WITHOUT_TEMPERATURE$1.some((pattern) => pattern.test(model));
4019
4231
  }
4232
+ /** Whether `reasoning.effort` may be sent for this model. Overridden by xAI. */
4233
+ supportsReasoningEffort(model) {
4234
+ return isReasoningModel(model);
4235
+ }
4236
+ /** Translate a normalized effort to this provider's `reasoning.effort` value. */
4237
+ mapReasoningEffort(effort, model) {
4238
+ return toOpenAiEffort(effort, { model });
4239
+ }
4020
4240
  //
4021
4241
  // Request Building
4022
4242
  //
@@ -4055,6 +4275,24 @@ class OpenAiAdapter extends BaseProviderAdapter {
4055
4275
  if (request.providerOptions) {
4056
4276
  Object.assign(openaiRequest, request.providerOptions);
4057
4277
  }
4278
+ // Normalized reasoning effort -> reasoning.effort (merged so the
4279
+ // summary:auto above survives). First-class effort wins over providerOptions.
4280
+ if (request.effort && this.supportsReasoningEffort(model)) {
4281
+ const mapping = this.mapReasoningEffort(request.effort, model);
4282
+ if (mapping.papered) {
4283
+ log$1.log.debug(paperedEffortMessage({
4284
+ model,
4285
+ provider: this.name,
4286
+ requested: request.effort,
4287
+ value: mapping.value,
4288
+ }));
4289
+ }
4290
+ const existingReasoning = openaiRequest.reasoning ?? {};
4291
+ openaiRequest.reasoning = {
4292
+ ...existingReasoning,
4293
+ effort: mapping.value,
4294
+ };
4295
+ }
4058
4296
  // First-class temperature takes precedence over providerOptions
4059
4297
  if (request.temperature !== undefined) {
4060
4298
  openaiRequest.temperature = request.temperature;
@@ -4649,7 +4887,7 @@ class OpenRouterAdapter extends BaseProviderAdapter {
4649
4887
  constructor() {
4650
4888
  super(...arguments);
4651
4889
  this.name = PROVIDER.OPENROUTER.NAME;
4652
- this.defaultModel = PROVIDER.OPENROUTER.MODEL.DEFAULT;
4890
+ this.defaultModel = PROVIDER.OPENROUTER.DEFAULT;
4653
4891
  // Session-level cache of models observed to reject native
4654
4892
  // `response_format: json_schema`. When a model is in this set, buildRequest
4655
4893
  // engages the legacy fake-tool path instead of native structured output.
@@ -4742,6 +4980,15 @@ class OpenRouterAdapter extends BaseProviderAdapter {
4742
4980
  if (request.providerOptions) {
4743
4981
  Object.assign(openRouterRequest, request.providerOptions);
4744
4982
  }
4983
+ // Normalized reasoning effort -> reasoning.effort. OpenRouter accepts the
4984
+ // full ladder and maps to the routed provider's nearest supported level.
4985
+ // First-class effort wins over providerOptions.
4986
+ if (request.effort) {
4987
+ openRouterRequest.reasoning = {
4988
+ ...openRouterRequest.reasoning,
4989
+ effort: toOpenRouterEffort(request.effort).value,
4990
+ };
4991
+ }
4745
4992
  // First-class temperature takes precedence over providerOptions
4746
4993
  if (request.temperature !== undefined) {
4747
4994
  openRouterRequest.temperature =
@@ -5360,8 +5607,21 @@ class XaiAdapter extends OpenAiAdapter {
5360
5607
  super(...arguments);
5361
5608
  // @ts-expect-error Narrowing override: xAI name differs from parent's literal "openai"
5362
5609
  this.name = PROVIDER.XAI.NAME;
5363
- // @ts-expect-error Narrowing override: xAI default model differs from parent's literal
5364
- this.defaultModel = PROVIDER.XAI.MODEL.DEFAULT;
5610
+ this.defaultModel = PROVIDER.XAI.DEFAULT;
5611
+ }
5612
+ /**
5613
+ * Grok gates reasoning effort by model, not by the OpenAI `gpt-*`/`o*`
5614
+ * patterns. Only explicit `*-reasoning` models accept `reasoning_effort`;
5615
+ * bare grok-4 reasons implicitly and rejects it, so we stay conservative and
5616
+ * only opt in models whose name advertises reasoning.
5617
+ */
5618
+ supportsReasoningEffort(model) {
5619
+ if (/non-reasoning/.test(model))
5620
+ return false;
5621
+ return /reasoning/.test(model);
5622
+ }
5623
+ mapReasoningEffort(effort) {
5624
+ return toXaiEffort(effort);
5365
5625
  }
5366
5626
  classifyError(error) {
5367
5627
  if (isTransientIngestError(error)) {
@@ -6638,6 +6898,7 @@ class OperateLoop {
6638
6898
  }
6639
6899
  // Rebuild request with updated history for next turn
6640
6900
  request = {
6901
+ effort: options.effort,
6641
6902
  format: state.formattedFormat,
6642
6903
  instructions: options.instructions,
6643
6904
  messages: state.currentInput,
@@ -6655,6 +6916,11 @@ class OperateLoop {
6655
6916
  metrics: usageToLlmObsMetrics(response.usage),
6656
6917
  outputData: response.content,
6657
6918
  });
6919
+ tallyOperate({
6920
+ toolCallNames: state.toolCallNames,
6921
+ turns: state.currentTurn,
6922
+ usage: response.usage,
6923
+ });
6658
6924
  await emitProgress({
6659
6925
  event: {
6660
6926
  content: response.content,
@@ -6724,6 +6990,7 @@ class OperateLoop {
6724
6990
  formattedTools,
6725
6991
  maxTurns,
6726
6992
  responseBuilder,
6993
+ toolCallNames: [],
6727
6994
  toolkit,
6728
6995
  };
6729
6996
  }
@@ -6735,6 +7002,7 @@ class OperateLoop {
6735
7002
  }
6736
7003
  buildInitialRequest(state, options) {
6737
7004
  return {
7005
+ effort: options.effort,
6738
7006
  format: state.formattedFormat,
6739
7007
  instructions: options.instructions,
6740
7008
  messages: state.currentInput,
@@ -6892,6 +7160,7 @@ class OperateLoop {
6892
7160
  this.appendResponseItemsToRequest(currentProviderRequest, responseItems);
6893
7161
  // Process each tool call
6894
7162
  for (const toolCall of toolCalls) {
7163
+ state.toolCallNames.push(toolCall.name);
6895
7164
  // Resolved once per call; never throws (undefined when tool has no message)
6896
7165
  const toolMessage = await state.toolkit.resolveMessage({
6897
7166
  arguments: toolCall.arguments,
@@ -7248,6 +7517,7 @@ class StreamLoop {
7248
7517
  }
7249
7518
  // Rebuild request with updated history for next turn
7250
7519
  request = {
7520
+ effort: options.effort,
7251
7521
  format: state.formattedFormat,
7252
7522
  instructions: options.instructions,
7253
7523
  messages: state.currentInput,
@@ -7265,6 +7535,11 @@ class StreamLoop {
7265
7535
  }
7266
7536
  }
7267
7537
  // Emit final done chunk with accumulated usage
7538
+ tallyOperate({
7539
+ toolCallNames: state.toolCallNames,
7540
+ turns: state.currentTurn,
7541
+ usage: state.usageItems,
7542
+ });
7268
7543
  yield {
7269
7544
  type: exports.LlmStreamChunkType.Done,
7270
7545
  usage: state.usageItems,
@@ -7305,6 +7580,7 @@ class StreamLoop {
7305
7580
  formattedFormat,
7306
7581
  formattedTools,
7307
7582
  maxTurns,
7583
+ toolCallNames: [],
7308
7584
  toolkit,
7309
7585
  usageItems: [],
7310
7586
  };
@@ -7317,6 +7593,7 @@ class StreamLoop {
7317
7593
  }
7318
7594
  buildInitialRequest(state, options) {
7319
7595
  return {
7596
+ effort: options.effort,
7320
7597
  format: state.formattedFormat,
7321
7598
  instructions: options.instructions,
7322
7599
  messages: state.currentInput,
@@ -7487,6 +7764,7 @@ class StreamLoop {
7487
7764
  async *processToolCalls(toolCalls, state, context) {
7488
7765
  const log = getLogger$6();
7489
7766
  for (const toolCall of toolCalls) {
7767
+ state.toolCallNames.push(toolCall.name);
7490
7768
  // Resolved once per call; never throws (undefined when tool has no message)
7491
7769
  const toolMessage = await state.toolkit.resolveMessage({
7492
7770
  arguments: toolCall.arguments,
@@ -7879,7 +8157,7 @@ async function createStructuredCompletion$1(client, messages, model, responseSch
7879
8157
 
7880
8158
  // Main class implementation
7881
8159
  class AnthropicProvider {
7882
- constructor(model = PROVIDER.ANTHROPIC.MODEL.DEFAULT, { apiKey } = {}) {
8160
+ constructor(model = PROVIDER.ANTHROPIC.DEFAULT, { apiKey } = {}) {
7883
8161
  this.log = getLogger$5();
7884
8162
  this.conversationHistory = [];
7885
8163
  this.model = model;
@@ -7987,7 +8265,7 @@ async function initializeClient$4({ region, } = {}) {
7987
8265
  }
7988
8266
 
7989
8267
  class BedrockProvider {
7990
- constructor(model = PROVIDER.BEDROCK.MODEL.DEFAULT, { region } = {}) {
8268
+ constructor(model = PROVIDER.BEDROCK.DEFAULT, { region } = {}) {
7991
8269
  this.log = getLogger$4();
7992
8270
  this.conversationHistory = [];
7993
8271
  this.model = model;
@@ -8230,7 +8508,7 @@ function prepareMessages$2(message, { data, placeholders } = {}) {
8230
8508
  }
8231
8509
 
8232
8510
  class GoogleProvider {
8233
- constructor(model = PROVIDER.GOOGLE.MODEL.DEFAULT, { apiKey } = {}) {
8511
+ constructor(model = PROVIDER.GOOGLE.DEFAULT, { apiKey } = {}) {
8234
8512
  this.log = getLogger$3();
8235
8513
  this.conversationHistory = [];
8236
8514
  this.model = model;
@@ -8432,7 +8710,7 @@ async function createTextCompletion(client, { messages, model, }) {
8432
8710
  }
8433
8711
 
8434
8712
  class OpenAiProvider {
8435
- constructor(model = PROVIDER.OPENAI.MODEL.DEFAULT, { apiKey } = {}) {
8713
+ constructor(model = PROVIDER.OPENAI.DEFAULT, { apiKey } = {}) {
8436
8714
  this.log = getLogger$2();
8437
8715
  this.conversationHistory = [];
8438
8716
  this.model = model;
@@ -8663,7 +8941,7 @@ async function initializeClient$1({ apiKey, } = {}) {
8663
8941
  }
8664
8942
  // Get default model from environment or constants
8665
8943
  function getDefaultModel() {
8666
- return process.env.OPENROUTER_MODEL || PROVIDER.OPENROUTER.MODEL.DEFAULT;
8944
+ return process.env.OPENROUTER_MODEL || PROVIDER.OPENROUTER.DEFAULT;
8667
8945
  }
8668
8946
  function formatSystemMessage(systemPrompt, { data, placeholders } = {}) {
8669
8947
  const content = placeholders?.system === false
@@ -8815,7 +9093,7 @@ async function initializeClient({ apiKey, } = {}) {
8815
9093
  }
8816
9094
 
8817
9095
  class XaiProvider {
8818
- constructor(model = PROVIDER.XAI.MODEL.DEFAULT, { apiKey } = {}) {
9096
+ constructor(model = PROVIDER.XAI.DEFAULT, { apiKey } = {}) {
8819
9097
  this.log = getLogger$2();
8820
9098
  this.conversationHistory = [];
8821
9099
  this.model = model;
@@ -8946,23 +9224,25 @@ class Llm {
8946
9224
  const { apiKey, model } = options;
8947
9225
  switch (providerName) {
8948
9226
  case PROVIDER.ANTHROPIC.NAME:
8949
- return new AnthropicProvider(model || PROVIDER.ANTHROPIC.MODEL.DEFAULT, { apiKey });
9227
+ return new AnthropicProvider(model || PROVIDER.ANTHROPIC.DEFAULT, {
9228
+ apiKey,
9229
+ });
8950
9230
  case PROVIDER.BEDROCK.NAME:
8951
- return new BedrockProvider(model || PROVIDER.BEDROCK.MODEL.DEFAULT);
9231
+ return new BedrockProvider(model || PROVIDER.BEDROCK.DEFAULT);
8952
9232
  case PROVIDER.GOOGLE.NAME:
8953
- return new GoogleProvider(model || PROVIDER.GOOGLE.MODEL.DEFAULT, {
9233
+ return new GoogleProvider(model || PROVIDER.GOOGLE.DEFAULT, {
8954
9234
  apiKey,
8955
9235
  });
8956
9236
  case PROVIDER.OPENAI.NAME:
8957
- return new OpenAiProvider(model || PROVIDER.OPENAI.MODEL.DEFAULT, {
9237
+ return new OpenAiProvider(model || PROVIDER.OPENAI.DEFAULT, {
8958
9238
  apiKey,
8959
9239
  });
8960
9240
  case PROVIDER.OPENROUTER.NAME:
8961
- return new OpenRouterProvider(model || PROVIDER.OPENROUTER.MODEL.DEFAULT, {
9241
+ return new OpenRouterProvider(model || PROVIDER.OPENROUTER.DEFAULT, {
8962
9242
  apiKey,
8963
9243
  });
8964
9244
  case PROVIDER.XAI.NAME:
8965
- return new XaiProvider(model || PROVIDER.XAI.MODEL.DEFAULT, {
9245
+ return new XaiProvider(model || PROVIDER.XAI.DEFAULT, {
8966
9246
  apiKey,
8967
9247
  });
8968
9248
  default: