@gaunt-sloth/core 2.0.0-alpha.2 → 2.0.0-alpha.21

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 (158) hide show
  1. package/.gsloth.code.md +10 -0
  2. package/README.md +6 -6
  3. package/dist/config/defaults.d.ts +85 -0
  4. package/dist/config/defaults.js +103 -0
  5. package/dist/config/defaults.js.map +1 -0
  6. package/dist/config/jsonc.d.ts +12 -0
  7. package/dist/config/jsonc.js +41 -0
  8. package/dist/config/jsonc.js.map +1 -0
  9. package/dist/config/loader.d.ts +169 -0
  10. package/dist/config/loader.js +872 -0
  11. package/dist/config/loader.js.map +1 -0
  12. package/dist/config/schema.d.ts +673 -0
  13. package/dist/config/schema.js +524 -0
  14. package/dist/config/schema.js.map +1 -0
  15. package/dist/config/shell-policy.d.ts +331 -0
  16. package/dist/config/shell-policy.js +238 -0
  17. package/dist/config/shell-policy.js.map +1 -0
  18. package/dist/config/types.d.ts +596 -0
  19. package/dist/config/types.js +13 -0
  20. package/dist/config/types.js.map +1 -0
  21. package/dist/config.d.ts +18 -647
  22. package/dist/config.js +15 -516
  23. package/dist/config.js.map +1 -1
  24. package/dist/constants.d.ts +42 -0
  25. package/dist/constants.js +42 -0
  26. package/dist/constants.js.map +1 -1
  27. package/dist/core/GthAbstractAgent.d.ts +85 -2
  28. package/dist/core/GthAbstractAgent.js +398 -28
  29. package/dist/core/GthAbstractAgent.js.map +1 -1
  30. package/dist/core/GthAgentRunner.d.ts +158 -1
  31. package/dist/core/GthAgentRunner.js +367 -4
  32. package/dist/core/GthAgentRunner.js.map +1 -1
  33. package/dist/core/GthLangChainAgent.js +193 -16
  34. package/dist/core/GthLangChainAgent.js.map +1 -1
  35. package/dist/core/debugCapture.d.ts +59 -0
  36. package/dist/core/debugCapture.js +101 -0
  37. package/dist/core/debugCapture.js.map +1 -0
  38. package/dist/core/gthLeanAgentFactory.d.ts +9 -0
  39. package/dist/core/gthLeanAgentFactory.js +10 -0
  40. package/dist/core/gthLeanAgentFactory.js.map +1 -0
  41. package/dist/core/plainToolIndication.d.ts +15 -0
  42. package/dist/core/plainToolIndication.js +148 -0
  43. package/dist/core/plainToolIndication.js.map +1 -0
  44. package/dist/core/runStats.d.ts +41 -0
  45. package/dist/core/runStats.js +73 -0
  46. package/dist/core/runStats.js.map +1 -0
  47. package/dist/core/shell/ShellCommandFailedError.d.ts +54 -0
  48. package/dist/core/shell/ShellCommandFailedError.js +68 -0
  49. package/dist/core/shell/ShellCommandFailedError.js.map +1 -0
  50. package/dist/core/shell/allowlist.d.ts +75 -0
  51. package/dist/core/shell/allowlist.js +187 -0
  52. package/dist/core/shell/allowlist.js.map +1 -0
  53. package/dist/core/shell/arity.d.ts +75 -0
  54. package/dist/core/shell/arity.js +313 -0
  55. package/dist/core/shell/arity.js.map +1 -0
  56. package/dist/core/shell/judge.d.ts +161 -0
  57. package/dist/core/shell/judge.js +261 -0
  58. package/dist/core/shell/judge.js.map +1 -0
  59. package/dist/core/shell/normalize.d.ts +27 -0
  60. package/dist/core/shell/normalize.js +53 -0
  61. package/dist/core/shell/normalize.js.map +1 -0
  62. package/dist/core/toolDisplay.d.ts +101 -0
  63. package/dist/core/toolDisplay.js +374 -0
  64. package/dist/core/toolDisplay.js.map +1 -0
  65. package/dist/core/toolOutputChannel.d.ts +68 -0
  66. package/dist/core/toolOutputChannel.js +112 -0
  67. package/dist/core/toolOutputChannel.js.map +1 -0
  68. package/dist/core/types.d.ts +173 -0
  69. package/dist/core/types.js.map +1 -1
  70. package/dist/history/historyFormat.d.ts +28 -0
  71. package/dist/history/historyFormat.js +127 -0
  72. package/dist/history/historyFormat.js.map +1 -0
  73. package/dist/history/historyStore.d.ts +198 -0
  74. package/dist/history/historyStore.js +482 -0
  75. package/dist/history/historyStore.js.map +1 -0
  76. package/dist/history/recordSession.d.ts +37 -0
  77. package/dist/history/recordSession.js +56 -0
  78. package/dist/history/recordSession.js.map +1 -0
  79. package/dist/index.d.ts +4 -0
  80. package/dist/index.js +4 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/providers/anthropic.d.ts +1 -1
  83. package/dist/providers/anthropic.js +5 -10
  84. package/dist/providers/anthropic.js.map +1 -1
  85. package/dist/providers/deepseek.d.ts +1 -1
  86. package/dist/providers/deepseek.js +5 -10
  87. package/dist/providers/deepseek.js.map +1 -1
  88. package/dist/providers/geminiSchemaSanitizer.d.ts +52 -0
  89. package/dist/providers/geminiSchemaSanitizer.js +201 -0
  90. package/dist/providers/geminiSchemaSanitizer.js.map +1 -0
  91. package/dist/providers/google-genai.d.ts +1 -1
  92. package/dist/providers/google-genai.js +9 -11
  93. package/dist/providers/google-genai.js.map +1 -1
  94. package/dist/providers/groq.d.ts +1 -1
  95. package/dist/providers/groq.js +5 -10
  96. package/dist/providers/groq.js.map +1 -1
  97. package/dist/providers/huggingface.d.ts +25 -0
  98. package/dist/providers/huggingface.js +69 -0
  99. package/dist/providers/huggingface.js.map +1 -0
  100. package/dist/providers/modelCatalog.d.ts +109 -0
  101. package/dist/providers/modelCatalog.js +245 -0
  102. package/dist/providers/modelCatalog.js.map +1 -0
  103. package/dist/providers/modelDiscovery.d.ts +111 -3
  104. package/dist/providers/modelDiscovery.js +183 -27
  105. package/dist/providers/modelDiscovery.js.map +1 -1
  106. package/dist/providers/ollama.d.ts +19 -5
  107. package/dist/providers/ollama.js +60 -52
  108. package/dist/providers/ollama.js.map +1 -1
  109. package/dist/providers/openai.d.ts +1 -1
  110. package/dist/providers/openai.js +5 -10
  111. package/dist/providers/openai.js.map +1 -1
  112. package/dist/providers/openrouter.d.ts +1 -1
  113. package/dist/providers/openrouter.js +12 -12
  114. package/dist/providers/openrouter.js.map +1 -1
  115. package/dist/providers/vertexai.d.ts +1 -1
  116. package/dist/providers/vertexai.js +9 -11
  117. package/dist/providers/vertexai.js.map +1 -1
  118. package/dist/providers/xai.d.ts +1 -1
  119. package/dist/providers/xai.js +5 -10
  120. package/dist/providers/xai.js.map +1 -1
  121. package/dist/runtime/askStructured.d.ts +62 -0
  122. package/dist/runtime/askStructured.js +76 -0
  123. package/dist/runtime/askStructured.js.map +1 -0
  124. package/dist/runtime/conversation.d.ts +59 -0
  125. package/dist/runtime/conversation.js +137 -0
  126. package/dist/runtime/conversation.js.map +1 -0
  127. package/dist/runtime/singleShot.d.ts +24 -5
  128. package/dist/runtime/singleShot.js +56 -9
  129. package/dist/runtime/singleShot.js.map +1 -1
  130. package/dist/utils/aiignoreUtils.js.map +1 -1
  131. package/dist/utils/binaryOutputUtils.js.map +1 -1
  132. package/dist/utils/consoleUtils.d.ts +22 -0
  133. package/dist/utils/consoleUtils.js +45 -0
  134. package/dist/utils/consoleUtils.js.map +1 -1
  135. package/dist/utils/debugDump.d.ts +57 -0
  136. package/dist/utils/debugDump.js +236 -0
  137. package/dist/utils/debugDump.js.map +1 -0
  138. package/dist/utils/debugUtils.d.ts +13 -4
  139. package/dist/utils/debugUtils.js +36 -13
  140. package/dist/utils/debugUtils.js.map +1 -1
  141. package/dist/utils/fileUtils.d.ts +24 -2
  142. package/dist/utils/fileUtils.js +54 -12
  143. package/dist/utils/fileUtils.js.map +1 -1
  144. package/dist/utils/llmUtils.js.map +1 -1
  145. package/dist/utils/redactSecrets.d.ts +63 -0
  146. package/dist/utils/redactSecrets.js +238 -0
  147. package/dist/utils/redactSecrets.js.map +1 -0
  148. package/dist/utils/systemPromptNotes.d.ts +181 -0
  149. package/dist/utils/systemPromptNotes.js +298 -0
  150. package/dist/utils/systemPromptNotes.js.map +1 -0
  151. package/dist/utils/systemUtils.d.ts +32 -1
  152. package/dist/utils/systemUtils.js +50 -3
  153. package/dist/utils/systemUtils.js.map +1 -1
  154. package/dist/utils/toolMatching.d.ts +30 -0
  155. package/dist/utils/toolMatching.js +44 -0
  156. package/dist/utils/toolMatching.js.map +1 -0
  157. package/package.json +17 -8
  158. package/schema/gsloth-config.schema.json +2111 -0
