@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.
- package/dist/cjs/{src/constants.d.ts → constants.d.ts} +56 -7
- package/dist/cjs/index.cjs +404 -124
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +69 -10
- package/dist/{esm/src → cjs}/index.d.ts +1 -0
- package/dist/cjs/{src/operate → operate}/adapters/AnthropicAdapter.d.ts +3 -2
- package/dist/{esm/src → cjs}/operate/adapters/BedrockAdapter.d.ts +1 -1
- package/dist/cjs/{src/operate → operate}/adapters/GoogleAdapter.d.ts +1 -1
- package/dist/{esm/src → cjs}/operate/adapters/OpenAiAdapter.d.ts +7 -1
- package/dist/{esm/src → cjs}/operate/adapters/OpenRouterAdapter.d.ts +5 -1
- package/dist/cjs/operate/adapters/XaiAdapter.d.ts +24 -0
- package/dist/cjs/{src/operate → operate}/types.d.ts +5 -0
- package/dist/cjs/{src/providers → providers}/google/types.d.ts +5 -0
- package/dist/{esm/src → cjs}/types/LlmProvider.interface.d.ts +9 -0
- package/dist/cjs/util/effort.d.ts +42 -0
- package/dist/cjs/{src/util → util}/index.d.ts +1 -0
- package/dist/cjs/util/tallyOperate.d.ts +14 -0
- package/dist/esm/{src/constants.d.ts → constants.d.ts} +56 -7
- package/dist/esm/index.d.ts +69 -10
- package/dist/esm/index.js +404 -124
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{src/operate → operate}/adapters/AnthropicAdapter.d.ts +3 -2
- package/dist/{cjs/src → esm}/operate/adapters/BedrockAdapter.d.ts +1 -1
- package/dist/esm/{src/operate → operate}/adapters/GoogleAdapter.d.ts +1 -1
- package/dist/{cjs/src → esm}/operate/adapters/OpenAiAdapter.d.ts +7 -1
- package/dist/{cjs/src → esm}/operate/adapters/OpenRouterAdapter.d.ts +5 -1
- package/dist/esm/operate/adapters/XaiAdapter.d.ts +24 -0
- package/dist/esm/{src/operate → operate}/types.d.ts +5 -0
- package/dist/esm/{src/providers → providers}/google/types.d.ts +5 -0
- package/dist/{cjs/src → esm}/types/LlmProvider.interface.d.ts +9 -0
- package/dist/esm/util/effort.d.ts +42 -0
- package/dist/esm/{src/util → util}/index.d.ts +1 -0
- package/dist/esm/util/tallyOperate.d.ts +14 -0
- package/package.json +1 -1
- package/dist/cjs/src/index.d.ts +0 -17
- package/dist/cjs/src/operate/adapters/XaiAdapter.d.ts +0 -14
- package/dist/esm/src/operate/adapters/XaiAdapter.d.ts +0 -14
- /package/dist/cjs/{src/Llm.d.ts → Llm.d.ts} +0 -0
- /package/dist/cjs/{src/observability → observability}/llmobs.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/OperateLoop.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/StreamLoop.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/hooks/HookRunner.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/hooks/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/input/InputProcessor.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/input/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/progress/emitProgress.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/progress/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/response/ResponseBuilder.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/response/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/RetryExecutor.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/RetryPolicy.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/createStaleRejectionGuard.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/isTransientNetworkError.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/client.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/types.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/bedrock/BedrockProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/bedrock/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/bedrock/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/google/GoogleProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/google/client.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/google/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/google/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/OpenAiProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/client.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/responseFormat.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/types.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openrouter/client.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openrouter/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openrouter/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/xai/XaiProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/xai/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/xai/utils.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/Toolkit.class.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/index.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/random.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/roll.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/time.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/weather.d.ts +0 -0
- /package/dist/cjs/{src/types → types}/LlmOperateInput.guards.d.ts +0 -0
- /package/dist/cjs/{src/types → types}/LlmStreamChunk.interface.d.ts +0 -0
- /package/dist/cjs/{src/types → types}/LlmTool.interface.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/detectMimeType.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/extractPdfPages.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/index.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/loadLocalFile.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/loadS3File.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/resolveOperateInput.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/determineModelProvider.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/extractReasoning.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/fillFormatArrays.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/formatOperateInput.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/formatOperateMessage.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/jsonSchema.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/jsonSchemaToOpenApi3.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/logger.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/maxOutputTokens.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/maxTurnsFromOptions.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/naturalZodSchema.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/random.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/repairFormatKeys.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/sse.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/tryParseNumber.d.ts +0 -0
- /package/dist/esm/{src/Llm.d.ts → Llm.d.ts} +0 -0
- /package/dist/esm/{src/observability → observability}/llmobs.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/OperateLoop.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/StreamLoop.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/hooks/HookRunner.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/hooks/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/input/InputProcessor.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/input/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/progress/emitProgress.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/progress/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/response/ResponseBuilder.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/response/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/RetryExecutor.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/RetryPolicy.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/createStaleRejectionGuard.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/isTransientNetworkError.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/client.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/types.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/bedrock/BedrockProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/bedrock/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/bedrock/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/google/GoogleProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/google/client.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/google/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/google/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/OpenAiProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/client.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/responseFormat.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/types.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openrouter/client.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openrouter/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openrouter/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/xai/XaiProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/xai/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/xai/utils.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/Toolkit.class.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/index.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/random.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/roll.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/time.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/weather.d.ts +0 -0
- /package/dist/esm/{src/types → types}/LlmOperateInput.guards.d.ts +0 -0
- /package/dist/esm/{src/types → types}/LlmStreamChunk.interface.d.ts +0 -0
- /package/dist/esm/{src/types → types}/LlmTool.interface.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/detectMimeType.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/extractPdfPages.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/index.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/loadLocalFile.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/loadS3File.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/resolveOperateInput.d.ts +0 -0
- /package/dist/esm/{src/util → util}/determineModelProvider.d.ts +0 -0
- /package/dist/esm/{src/util → util}/extractReasoning.d.ts +0 -0
- /package/dist/esm/{src/util → util}/fillFormatArrays.d.ts +0 -0
- /package/dist/esm/{src/util → util}/formatOperateInput.d.ts +0 -0
- /package/dist/esm/{src/util → util}/formatOperateMessage.d.ts +0 -0
- /package/dist/esm/{src/util → util}/jsonSchema.d.ts +0 -0
- /package/dist/esm/{src/util → util}/jsonSchemaToOpenApi3.d.ts +0 -0
- /package/dist/esm/{src/util → util}/logger.d.ts +0 -0
- /package/dist/esm/{src/util → util}/maxOutputTokens.d.ts +0 -0
- /package/dist/esm/{src/util → util}/maxTurnsFromOptions.d.ts +0 -0
- /package/dist/esm/{src/util → util}/naturalZodSchema.d.ts +0 -0
- /package/dist/esm/{src/util → util}/random.d.ts +0 -0
- /package/dist/esm/{src/util → util}/repairFormatKeys.d.ts +0 -0
- /package/dist/esm/{src/util → util}/sse.d.ts +0 -0
- /package/dist/esm/{src/util → util}/tryParseNumber.d.ts +0 -0
package/dist/cjs/index.cjs
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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-
|
|
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:
|
|
69
|
-
LARGE:
|
|
70
|
-
SMALL:
|
|
71
|
-
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:
|
|
111
|
-
LARGE:
|
|
112
|
-
SMALL:
|
|
113
|
-
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:
|
|
143
|
-
LARGE:
|
|
144
|
-
SMALL:
|
|
145
|
-
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", "
|
|
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:
|
|
153
|
-
LARGE:
|
|
154
|
-
SMALL:
|
|
155
|
-
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:
|
|
172
|
-
LARGE:
|
|
173
|
-
SMALL:
|
|
174
|
-
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
322
|
+
model: PROVIDER.XAI.DEFAULT,
|
|
303
323
|
provider: PROVIDER.XAI.NAME,
|
|
304
324
|
};
|
|
305
325
|
}
|
|
306
|
-
//
|
|
307
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
5364
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
9227
|
+
return new AnthropicProvider(model || PROVIDER.ANTHROPIC.DEFAULT, {
|
|
9228
|
+
apiKey,
|
|
9229
|
+
});
|
|
8950
9230
|
case PROVIDER.BEDROCK.NAME:
|
|
8951
|
-
return new BedrockProvider(model || PROVIDER.BEDROCK.
|
|
9231
|
+
return new BedrockProvider(model || PROVIDER.BEDROCK.DEFAULT);
|
|
8952
9232
|
case PROVIDER.GOOGLE.NAME:
|
|
8953
|
-
return new GoogleProvider(model || PROVIDER.GOOGLE.
|
|
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.
|
|
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.
|
|
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.
|
|
9245
|
+
return new XaiProvider(model || PROVIDER.XAI.DEFAULT, {
|
|
8966
9246
|
apiKey,
|
|
8967
9247
|
});
|
|
8968
9248
|
default:
|