@@ -24,6 +24,7 @@
24
24
  * `{ providerId, model }` maps directly onto a `RawGthConfig.llm`.
25
25
  */
26
26
  import { availableDefaultConfigs } from '#src/config.js';
27
+ import { CONFIG_SCHEMA_POINTER } from '#src/constants.js';
27
28
  import { displayDebug } from '#src/utils/consoleUtils.js';
28
29
  import { env } from '#src/utils/systemUtils.js';
29
30
  /** Default Ollama host, matching the Ollama CLI/library default. */
@@ -57,7 +58,7 @@ export const PROVIDER_DESCRIPTORS = [
57
58
  id: 'anthropic',
58
59
  label: 'Anthropic (Claude)',
59
60
  apiKeyEnvironmentVariables: ['ANTHROPIC_API_KEY'],
60
- preferredModels: ['claude-sonnet-4-6', 'claude-opus-4-8', 'claude-haiku-4-5'],
61
+ preferredModels: ['claude-sonnet-5', 'claude-opus-4-8', 'claude-haiku-4-5'],
61
62
  discovery: {
62
63
  kind: 'anthropic',
63
64
  modelsUrl: () => 'https://api.anthropic.com/v1/models',
@@ -141,7 +142,7 @@ export const PROVIDER_DESCRIPTORS = [
141
142
  // OPENROUTER_API_KEY is accepted as an alias.
142
143
  label: 'OpenRouter',
143
144
  apiKeyEnvironmentVariables: ['OPEN_ROUTER_API_KEY', 'OPENROUTER_API_KEY'],
144
- preferredModels: ['qwen/qwen3-coder', 'anthropic/claude-sonnet-4.6', 'openai/gpt-5.5'],
145
+ preferredModels: ['qwen/qwen3-coder', 'anthropic/claude-sonnet-5', 'openai/gpt-5.5'],
145
146
  discovery: {
146
147
  kind: 'openai',
147
148
  modelsUrl: () => 'https://openrouter.ai/api/v1/models',
@@ -149,6 +150,19 @@ export const PROVIDER_DESCRIPTORS = [
149
150
  filter: chatOnly,
150
151
  },
151
152
  },
153
+ {
154
+ id: 'huggingface',
155
+ label: 'Hugging Face (Inference Providers)',
156
+ apiKeyEnvironmentVariables: ['HF_TOKEN', 'HUGGINGFACEHUB_API_TOKEN', 'HF_API_KEY'],
157
+ preferredModels: ['openai/gpt-oss-120b', 'Qwen/Qwen3-Coder-480B-A35B-Instruct'],
158
+ discovery: {
159
+ kind: 'openai',
160
+ // HF's OpenAI-compatible router exposes /v1/models across all inference providers.
161
+ modelsUrl: () => 'https://router.huggingface.co/v1/models',
162
+ authHeader: bearer,
163
+ filter: chatOnly,
164
+ },
165
+ },
152
166
  {
153
167
  id: 'ollama',
154
168
  label: 'Ollama (local)',
@@ -196,20 +210,92 @@ export function findApiKeyEnvVar(descriptor) {
196
210
  * - When `discoveredModels` is omitted, the curated `preferredModels` are
197
211
  * returned, all flagged ⭐ preferred.
198
212
  * - When provided, every discovered model is listed; those that also appear in
199
- * the curated `preferredModels` are flagged ⭐ preferred.
213
+ * the curated `preferredModels` are flagged ⭐ preferred. The list is ordered
214
+ * **preferred first** (in curated order, so the recommended default sits on top
215
+ * and is pre-selected), then every other discovered model **alphabetically** —
216
+ * so a large catalog (e.g. OpenRouter's 200+ models) is navigable instead of
217
+ * arriving in the endpoint's arbitrary order.
200
218
  */
201
219
  export function buildModelList(descriptor, discoveredModels) {
202
220
  if (!discoveredModels) {
203
221
  return descriptor.preferredModels.map((id) => ({ id, preferred: true }));
204
222
  }
205
- const preferred = new Set(descriptor.preferredModels);
206
- // Match preferred ids against the discovered tag, ignoring an explicit
207
- // `:latest` suffix so `qwen3` flags `qwen3:latest`.
208
- const isPreferred = (id) => preferred.has(id) || preferred.has(id.replace(/:latest$/, ''));
209
- return discoveredModels.map((id) => ({ id, preferred: isPreferred(id) }));
223
+ // Rank a discovered id by its position in the curated list, ignoring an explicit
224
+ // `:latest` suffix so `qwen3` matches `qwen3:latest`; `undefined` = not preferred.
225
+ const preferredRank = new Map(descriptor.preferredModels.map((id, i) => [id, i]));
226
+ const rankOf = (id) => preferredRank.get(id) ?? preferredRank.get(id.replace(/:latest$/, ''));
227
+ const isPreferred = (id) => rankOf(id) !== undefined;
228
+ const ordered = [...discoveredModels].sort((a, b) => {
229
+ const ra = rankOf(a);
230
+ const rb = rankOf(b);
231
+ if (ra !== undefined && rb !== undefined)
232
+ return ra - rb; // both preferred → curated order
233
+ if (ra !== undefined)
234
+ return -1; // preferred sorts before non-preferred
235
+ if (rb !== undefined)
236
+ return 1;
237
+ return a.localeCompare(b); // neither preferred → alphabetical
238
+ });
239
+ return ordered.map((id) => ({ id, preferred: isPreferred(id) }));
240
+ }
241
+ /**
242
+ * The single fallback source of truth for a provider's default model id (CFG-14).
243
+ *
244
+ * Returns the top curated ⭐ `preferredModels` entry for the provider — the one
245
+ * id that provider factories fall back to when a config carries no `model`, and
246
+ * the id first-run writes when live discovery is impossible. Centralising it here
247
+ * means the fallback lives in exactly ONE place (the curated registry above)
248
+ * instead of being duplicated as a literal in every `providers/<id>.ts`.
249
+ *
250
+ * Every registered provider is required to carry at least one curated model, so
251
+ * this always resolves for a known id; it throws for an unknown provider or a
252
+ * provider whose `preferredModels` is empty (a developer error — the invariant
253
+ * that the fallback source is complete would otherwise fail silently).
254
+ *
255
+ * @returns the curated default model id (always defined for a known provider).
256
+ */
257
+ export function getCuratedFallbackModel(providerId) {
258
+ const model = PROVIDER_DESCRIPTORS.find((d) => d.id === providerId)?.preferredModels[0];
259
+ if (!model) {
260
+ throw new Error(`No curated fallback model registered for provider "${providerId}".`);
261
+ }
262
+ return model;
210
263
  }
211
- /** Live-fetch timeout: short enough to never block first-run for long. */
264
+ /**
265
+ * Build the minimal `.gsloth.config.json` body an `init` template writes for a
266
+ * provider (CFG-14). When `model` is omitted, the `model` key is left OUT of the
267
+ * config entirely, so the provider factory resolves it at run time from
268
+ * {@link getCuratedFallbackModel} — the single curated source that tracks the
269
+ * installed version, rather than a literal frozen into the user's file that 404s
270
+ * once the model is retired.
271
+ *
272
+ * A `$schema` pointer ({@link CONFIG_SCHEMA_POINTER}) is written first so editors offer
273
+ * autocomplete/validation against the shipped JSON Schema (GS2-1). `$schema` is a known,
274
+ * runtime-ignored config field (see the zod schema), so it never affects loading.
275
+ */
276
+ export function buildInitConfigContent(providerId, model) {
277
+ const llm = { type: providerId };
278
+ if (model)
279
+ llm.model = model;
280
+ return JSON.stringify({ $schema: CONFIG_SCHEMA_POINTER, llm }, null, 2);
281
+ }
282
+ /**
283
+ * Live-fetch timeout for the NON-interactive probes: provider detection's Ollama
284
+ * liveness check and `resolveInitModel`. Short enough to never block for long when
285
+ * a daemon is down or a key is dead — every current caller keeps this default.
286
+ */
212
287
  const DISCOVERY_TIMEOUT_MS = 2000;
288
+ /**
289
+ * CFG-21 — the timeout for the *interactive* first-run model fetch. The dialog is
290
+ * blocking on a human who just picked a provider, so it can afford to wait a lot
291
+ * longer than the background probes for a large cloud catalog (OpenRouter ~300
292
+ * models) to arrive over a cold connection, rather than losing the 2s race and
293
+ * silently dropping to a 3-item curated stub. Threaded per-call so ONLY the dialog
294
+ * uses it — `detectProviders` / `resolveInitModel` stay on the short
295
+ * {@link DISCOVERY_TIMEOUT_MS} probe (a long global would hang the *provider* step
296
+ * whenever the local Ollama daemon is down).
297
+ */
298
+ export const INTERACTIVE_MODEL_FETCH_TIMEOUT_MS = 12_000;
213
299
  /**
214
300
  * Parse the `id`s out of a models-endpoint payload. Both the OpenAI-compatible
215
301
  * shape and Anthropic's native shape use a top-level `{ data: [{ id }] }`
@@ -225,28 +311,36 @@ function parseModelIds(body) {
225
311
  }
226
312
  /**
227
313
  * Internal: run live discovery for one descriptor, distinguishing a successful
228
- * live query from a curated fallback.
314
+ * live query from a curated fallback and — via {@link ModelDiscoveryStatus} —
315
+ * a by-design curated result from an attempted-and-failed one (CFG-21).
229
316
  *
230
- * @returns `{ models, live }` where `live` is true only when the models came
231
- * from a successful, non-empty live `/v1/models` query (used as the Ollama
232
- * availability signal). `live` is false for curated/fallback results.
317
+ * @param options.timeoutMs live-fetch timeout, defaulting to the short
318
+ * {@link DISCOVERY_TIMEOUT_MS} so background probes are unchanged.
319
+ * @returns `{ models, live, status }`. `live` is true only when the models came
320
+ * from a successful, non-empty live `/v1/models` query (kept as the Ollama
321
+ * availability signal). `status` is `live` in that case, `fallback` when a live
322
+ * query was attempted but failed (network/timeout/non-2xx/empty), and `curated`
323
+ * when no live query was attempted (`kind:'none'` or no API key).
233
324
  */
234
- async function discoverModelsInternal(descriptor) {
235
- const curated = () => ({
325
+ async function discoverModelsInternal(descriptor, options = {}) {
326
+ const timeoutMs = options.timeoutMs ?? DISCOVERY_TIMEOUT_MS;
327
+ const curated = (status) => ({
236
328
  models: buildModelList(descriptor),
237
329
  live: false,
330
+ status,
238
331
  });
239
332
  const { discovery } = descriptor;
240
333
  if (discovery.kind === 'none' || !discovery.modelsUrl) {
241
- return curated();
334
+ return curated('curated');
242
335
  }
243
336
  // Resolve an API key for cloud providers; ollama needs none.
244
337
  let key = '';
245
338
  if (descriptor.id !== 'ollama') {
246
339
  const envVar = findApiKeyEnvVar(descriptor);
247
340
  if (!envVar) {
248
- // No key → don't hit the network; show the curated catalog.
249
- return curated();
341
+ // No key → don't hit the network; show the curated catalog. This is the
342
+ // by-design path, NOT a "couldn't reach" degrade — hence `curated`.
343
+ return curated('curated');
250
344
  }
251
345
  key = env[envVar] ?? '';
252
346
  }
@@ -259,11 +353,11 @@ async function discoverModelsInternal(descriptor) {
259
353
  const res = await fetch(url, {
260
354
  method: 'GET',
261
355
  headers,
262
- signal: AbortSignal.timeout(DISCOVERY_TIMEOUT_MS),
356
+ signal: AbortSignal.timeout(timeoutMs),
263
357
  });
264
358
  if (!res.ok) {
265
359
  displayDebug(`Model discovery for "${descriptor.id}" returned HTTP ${res.status}.`);
266
- return curated();
360
+ return curated('fallback');
267
361
  }
268
362
  const body = await res.json();
269
363
  let ids = parseModelIds(body);
@@ -272,13 +366,13 @@ async function discoverModelsInternal(descriptor) {
272
366
  }
273
367
  if (ids.length === 0) {
274
368
  displayDebug(`Model discovery for "${descriptor.id}" returned no usable models.`);
275
- return curated();
369
+ return curated('fallback');
276
370
  }
277
- return { models: buildModelList(descriptor, ids), live: true };
371
+ return { models: buildModelList(descriptor, ids), live: true, status: 'live' };
278
372
  }
279
373
  catch (e) {
280
374
  displayDebug(`Model discovery for "${descriptor.id}" failed: ${e instanceof Error ? e.message : String(e)}`);
281
- return curated();
375
+ return curated('fallback');
282
376
  }
283
377
  }
284
378
  /**
@@ -297,12 +391,12 @@ async function discoverModelsInternal(descriptor) {
297
391
  * the curated catalog is returned directly. Ollama (no key, local daemon) is
298
392
  * always probed.
299
393
  */
300
- export async function discoverModels(providerId) {
394
+ export async function discoverModels(providerId, options) {
301
395
  const descriptor = PROVIDER_DESCRIPTORS.find((d) => d.id === providerId);
302
396
  if (!descriptor) {
303
397
  throw new Error(`Unknown provider: ${providerId}`);
304
398
  }
305
- const { models } = await discoverModelsInternal(descriptor);
399
+ const { models } = await discoverModelsInternal(descriptor, options);
306
400
  return models;
307
401
  }
308
402
  /**
@@ -311,9 +405,71 @@ export async function discoverModels(providerId) {
311
405
  * Live-discovers from the provider's models endpoint where possible (with a
312
406
  * curated fallback); returns the curated set for `kind: 'none'` providers. Does
313
407
  * not require the provider to be "available".
408
+ *
409
+ * `options.timeoutMs` (CFG-21) overrides the default short live-fetch timeout; the
410
+ * bare `listModels(providerId)` call is unchanged.
411
+ */
412
+ export async function listModels(providerId, options) {
413
+ return discoverModels(providerId, options);
414
+ }
415
+ /**
416
+ * CFG-21 — like {@link discoverModels} but also returns the model list's
417
+ * {@link ModelDiscoveryStatus} provenance, so an interactive caller (the first-run
418
+ * dialog) can tell an honest "couldn't reach the provider" degrade (`fallback`)
419
+ * apart from a by-design curated list (`curated`) and a real live catalog (`live`).
420
+ * Kept as a separate export so `listModels` / `discoverModels` keep their existing
421
+ * `(providerId) => ModelInfo[]` signatures other callers rely on.
422
+ *
423
+ * Never throws for a discovery failure (that degrades to `fallback`); it only
424
+ * throws for an unknown provider id, mirroring {@link discoverModels}.
314
425
  */
315
- export async function listModels(providerId) {
316
- return discoverModels(providerId);
426
+ export async function discoverModelsWithProvenance(providerId, options) {
427
+ const descriptor = PROVIDER_DESCRIPTORS.find((d) => d.id === providerId);
428
+ if (!descriptor) {
429
+ throw new Error(`Unknown provider: ${providerId}`);
430
+ }
431
+ const { models, status } = await discoverModelsInternal(descriptor, options);
432
+ return { models, status };
433
+ }
434
+ /**
435
+ * Resolve the model id that `init` should bake into a generated config for a
436
+ * provider (CFG-14) — the safeguard against writing a speculative id that 404s
437
+ * once the model is retired.
438
+ *
439
+ * - **Live discovery possible** (a key / running daemon and a responding
440
+ * `/v1/models` endpoint): returns a *verified-present* id — the highest-ranked
441
+ * curated ⭐ id that is actually in the live list (matched tolerant of an
442
+ * `:latest` suffix), or, when no curated id is live, the first live id.
443
+ * - **Live discovery impossible** (`kind: 'none'`, no key, offline, empty
444
+ * catalog): returns `undefined`. This is the ONLY speculative path, and it
445
+ * deliberately declines to invent a literal: the caller OMITS `model` so the
446
+ * provider factory falls back to {@link getCuratedFallbackModel} at run time
447
+ * (a single curated source that upgrades with the installed version).
448
+ *
449
+ * Never throws — a bad key or network error degrades to `undefined`, mirroring
450
+ * {@link discoverModels}.
451
+ */
452
+ export async function resolveInitModel(providerId) {
453
+ const descriptor = PROVIDER_DESCRIPTORS.find((d) => d.id === providerId);
454
+ if (!descriptor)
455
+ return undefined;
456
+ const { models, live } = await discoverModelsInternal(descriptor);
457
+ // Not a live catalog → do NOT emit a speculative literal; defer to the run-time
458
+ // curated fallback by omitting `model`.
459
+ if (!live || models.length === 0)
460
+ return undefined;
461
+ // Prefer the highest-ranked curated id that is actually present in the live
462
+ // list, tolerating an explicit `:latest` suffix (so curated `qwen3` matches a
463
+ // live `qwen3:latest`).
464
+ const strip = (id) => id.replace(/:latest$/, '');
465
+ const liveByStripped = new Map(models.map((m) => [strip(m.id), m.id]));
466
+ for (const curated of descriptor.preferredModels) {
467
+ const hit = liveByStripped.get(strip(curated));
468
+ if (hit)
469
+ return hit;
470
+ }
471
+ // No curated id is live → the first live id is still a verified-present choice.
472
+ return models[0].id;
317
473
  }
318
474
  /**
319
475
  * Detect every known provider on this machine and list its models.
@@ -1 +1 @@
1
- {"version":3,"file":"modelDiscovery.js","sourceRoot":"","sources":["../../src/providers/modelDiscovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"modelDiscovery.js","sourceRoot":"","sources":["../../src/providers/modelDiscovery.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,19 @@
1
- import { BaseChatModel, type BaseChatModelParams } from '@langchain/core/language_models/chat_models';
2
- import { OpenAIChatInput } from '@langchain/openai';
3
- import { ChatOpenAIFields } from '@langchain/openai';
4
- export declare function processJsonConfig(llmConfig: OpenAIChatInput & ChatOpenAIFields & BaseChatModelParams): Promise<BaseChatModel>;
5
- export declare function init(configFileName: string): void;
1
+ import type { BaseChatModel, BaseChatModelParams } from '@langchain/core/language_models/chat_models';
2
+ import type { ChatOllamaInput } from '@langchain/ollama';
3
+ /**
4
+ * GS2-59 build a native `ChatOllama` client (`@langchain/ollama`, talking to Ollama's
5
+ * `/api/chat`). This replaces the previous `ChatOpenAI`→`/v1` client, which had two fatal
6
+ * properties for local thinking models: it DROPPED the model's separate reasoning field (the
7
+ * completions converter discards it — `__includeRawResponse` is openrouter-only), and it IGNORED
8
+ * `num_ctx` so a large agentic prompt starved the answer to empty content. `ChatOllama` fixes both:
9
+ * it honors `numCtx`, and it surfaces the model's thinking in `additional_kwargs.reasoning_content`
10
+ * — the exact field the reasoning pipeline (`pickReasoningDelta`) already reads — so the `/reasoning`
11
+ * panel populates with no downstream change.
12
+ *
13
+ * Ollama is a local, unauthenticated daemon, so the old OpenAI-client knobs are gone (2.0 migration
14
+ * note): point elsewhere with `OLLAMA_HOST`; the previous `configuration.baseURL` / placeholder
15
+ * `apiKey` fields no longer apply. If a reverse proxy in front of Ollama needs auth, set `headers`
16
+ * in the config (passed straight through to `ChatOllama`).
17
+ */
18
+ export declare function processJsonConfig(llmConfig: ChatOllamaInput & BaseChatModelParams): Promise<BaseChatModel>;
19
+ export declare function init(configFileName: string, force?: boolean, model?: string): void;
@@ -1,77 +1,85 @@
1
1
  import { displayWarning } from '#src/utils/consoleUtils.js';
2
2
  import { env } from '#src/utils/systemUtils.js';
3
- import { writeFileIfNotExistsWithMessages } from '#src/utils/fileUtils.js';
3
+ import { writeConfigFileWithMessages } from '#src/utils/fileUtils.js';
4
+ import { buildInitConfigContent, getCuratedFallbackModel } from '#src/providers/modelDiscovery.js';
4
5
  /**
5
- * Default Ollama daemon host, matching the Ollama CLI/library default. The
6
- * OpenAI-compatible surface lives under `/v1` on this host. Kept in sync with
7
- * `DEFAULT_OLLAMA_HOST` in `modelDiscovery.ts`.
6
+ * Default Ollama daemon host, matching the Ollama CLI/library default. GS2-59 — `ChatOllama` talks
7
+ * to the daemon's NATIVE endpoint (`/api/chat`), NOT the OpenAI-compatible `/v1` shim this provider
8
+ * used before. The same root host is reused by `modelDiscovery.ts`'s model picker, which still
9
+ * queries the `/v1/models` surface (discovery only); both derive from this root — they stay in sync
10
+ * at the host level even though the two use different endpoints under it.
8
11
  */
9
12
  const DEFAULT_OLLAMA_HOST = 'http://127.0.0.1:11434';
10
13
  /**
11
- * Curated default model mirrors the first preferred model advertised for
12
- * ollama by first-run discovery (`PROVIDER_DESCRIPTORS` in modelDiscovery.ts).
13
- */
14
- const DEFAULT_OLLAMA_MODEL = 'qwen3-coder';
15
- /**
16
- * Ollama serves an unauthenticated local daemon, but `ChatOpenAI` requires a
17
- * non-empty `apiKey` string. Send a harmless placeholder so the client builds;
18
- * the local daemon ignores it.
14
+ * GS2-59 default context window (`num_ctx`) for Ollama models. Ollama's OWN default is 4096, but
15
+ * gaunt-sloth's agentic prompt (system + full lean toolset + a tool result) already lands ~4000
16
+ * tokens; at 4096 a thinking model (e.g. gemma4:31b) spends its entire remaining budget on the
17
+ * reasoning field and emits EMPTY `content` on the turn after a tool executes — the GS2-59
18
+ * blank-answer regression. The previous `ChatOpenAI`→`/v1` path could not fix this because the
19
+ * OpenAI-compat shim IGNORES `num_ctx`; the native `/api/chat` path honors it.
20
+ *
21
+ * 16384 is chosen as the largest window that is BOTH safely above the ~4000-token starvation point
22
+ * (4× headroom for reasoning + a few tool results) AND fits constrained consumer VRAM: Ollama
23
+ * preallocates the KV cache at `num_ctx`, so on a box where a large model already spills partly to
24
+ * CPU (e.g. a 19GB model on ~18GB of GPU), a 32768 cache tips the GPU allocation into an
25
+ * out-of-memory error. 16384 was verified live to run the agentic tool→synthesis turn on such a
26
+ * box; 32768 OOM'd it. Overridable per config via `llm.numCtx` — raise it if you have the VRAM and
27
+ * run long sessions, lower it on very tight hardware. NOTE: a per-request `num_ctx` overrides the
28
+ * daemon's `OLLAMA_CONTEXT_LENGTH`, so a user who tuned their server window higher should set
29
+ * `llm.numCtx` to match rather than rely on the server default.
19
30
  */
20
- const OLLAMA_PLACEHOLDER_API_KEY = 'ollama';
31
+ const DEFAULT_OLLAMA_NUM_CTX = 16384;
21
32
  /**
22
- * Resolve the OpenAI-compatible base URL for the local Ollama daemon.
23
- *
24
- * Honors the `OLLAMA_HOST` env override (the same variable the Ollama CLI uses).
25
- * `OLLAMA_HOST` is typically a full URL (`http://127.0.0.1:11434`) or a bare
26
- * `host:port`; either form is normalized to a `http(s)://host[:port]/v1` base.
33
+ * Resolve the base URL for the local Ollama daemon — the NATIVE root (no `/v1` suffix; `ChatOllama`
34
+ * appends its own `/api/chat` path). Honors the `OLLAMA_HOST` env override (the same variable the
35
+ * Ollama CLI uses): a full URL (`http://127.0.0.1:11434`) or a bare `host:port` is normalized to
36
+ * `http(s)://host[:port]` with any trailing slash stripped.
27
37
  */
28
38
  function resolveBaseUrl() {
29
39
  const host = env.OLLAMA_HOST;
30
- let base;
31
- if (!host) {
32
- base = DEFAULT_OLLAMA_HOST;
33
- }
34
- else if (/^https?:\/\//.test(host)) {
35
- base = host.replace(/\/+$/, '');
36
- }
37
- else {
38
- base = `http://${host}`.replace(/\/+$/, '');
39
- }
40
- return `${base}/v1`;
40
+ if (!host)
41
+ return DEFAULT_OLLAMA_HOST;
42
+ const base = /^https?:\/\//.test(host) ? host : `http://${host}`;
43
+ return base.replace(/\/+$/, '');
41
44
  }
42
- // Function to process JSON config and create an Ollama (OpenAI-compatible) LLM instance
45
+ /**
46
+ * GS2-59 — build a native `ChatOllama` client (`@langchain/ollama`, talking to Ollama's
47
+ * `/api/chat`). This replaces the previous `ChatOpenAI`→`/v1` client, which had two fatal
48
+ * properties for local thinking models: it DROPPED the model's separate reasoning field (the
49
+ * completions converter discards it — `__includeRawResponse` is openrouter-only), and it IGNORED
50
+ * `num_ctx` so a large agentic prompt starved the answer to empty content. `ChatOllama` fixes both:
51
+ * it honors `numCtx`, and it surfaces the model's thinking in `additional_kwargs.reasoning_content`
52
+ * — the exact field the reasoning pipeline (`pickReasoningDelta`) already reads — so the `/reasoning`
53
+ * panel populates with no downstream change.
54
+ *
55
+ * Ollama is a local, unauthenticated daemon, so the old OpenAI-client knobs are gone (2.0 migration
56
+ * note): point elsewhere with `OLLAMA_HOST`; the previous `configuration.baseURL` / placeholder
57
+ * `apiKey` fields no longer apply. If a reverse proxy in front of Ollama needs auth, set `headers`
58
+ * in the config (passed straight through to `ChatOllama`).
59
+ */
43
60
  // noinspection JSUnusedGlobalSymbols
44
61
  export async function processJsonConfig(llmConfig) {
45
- const { ChatOpenAI } = await import('@langchain/openai');
46
- // Ollama is local and unauthenticated; ChatOpenAI still needs a non-empty key.
47
- const apiKey = llmConfig.apiKey || OLLAMA_PLACEHOLDER_API_KEY;
62
+ const { ChatOllama } = await import('@langchain/ollama');
48
63
  const configFields = {
49
64
  ...llmConfig,
50
- apiKey,
51
- model: llmConfig.model || DEFAULT_OLLAMA_MODEL,
52
- configuration: {
53
- baseURL: resolveBaseUrl(),
54
- ...(llmConfig.configuration || {}),
55
- },
65
+ model: llmConfig.model || getCuratedFallbackModel('ollama'),
66
+ // Precedence: an explicit config `baseUrl` (the native ChatOllama field) wins, else the
67
+ // `OLLAMA_HOST` env, else the local default. Config is the more specific/intentional signal.
68
+ baseUrl: llmConfig.baseUrl ?? resolveBaseUrl(),
69
+ numCtx: llmConfig.numCtx ?? DEFAULT_OLLAMA_NUM_CTX,
56
70
  };
57
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
- delete configFields.type;
59
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
- delete configFields.apiKeyEnvironmentVariable;
61
- return new ChatOpenAI(configFields);
71
+ // Strip OpenAI-client / gaunt-sloth-internal keys ChatOllama neither needs nor understands.
72
+ for (const key of ['type', 'apiKeyEnvironmentVariable', 'apiKey', 'configuration']) {
73
+ delete configFields[key];
74
+ }
75
+ return new ChatOllama(configFields);
62
76
  }
63
- const jsonContent = `{
64
- "llm": {
65
- "type": "ollama",
66
- "model": "qwen3-coder"
67
- }
68
- }`;
69
- export function init(configFileName) {
77
+ export function init(configFileName, force = false, model) {
70
78
  // Determine which content to use based on file extension
71
79
  if (!configFileName.endsWith('.json')) {
72
80
  throw new Error('Only JSON config is supported.');
73
81
  }
74
- writeFileIfNotExistsWithMessages(configFileName, jsonContent);
82
+ writeConfigFileWithMessages(configFileName, buildInitConfigContent('ollama', model), force);
75
83
  displayWarning(`You need to edit your ${configFileName} to configure the model. ` +
76
84
  'Ollama runs locally and needs no API key; set OLLAMA_HOST if your daemon ' +
77
85
  'is not on the default http://127.0.0.1:11434.');
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAQhD,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAE3E;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAErD;;;GAGG;AACH,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAE3C;;;;GAIG;AACH,MAAM,0BAA0B,GAAG,QAAQ,CAAC;AAE5C;;;;;;GAMG;AACH,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;IAC7B,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,mBAAmB,CAAC;IAC7B,CAAC;SAAM,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,UAAU,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,IAAI,KAAK,CAAC;AACtB,CAAC;AAED,wFAAwF;AACxF,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAmE;IAEnE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACzD,+EAA+E;IAC/E,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,0BAA0B,CAAC;IAC9D,MAAM,YAAY,GAAG;QACnB,GAAG,SAAS;QACZ,MAAM;QACN,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,oBAAoB;QAC9C,aAAa,EAAE;YACb,OAAO,EAAE,cAAc,EAAE;YACzB,GAAG,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC;SACnC;KACF,CAAC;IACF,8DAA8D;IAC9D,OAAQ,YAAoB,CAAC,IAAI,CAAC;IAClC,8DAA8D;IAC9D,OAAQ,YAAoB,CAAC,yBAAyB,CAAC;IAEvD,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,WAAW,GAAG;;;;;EAKlB,CAAC;AAEH,MAAM,UAAU,IAAI,CAAC,cAAsB;IACzC,yDAAyD;IACzD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,gCAAgC,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC9D,cAAc,CACZ,yBAAyB,cAAc,2BAA2B;QAChE,2EAA2E;QAC3E,+CAA+C,CAClD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAOhD,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEnG;;;;;;GAMG;AACH,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAErD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAErC;;;;;GAKG;AACH,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,mBAAmB,CAAC;IACtC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;IACjE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAgD;IAEhD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACzD,MAAM,YAAY,GAA4B;QAC5C,GAAG,SAAS;QACZ,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,uBAAuB,CAAC,QAAQ,CAAC;QAC3D,wFAAwF;QACxF,6FAA6F;QAC7F,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,cAAc,EAAE;QAC9C,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,sBAAsB;KACnD,CAAC;IACF,4FAA4F;IAC5F,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,2BAA2B,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,CAAC;QACnF,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,YAA+B,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,cAAsB,EAAE,KAAK,GAAG,KAAK,EAAE,KAAc;IACxE,yDAAyD;IACzD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,2BAA2B,CAAC,cAAc,EAAE,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5F,cAAc,CACZ,yBAAyB,cAAc,2BAA2B;QAChE,2EAA2E;QAC3E,+CAA+C,CAClD,CAAC;AACJ,CAAC"}
@@ -2,4 +2,4 @@ import { BaseChatModel, type BaseChatModelParams } from '@langchain/core/languag
2
2
  import { OpenAIChatInput } from '@langchain/openai';
3
3
  import { ChatOpenAIFields } from '@langchain/openai';
4
4
  export declare function processJsonConfig(llmConfig: OpenAIChatInput & ChatOpenAIFields & BaseChatModelParams): Promise<BaseChatModel>;
5
- export declare function init(configFileName: string): void;
5
+ export declare function init(configFileName: string, force?: boolean, model?: string): void;
@@ -1,6 +1,7 @@
1
1
  import { displayWarning } from '#src/utils/consoleUtils.js';
2
2
  import { env } from '#src/utils/systemUtils.js';
3
- import { writeFileIfNotExistsWithMessages } from '#src/utils/fileUtils.js';
3
+ import { writeConfigFileWithMessages } from '#src/utils/fileUtils.js';
4
+ import { buildInitConfigContent, getCuratedFallbackModel } from '#src/providers/modelDiscovery.js';
4
5
  /**
5
6
  * OpenAI reasoning-model families that reject any non-default `temperature`: the API 400s with
6
7
  * "Unsupported value: 'temperature' does not support 0 ... Only the default (1) value is
@@ -24,7 +25,7 @@ export async function processJsonConfig(llmConfig) {
24
25
  const configFields = {
25
26
  ...llmConfig,
26
27
  apiKey: openaiApiKey,
27
- model: llmConfig.model || 'gpt-5.5',
28
+ model: llmConfig.model || getCuratedFallbackModel('openai'),
28
29
  };
29
30
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
31
  delete configFields.type;
@@ -54,18 +55,12 @@ function getApiKey(llmConfig) {
54
55
  return llmConfig.apiKey || env.OPENAI_API_KEY;
55
56
  }
56
57
  }
57
- const jsonContent = `{
58
- "llm": {
59
- "type": "openai",
60
- "model": "gpt-5.5"
61
- }
62
- }`;
63
- export function init(configFileName) {
58
+ export function init(configFileName, force = false, model) {
64
59
  // Determine which content to use based on file extension
65
60
  if (!configFileName.endsWith('.json')) {
66
61
  throw new Error('Only JSON config is supported.');
67
62
  }
68
- writeFileIfNotExistsWithMessages(configFileName, jsonContent);
63
+ writeConfigFileWithMessages(configFileName, buildInitConfigContent('openai', model), force);
69
64
  displayWarning(`You need to edit your ${configFileName} to configure model, ` +
70
65
  'or define OPENAI_API_KEY environment variable.');
71
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAQhD,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAE3E;;;;;;;GAOG;AACH,MAAM,4BAA4B,GAAG,eAAe,CAAC;AAErD,yFAAyF;AACzF,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAExC,SAAS,4BAA4B,CAAC,KAAyB;IAC7D,OAAO,CAAC,CAAC,KAAK,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,iEAAiE;AACjE,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAmE;IAEnE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACzD,wEAAwE;IACxE,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG;QACnB,GAAG,SAAS;QACZ,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,SAAS;KACpC,CAAC;IACF,8DAA8D;IAC9D,OAAQ,YAAoB,CAAC,IAAI,CAAC;IAClC,8DAA8D;IAC9D,OAAQ,YAAoB,CAAC,yBAAyB,CAAC;IAEvD,6FAA6F;IAC7F,8FAA8F;IAC9F,6FAA6F;IAC7F,IACE,4BAA4B,CAAC,YAAY,CAAC,KAAK,CAAC;QAChD,YAAY,CAAC,WAAW,KAAK,SAAS;QACtC,YAAY,CAAC,WAAW,KAAK,6BAA6B,EAC1D,CAAC;QACD,cAAc,CACZ,UAAU,YAAY,CAAC,KAAK,0CAA0C;YACpE,qBAAqB,6BAA6B,gBAAgB;YAClE,0CAA0C,YAAY,CAAC,WAAW,GAAG,CACxE,CAAC;QACF,8DAA8D;QAC9D,OAAQ,YAAoB,CAAC,WAAW,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,SAAS,CAAC,SAAmE;IACpF,8DAA8D;IAC9D,MAAM,IAAI,GAAG,SAA0C,CAAC;IACxD,IAAI,IAAI,CAAC,yBAAyB,IAAI,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC;QAC1E,OAAO,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAG;;;;;EAKlB,CAAC;AAEH,MAAM,UAAU,IAAI,CAAC,cAAsB;IACzC,yDAAyD;IACzD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,gCAAgC,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC9D,cAAc,CACZ,yBAAyB,cAAc,uBAAuB;QAC5D,gDAAgD,CACnD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAQhD,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEnG;;;;;;;GAOG;AACH,MAAM,4BAA4B,GAAG,eAAe,CAAC;AAErD,yFAAyF;AACzF,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAExC,SAAS,4BAA4B,CAAC,KAAyB;IAC7D,OAAO,CAAC,CAAC,KAAK,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,iEAAiE;AACjE,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAmE;IAEnE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACzD,wEAAwE;IACxE,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG;QACnB,GAAG,SAAS;QACZ,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,uBAAuB,CAAC,QAAQ,CAAC;KAC5D,CAAC;IACF,8DAA8D;IAC9D,OAAQ,YAAoB,CAAC,IAAI,CAAC;IAClC,8DAA8D;IAC9D,OAAQ,YAAoB,CAAC,yBAAyB,CAAC;IAEvD,6FAA6F;IAC7F,8FAA8F;IAC9F,6FAA6F;IAC7F,IACE,4BAA4B,CAAC,YAAY,CAAC,KAAK,CAAC;QAChD,YAAY,CAAC,WAAW,KAAK,SAAS;QACtC,YAAY,CAAC,WAAW,KAAK,6BAA6B,EAC1D,CAAC;QACD,cAAc,CACZ,UAAU,YAAY,CAAC,KAAK,0CAA0C;YACpE,qBAAqB,6BAA6B,gBAAgB;YAClE,0CAA0C,YAAY,CAAC,WAAW,GAAG,CACxE,CAAC;QACF,8DAA8D;QAC9D,OAAQ,YAAoB,CAAC,WAAW,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,SAAS,CAAC,SAAmE;IACpF,8DAA8D;IAC9D,MAAM,IAAI,GAAG,SAA0C,CAAC;IACxD,IAAI,IAAI,CAAC,yBAAyB,IAAI,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC;QAC1E,OAAO,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,cAAsB,EAAE,KAAK,GAAG,KAAK,EAAE,KAAc;IACxE,yDAAyD;IACzD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,2BAA2B,CAAC,cAAc,EAAE,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5F,cAAc,CACZ,yBAAyB,cAAc,uBAAuB;QAC5D,gDAAgD,CACnD,CAAC;AACJ,CAAC"}
@@ -2,4 +2,4 @@ import { BaseChatModel, type BaseChatModelParams } from '@langchain/core/languag
2
2
  import { OpenAIChatInput } from '@langchain/openai';
3
3
  import { ChatOpenAIFields } from '@langchain/openai';
4
4
  export declare function processJsonConfig(llmConfig: OpenAIChatInput & ChatOpenAIFields & BaseChatModelParams): Promise<BaseChatModel>;
5
- export declare function init(configFileName: string): void;
5
+ export declare function init(configFileName: string, force?: boolean, model?: string): void;