@easynet/agent-model 1.0.72 → 1.0.74

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 (52) hide show
  1. package/config/model.yaml +12 -4
  2. package/dist/api/chat-model.d.ts +9 -0
  3. package/dist/api/chat-model.d.ts.map +1 -0
  4. package/dist/api/connectivity.d.ts +8 -0
  5. package/dist/api/connectivity.d.ts.map +1 -0
  6. package/dist/api/create-agent-llm.d.ts +1 -1
  7. package/dist/api/create-agent-llm.d.ts.map +1 -1
  8. package/dist/api/create-agent-model-registry.d.ts +1 -1
  9. package/dist/api/create-agent-model-registry.d.ts.map +1 -1
  10. package/dist/api/register-model.d.ts +1 -0
  11. package/dist/api/register-model.d.ts.map +1 -1
  12. package/dist/{chunk-XUMUOTO7.js → chunk-NAH4USJ2.js} +9 -20
  13. package/dist/chunk-NAH4USJ2.js.map +1 -0
  14. package/dist/chunk-OQPM73A7.js +133 -0
  15. package/dist/chunk-OQPM73A7.js.map +1 -0
  16. package/dist/cli/index.js +5 -83
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/extensions/index.d.ts +2 -2
  19. package/dist/extensions/index.d.ts.map +1 -1
  20. package/dist/extensions/index.js +1 -7
  21. package/dist/extensions/npm-protocol.d.ts +0 -7
  22. package/dist/extensions/npm-protocol.d.ts.map +1 -1
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +9 -79
  26. package/dist/index.js.map +1 -1
  27. package/package.json +2 -1
  28. package/dist/api/create-embed-fn.d.ts +0 -10
  29. package/dist/api/create-embed-fn.d.ts.map +0 -1
  30. package/dist/api/get-default-llm-config.d.ts +0 -16
  31. package/dist/api/get-default-llm-config.d.ts.map +0 -1
  32. package/dist/api/get-default-vlm-config.d.ts +0 -15
  33. package/dist/api/get-default-vlm-config.d.ts.map +0 -1
  34. package/dist/chunk-4V7M3TFR.js +0 -75
  35. package/dist/chunk-4V7M3TFR.js.map +0 -1
  36. package/dist/chunk-AUQEXHUP.js +0 -105
  37. package/dist/chunk-AUQEXHUP.js.map +0 -1
  38. package/dist/chunk-XUMUOTO7.js.map +0 -1
  39. package/dist/config/index.d.ts +0 -18
  40. package/dist/config/index.d.ts.map +0 -1
  41. package/dist/config/index.js +0 -71
  42. package/dist/config/index.js.map +0 -1
  43. package/dist/config/ref.d.ts +0 -7
  44. package/dist/config/ref.d.ts.map +0 -1
  45. package/dist/connectivity/check.d.ts +0 -18
  46. package/dist/connectivity/check.d.ts.map +0 -1
  47. package/dist/connectivity/index.d.ts +0 -3
  48. package/dist/connectivity/index.d.ts.map +0 -1
  49. package/dist/connectivity/index.js +0 -11
  50. package/dist/connectivity/index.js.map +0 -1
  51. package/dist/connectivity/types.d.ts +0 -13
  52. package/dist/connectivity/types.d.ts.map +0 -1
@@ -6,12 +6,6 @@ import type { BaseChatModel } from "@langchain/core/language_models/chat_models"
6
6
  import type { CreateChatModelOptions } from "../langchain/index.js";
7
7
  import { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec } from "@easynet/agent-common/npm";
8
8
  export { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec };
9
- export declare function getLatestVersion(packageName: string, options?: {
10
- cwd?: string;
11
- }): Promise<string>;
12
- export declare function getInstalledVersion(packageName: string, options?: {
13
- cwd?: string;
14
- }): string | null;
15
9
  export interface EnsureNpmPackageInstalledOptions {
16
10
  version?: string;
17
11
  cwd?: string;
@@ -21,7 +15,6 @@ export interface EnsureNpmPackageInstalledOptions {
21
15
  * We only use version numbers for management; "latest" is always resolved to the actual
22
16
  * version from the registry, then we install that version if missing or different.
23
17
  */
24
- export declare function ensureNpmPackageInstalled(packageName: string, options?: EnsureNpmPackageInstalledOptions): Promise<void>;
25
18
  export interface ResolveNpmProviderOptions {
26
19
  installNpmIfMissing?: boolean;
27
20
  cwd?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"npm-protocol.d.ts","sourceRoot":"","sources":["../../src/extensions/npm-protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAIjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EAIlB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;AAExE,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,GAAG,IAAI,CAEtG;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAcD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,MAAM,WAAW,yBAAyB;IACxC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAOD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsDxB;AAED,MAAM,WAAW,+BAAgC,SAAQ,yBAAyB;CAAG;AAErF,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,MAAM,WAAW,6BACf,SAAQ,sBAAsB,EAC5B,yBAAyB;CAAG;AAEhC,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,aAAa,CAAC,CAcxB"}
1
+ {"version":3,"file":"npm-protocol.d.ts","sourceRoot":"","sources":["../../src/extensions/npm-protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAIjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EAElB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;AAExE,MAAM,WAAW,gCAAgC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA2BD;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAOD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsDxB;AAED,MAAM,WAAW,+BAAgC,SAAQ,yBAAyB;CAAG;AAErF,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,MAAM,WAAW,6BACf,SAAQ,sBAAsB,EAC5B,yBAAyB;CAAG;AAEhC,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,aAAa,CAAC,CAcxB"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Minimal public API for @easynet/agent-model.
3
- * Only expose createAgentModel for framework initialization.
3
+ * Expose only module initializer for framework assembly.
4
4
  */
5
- export { createAgentModel } from "./api/register-model.js";
5
+ export { createAgentModel, type CreateAgentModelOptions } from "./api/register-model.js";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -1,13 +1,11 @@
1
1
  import {
2
+ applyDefaultToolChoice,
3
+ ensureConnectivity,
2
4
  loadModelConfig
3
- } from "./chunk-4V7M3TFR.js";
4
- import {
5
- buildUnreachableError,
6
- checkEndpointConnectivity
7
- } from "./chunk-AUQEXHUP.js";
5
+ } from "./chunk-OQPM73A7.js";
8
6
  import {
9
7
  resolveLlmSectionWithNpm
10
- } from "./chunk-XUMUOTO7.js";
8
+ } from "./chunk-NAH4USJ2.js";
11
9
  import {
12
10
  createChatModelFromLlmConfig
13
11
  } from "./chunk-UVIUQUYJ.js";
@@ -52,79 +50,6 @@ function ensureConfig(path) {
52
50
  }
53
51
  return loaded;
54
52
  }
55
- function applyDefaultToolChoice(model) {
56
- const m = model;
57
- const orig = m.bindTools?.bind(model);
58
- if (!orig) return;
59
- m.bindTools = function(tools, opts) {
60
- return orig(tools, { ...opts, tool_choice: "auto" });
61
- };
62
- }
63
- var CIS_DEFAULT_RESOLVE_HOST = "s0010-ml-https.s0010.us-west-2.awswd";
64
- var CIS_DEFAULT_RESOLVE_IP = "10.210.98.124";
65
- function buildEndpointConnectivityOptions(config) {
66
- const opts = config.options ?? config;
67
- const provider = typeof config.provider === "string" ? config.provider : "";
68
- const baseURL = config.baseURL;
69
- const isCis = provider === "cis" || provider.includes("cis");
70
- const useCisDefault = isCis && baseURL.includes(CIS_DEFAULT_RESOLVE_HOST) && opts?.resolveHost == null;
71
- const resolveHost = opts?.resolveHost != null && typeof opts.resolveHost.from === "string" ? opts.resolveHost : useCisDefault ? { from: CIS_DEFAULT_RESOLVE_HOST, to: CIS_DEFAULT_RESOLVE_IP } : void 0;
72
- const host = typeof opts?.host === "string" ? opts.host : resolveHost ? resolveHost.from : void 0;
73
- if (resolveHost == null && host == null) return void 0;
74
- const verifySSL = opts?.verifySSL === true;
75
- const bypassAuth = opts?.bypassAuth !== false;
76
- return {
77
- resolveHost,
78
- host,
79
- verifySSL: resolveHost != null ? false : verifySSL ? true : void 0,
80
- bypassAuth: bypassAuth ? true : void 0,
81
- featureKey: typeof opts?.featureKey === "string" ? opts.featureKey : void 0
82
- };
83
- }
84
- async function ensureConnectivity(resolvedLlmSection, options) {
85
- let configs;
86
- try {
87
- const parsed = parseLlmSection(resolvedLlmSection ?? null);
88
- configs = parsed.configs.filter(
89
- (c) => typeof c.baseURL === "string" && c.baseURL.length > 0 && (c.baseURL.startsWith("http://") || c.baseURL.startsWith("https://")) && !c.baseURL.includes("${")
90
- );
91
- } catch {
92
- return;
93
- }
94
- if (options.checkConnectivity === false || configs.length === 0) return;
95
- const report = (status) => options.onConnectionStatus?.(status);
96
- const timeoutMs = options.connectivityTimeoutMs ?? 8e3;
97
- for (const config of configs) {
98
- const { id, baseURL } = config;
99
- report({
100
- phase: "checking",
101
- endpointId: id,
102
- baseURL,
103
- message: "Checking connection..."
104
- });
105
- const endpointOpts = buildEndpointConnectivityOptions(config);
106
- const result = await checkEndpointConnectivity(baseURL, {
107
- timeoutMs,
108
- ...endpointOpts
109
- });
110
- if (result.reachable) {
111
- report({
112
- phase: "reachable",
113
- endpointId: id,
114
- baseURL,
115
- message: result.message ?? "Connected"
116
- });
117
- } else {
118
- report({
119
- phase: "unreachable",
120
- endpointId: id,
121
- baseURL,
122
- message: result.message ?? "Unreachable"
123
- });
124
- throw new Error(buildUnreachableError(id, baseURL, result.message));
125
- }
126
- }
127
- }
128
53
  async function resolveDefaultVlmConfig(merged, options = {}) {
129
54
  const sourceSection = merged.vlm ?? merged.llm;
130
55
  if (sourceSection == null) return null;
@@ -231,6 +156,11 @@ async function createAgentModel(options) {
231
156
  ctx.set(AgentContextTokens.EmbedModel, embed);
232
157
  } catch {
233
158
  }
159
+ try {
160
+ const vlm = await registry.getVlmChatModel();
161
+ ctx.set(AgentContextTokens.VlmModel, vlm);
162
+ } catch {
163
+ }
234
164
  }
235
165
  export {
236
166
  createAgentModel
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/register-model.ts","../src/api/create-agent-model-registry.ts"],"sourcesContent":["import { AgentContextTokens, getDefaultAgentContext } from \"@easynet/agent-common\";\nimport { createAgentModelRegistry, type CreateAgentModelRegistryOptions } from \"./create-agent-model-registry.js\";\n\nexport interface CreateAgentModelOptions extends CreateAgentModelRegistryOptions {}\n\n/**\n * Initialize the chat model (and embedding model) and register them into the\n * process-level singleton AgentContext.\n *\n * Sets:\n * - AgentContextTokens.ChatModel → BaseChatModel\n * - AgentContextTokens.EmbedModel → Embeddings\n *\n * @example\n * ```ts\n * await createAgentModel({ configPath: \"config/model.yaml\" });\n * ```\n */\nexport async function createAgentModel(options?: CreateAgentModelOptions): Promise<void> {\n const registry = await createAgentModelRegistry(options);\n const llm = await registry.getChatModel();\n const ctx = getDefaultAgentContext();\n ctx.set(AgentContextTokens.ChatModel, llm);\n try {\n const embed = registry.getEmbeddingModel();\n ctx.set(AgentContextTokens.EmbedModel, embed);\n } catch {\n // No embed section configured — embedding model is optional\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { Embeddings } from \"@langchain/core/embeddings\";\nimport { OpenAIEmbeddings } from \"@langchain/openai\";\nimport { deepMerge } from \"@easynet/agent-common\";\nimport { loadModelConfig, type ModelConfigResult } from \"../config/loader.js\";\nimport { createChatModelFromLlmConfig } from \"../langchain/index.js\";\nimport { resolveLlmSectionWithNpm } from \"../extensions/npm-protocol.js\";\nimport {\n checkEndpointConnectivity,\n buildUnreachableError,\n type EndpointConnectivityOptions,\n type ConnectionStatus,\n} from \"../connectivity/index.js\";\nimport { parseLlmSection } from \"../model/llm-parser.js\";\nimport { parseEmbedSection } from \"../model/embed-parser.js\";\nimport type { LLMConfig } from \"../model/types.js\";\n\nexport interface CreateAgentModelRegistryOptions {\n configPath?: string;\n}\n\nexport interface CreateAgentModelChatOptions {\n installNpmIfMissing?: boolean;\n checkConnectivity?: boolean;\n onConnectionStatus?: (status: ConnectionStatus) => void;\n connectivityTimeoutMs?: number;\n}\n\nexport interface AgentModel {\n getChatModel(idOrOptions?: string | CreateAgentModelChatOptions, maybeOptions?: CreateAgentModelChatOptions): Promise<BaseChatModel>;\n getEmbeddingModel(id?: string): Embeddings;\n getVlmChatModel(idOrOptions?: string | CreateAgentModelChatOptions, maybeOptions?: CreateAgentModelChatOptions): Promise<BaseChatModel>;\n}\n\nfunction resolveEmbeddedConfigPath(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(moduleDir, \"../config/model.yaml\"),\n resolve(moduleDir, \"../model.yaml\"),\n resolve(moduleDir, \"../../config/model.yaml\"),\n resolve(moduleDir, \"../../model.yaml\"),\n ];\n const found = candidates.find((candidate) => existsSync(candidate));\n if (found) return found;\n throw new Error(`createAgentModelRegistry failed: embedded model.yaml not found. Tried: ${candidates.join(\", \")}`);\n}\n\nfunction normalizeOptions(configPathOrOptions?: string | CreateAgentModelRegistryOptions): CreateAgentModelRegistryOptions {\n if (configPathOrOptions == null) return {};\n if (typeof configPathOrOptions === \"string\") return { configPath: configPathOrOptions };\n return configPathOrOptions;\n}\n\nfunction ensureConfig(path: string): ModelConfigResult {\n const loaded = loadModelConfig(path);\n if (!loaded) {\n throw new Error(`createAgentModelRegistry failed: config file not found: ${path}`);\n }\n return loaded;\n}\n\nfunction applyDefaultToolChoice(model: BaseChatModel): void {\n const m = model as {\n bindTools?: (tools: unknown, opts?: Record<string, unknown>) => unknown;\n };\n const orig = m.bindTools?.bind(model);\n if (!orig) return;\n m.bindTools = function (tools: unknown, opts?: Record<string, unknown>) {\n return orig(tools, { ...opts, tool_choice: \"auto\" });\n };\n}\n\nconst CIS_DEFAULT_RESOLVE_HOST = \"s0010-ml-https.s0010.us-west-2.awswd\";\nconst CIS_DEFAULT_RESOLVE_IP = \"10.210.98.124\";\n\nfunction buildEndpointConnectivityOptions(\n config: LLMConfig & { baseURL: string }\n): EndpointConnectivityOptions | undefined {\n const opts = (config.options as Record<string, unknown> | undefined) ?? config;\n const provider = typeof config.provider === \"string\" ? config.provider : \"\";\n const baseURL = config.baseURL;\n const isCis = provider === \"cis\" || provider.includes(\"cis\");\n const useCisDefault =\n isCis &&\n baseURL.includes(CIS_DEFAULT_RESOLVE_HOST) &&\n opts?.resolveHost == null;\n\n const resolveHost =\n opts?.resolveHost != null && typeof (opts.resolveHost as { from?: string; to?: string }).from === \"string\"\n ? (opts.resolveHost as { from: string; to: string })\n : useCisDefault\n ? { from: CIS_DEFAULT_RESOLVE_HOST, to: CIS_DEFAULT_RESOLVE_IP }\n : undefined;\n const host = typeof opts?.host === \"string\" ? opts.host : (resolveHost ? resolveHost.from : undefined);\n if (resolveHost == null && host == null) return undefined;\n\n const verifySSL = opts?.verifySSL === true;\n const bypassAuth = opts?.bypassAuth !== false;\n\n return {\n resolveHost,\n host,\n verifySSL: resolveHost != null ? false : (verifySSL ? true : undefined),\n bypassAuth: bypassAuth ? true : undefined,\n featureKey: typeof opts?.featureKey === \"string\" ? opts.featureKey : undefined,\n };\n}\n\nasync function ensureConnectivity(\n resolvedLlmSection: unknown,\n options: CreateAgentModelChatOptions\n): Promise<void> {\n let configs: Array<LLMConfig & { baseURL: string }>;\n try {\n const parsed = parseLlmSection(resolvedLlmSection ?? null);\n configs = parsed.configs.filter(\n (c: LLMConfig): c is LLMConfig & { baseURL: string } =>\n typeof c.baseURL === \"string\" &&\n c.baseURL.length > 0 &&\n (c.baseURL.startsWith(\"http://\") || c.baseURL.startsWith(\"https://\")) &&\n !c.baseURL.includes(\"${\")\n );\n } catch {\n return;\n }\n if (options.checkConnectivity === false || configs.length === 0) return;\n\n const report = (status: ConnectionStatus) => options.onConnectionStatus?.(status);\n const timeoutMs = options.connectivityTimeoutMs ?? 8000;\n\n for (const config of configs) {\n const { id, baseURL } = config;\n report({\n phase: \"checking\",\n endpointId: id,\n baseURL,\n message: \"Checking connection...\",\n });\n\n const endpointOpts = buildEndpointConnectivityOptions(config);\n const result = await checkEndpointConnectivity(baseURL, {\n timeoutMs,\n ...endpointOpts,\n });\n\n if (result.reachable) {\n report({\n phase: \"reachable\",\n endpointId: id,\n baseURL,\n message: result.message ?? \"Connected\",\n });\n } else {\n report({\n phase: \"unreachable\",\n endpointId: id,\n baseURL,\n message: result.message ?? \"Unreachable\",\n });\n throw new Error(buildUnreachableError(id, baseURL, result.message));\n }\n }\n}\n\nasync function resolveDefaultVlmConfig(\n merged: ModelConfigResult,\n options: { installNpmIfMissing?: boolean; modelId?: string } = {},\n): Promise<LLMConfig | null> {\n const sourceSection = merged.vlm ?? merged.llm;\n if (sourceSection == null) return null;\n\n const resolved = await resolveLlmSectionWithNpm(sourceSection, {\n installNpmIfMissing: options.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n const { defaultId, configs } = parseLlmSection(resolved);\n const imageConfigs = configs.filter((c: LLMConfig) => c.type === \"image\");\n if (imageConfigs.length === 0) return null;\n const targetId = options.modelId ?? defaultId;\n return imageConfigs.find((c: LLMConfig) => c.id === targetId) ?? imageConfigs[0] ?? null;\n}\n\nfunction resolveEmbedConfig(merged: ModelConfigResult, embedId?: string): LLMConfig | null {\n if (!merged.embed) return null;\n const parsed = parseEmbedSection(merged.embed);\n if (parsed.configs.length === 0) return null;\n const id = embedId ?? parsed.defaultId;\n return parsed.configs.find((c) => c.id === id) ?? parsed.configs[0] ?? null;\n}\n\nfunction createLangChainEmbeddingModelFromConfig(config: LLMConfig): Embeddings {\n const opts = (config.options as Record<string, unknown> | undefined) ?? {};\n const baseURLRaw = typeof config.baseURL === \"string\" ? config.baseURL : undefined;\n const baseURL =\n typeof baseURLRaw === \"string\" && baseURLRaw.length > 0\n ? (baseURLRaw.replace(/\\/$/, \"\").endsWith(\"/v1\") ? baseURLRaw : `${baseURLRaw.replace(/\\/$/, \"\")}/v1`)\n : undefined;\n const apiKey = typeof config.apiKey === \"string\" && config.apiKey.length > 0 ? config.apiKey : \"not-needed\";\n const timeout = typeof opts.timeoutMs === \"number\" ? opts.timeoutMs : undefined;\n const dimensions = typeof opts.dimensions === \"number\" ? opts.dimensions : undefined;\n\n return new OpenAIEmbeddings({\n model: typeof config.model === \"string\" && config.model.length > 0 ? config.model : \"text-embedding-3-small\",\n ...(dimensions != null ? { dimensions } : {}),\n ...(timeout != null ? { timeout } : {}),\n apiKey,\n ...(baseURL ? { configuration: { baseURL } } : {}),\n });\n}\n\nexport async function createAgentModelRegistry(configPathOrOptions?: string | CreateAgentModelRegistryOptions): Promise<AgentModel> {\n const options = normalizeOptions(configPathOrOptions);\n const embeddedConfigPath = resolveEmbeddedConfigPath();\n const base = ensureConfig(embeddedConfigPath);\n const override = options.configPath\n ? ensureConfig(resolve(process.cwd(), options.configPath))\n : undefined;\n const merged = override\n ? deepMerge({} as ModelConfigResult, base, override)\n : base;\n\n const resolveChatArgs = (\n idOrOptions?: string | CreateAgentModelChatOptions,\n maybeOptions?: CreateAgentModelChatOptions,\n ): { id?: string; options: CreateAgentModelChatOptions } => {\n if (typeof idOrOptions === \"string\") return { id: idOrOptions, options: maybeOptions ?? {} };\n return { id: undefined, options: idOrOptions ?? {} };\n };\n\n return {\n async getChatModel(\n idOrOptions?: string | CreateAgentModelChatOptions,\n maybeOptions?: CreateAgentModelChatOptions\n ): Promise<BaseChatModel> {\n const { id, options: chatOptions } = resolveChatArgs(idOrOptions, maybeOptions);\n if (merged.llm == null) {\n throw new Error(\"createAgentModelRegistry failed: no llm section configured\");\n }\n const resolvedSection = await resolveLlmSectionWithNpm(merged.llm, {\n installNpmIfMissing: chatOptions.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n const parsed = parseLlmSection(resolvedSection);\n const chosenId = id ?? parsed.defaultId;\n const config = parsed.configs.find((c) => c.id === chosenId) ?? parsed.configs[0];\n if (!config) throw new Error(\"createAgentModelRegistry failed: no chat model configured\");\n const llmSection = { default: config.id, [config.id]: config };\n const checkConnectivity = chatOptions.checkConnectivity ?? merged.runtime.check_connectivity;\n await ensureConnectivity(llmSection, { ...chatOptions, checkConnectivity });\n const model = createChatModelFromLlmConfig({ llmSection });\n applyDefaultToolChoice(model);\n return model;\n },\n getEmbeddingModel(embedId?: string): Embeddings {\n const embedConfig = resolveEmbedConfig(merged, embedId);\n if (!embedConfig) {\n throw new Error(\"createAgentModelRegistry failed: no embed model configured\");\n }\n return createLangChainEmbeddingModelFromConfig(embedConfig);\n },\n async getVlmChatModel(\n idOrOptions?: string | CreateAgentModelChatOptions,\n maybeOptions?: CreateAgentModelChatOptions\n ): Promise<BaseChatModel> {\n const { id, options: chatOptions } = resolveChatArgs(idOrOptions, maybeOptions);\n const vlmConfig = await resolveDefaultVlmConfig(merged, {\n installNpmIfMissing: chatOptions.installNpmIfMissing,\n modelId: id,\n });\n if (!vlmConfig) {\n throw new Error(\"createAgentModelRegistry failed: no vlm/image model configured\");\n }\n const section = {\n default: vlmConfig.id,\n [vlmConfig.id]: vlmConfig,\n };\n const checkConnectivity = chatOptions.checkConnectivity ?? merged.runtime.check_connectivity;\n await ensureConnectivity(section, { ...chatOptions, checkConnectivity });\n const model = createChatModelFromLlmConfig({ llmSection: section });\n applyDefaultToolChoice(model);\n return model;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,oBAAoB,8BAA8B;;;ACA3D,SAAS,kBAAkB;AAC3B,SAAS,SAAS,eAAe;AACjC,SAAS,qBAAqB;AAG9B,SAAS,wBAAwB;AACjC,SAAS,iBAAiB;AA+B1B,SAAS,4BAAoC;AAC3C,QAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,QAAM,aAAa;AAAA,IACjB,QAAQ,WAAW,sBAAsB;AAAA,IACzC,QAAQ,WAAW,eAAe;AAAA,IAClC,QAAQ,WAAW,yBAAyB;AAAA,IAC5C,QAAQ,WAAW,kBAAkB;AAAA,EACvC;AACA,QAAM,QAAQ,WAAW,KAAK,CAAC,cAAc,WAAW,SAAS,CAAC;AAClE,MAAI,MAAO,QAAO;AAClB,QAAM,IAAI,MAAM,0EAA0E,WAAW,KAAK,IAAI,CAAC,EAAE;AACnH;AAEA,SAAS,iBAAiB,qBAAiG;AACzH,MAAI,uBAAuB,KAAM,QAAO,CAAC;AACzC,MAAI,OAAO,wBAAwB,SAAU,QAAO,EAAE,YAAY,oBAAoB;AACtF,SAAO;AACT;AAEA,SAAS,aAAa,MAAiC;AACrD,QAAM,SAAS,gBAAgB,IAAI;AACnC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,2DAA2D,IAAI,EAAE;AAAA,EACnF;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAA4B;AAC1D,QAAM,IAAI;AAGV,QAAM,OAAO,EAAE,WAAW,KAAK,KAAK;AACpC,MAAI,CAAC,KAAM;AACX,IAAE,YAAY,SAAU,OAAgB,MAAgC;AACtE,WAAO,KAAK,OAAO,EAAE,GAAG,MAAM,aAAa,OAAO,CAAC;AAAA,EACrD;AACF;AAEA,IAAM,2BAA2B;AACjC,IAAM,yBAAyB;AAE/B,SAAS,iCACP,QACyC;AACzC,QAAM,OAAQ,OAAO,WAAmD;AACxE,QAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AACzE,QAAM,UAAU,OAAO;AACvB,QAAM,QAAQ,aAAa,SAAS,SAAS,SAAS,KAAK;AAC3D,QAAM,gBACJ,SACA,QAAQ,SAAS,wBAAwB,KACzC,MAAM,eAAe;AAEvB,QAAM,cACJ,MAAM,eAAe,QAAQ,OAAQ,KAAK,YAA+C,SAAS,WAC7F,KAAK,cACN,gBACE,EAAE,MAAM,0BAA0B,IAAI,uBAAuB,IAC7D;AACR,QAAM,OAAO,OAAO,MAAM,SAAS,WAAW,KAAK,OAAQ,cAAc,YAAY,OAAO;AAC5F,MAAI,eAAe,QAAQ,QAAQ,KAAM,QAAO;AAEhD,QAAM,YAAY,MAAM,cAAc;AACtC,QAAM,aAAa,MAAM,eAAe;AAExC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,eAAe,OAAO,QAAS,YAAY,OAAO;AAAA,IAC7D,YAAY,aAAa,OAAO;AAAA,IAChC,YAAY,OAAO,MAAM,eAAe,WAAW,KAAK,aAAa;AAAA,EACvE;AACF;AAEA,eAAe,mBACb,oBACA,SACe;AACf,MAAI;AACJ,MAAI;AACF,UAAM,SAAS,gBAAgB,sBAAsB,IAAI;AACzD,cAAU,OAAO,QAAQ;AAAA,MACvB,CAAC,MACC,OAAO,EAAE,YAAY,YACrB,EAAE,QAAQ,SAAS,MAClB,EAAE,QAAQ,WAAW,SAAS,KAAK,EAAE,QAAQ,WAAW,UAAU,MACnE,CAAC,EAAE,QAAQ,SAAS,IAAI;AAAA,IAC5B;AAAA,EACF,QAAQ;AACN;AAAA,EACF;AACA,MAAI,QAAQ,sBAAsB,SAAS,QAAQ,WAAW,EAAG;AAEjE,QAAM,SAAS,CAAC,WAA6B,QAAQ,qBAAqB,MAAM;AAChF,QAAM,YAAY,QAAQ,yBAAyB;AAEnD,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,IAAI,QAAQ,IAAI;AACxB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAED,UAAM,eAAe,iCAAiC,MAAM;AAC5D,UAAM,SAAS,MAAM,0BAA0B,SAAS;AAAA,MACtD;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAED,QAAI,OAAO,WAAW;AACpB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ;AAAA,QACA,SAAS,OAAO,WAAW;AAAA,MAC7B,CAAC;AAAA,IACH,OAAO;AACL,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ;AAAA,QACA,SAAS,OAAO,WAAW;AAAA,MAC7B,CAAC;AACD,YAAM,IAAI,MAAM,sBAAsB,IAAI,SAAS,OAAO,OAAO,CAAC;AAAA,IACpE;AAAA,EACF;AACF;AAEA,eAAe,wBACb,QACA,UAA+D,CAAC,GACrC;AAC3B,QAAM,gBAAgB,OAAO,OAAO,OAAO;AAC3C,MAAI,iBAAiB,KAAM,QAAO;AAElC,QAAM,WAAW,MAAM,yBAAyB,eAAe;AAAA,IAC7D,qBAAqB,QAAQ,wBAAwB;AAAA,IACrD,KAAK,QAAQ,IAAI;AAAA,EACnB,CAAC;AACD,QAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB,QAAQ;AACvD,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAiB,EAAE,SAAS,OAAO;AACxE,MAAI,aAAa,WAAW,EAAG,QAAO;AACtC,QAAM,WAAW,QAAQ,WAAW;AACpC,SAAO,aAAa,KAAK,CAAC,MAAiB,EAAE,OAAO,QAAQ,KAAK,aAAa,CAAC,KAAK;AACtF;AAEA,SAAS,mBAAmB,QAA2B,SAAoC;AACzF,MAAI,CAAC,OAAO,MAAO,QAAO;AAC1B,QAAM,SAAS,kBAAkB,OAAO,KAAK;AAC7C,MAAI,OAAO,QAAQ,WAAW,EAAG,QAAO;AACxC,QAAM,KAAK,WAAW,OAAO;AAC7B,SAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,QAAQ,CAAC,KAAK;AACzE;AAEA,SAAS,wCAAwC,QAA+B;AAC9E,QAAM,OAAQ,OAAO,WAAmD,CAAC;AACzE,QAAM,aAAa,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACzE,QAAM,UACJ,OAAO,eAAe,YAAY,WAAW,SAAS,IACjD,WAAW,QAAQ,OAAO,EAAE,EAAE,SAAS,KAAK,IAAI,aAAa,GAAG,WAAW,QAAQ,OAAO,EAAE,CAAC,QAC9F;AACN,QAAM,SAAS,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,SAAS,IAAI,OAAO,SAAS;AAC/F,QAAM,UAAU,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AACtE,QAAM,aAAa,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAE3E,SAAO,IAAI,iBAAiB;AAAA,IAC1B,OAAO,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,SAAS,IAAI,OAAO,QAAQ;AAAA,IACpF,GAAI,cAAc,OAAO,EAAE,WAAW,IAAI,CAAC;AAAA,IAC3C,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrC;AAAA,IACA,GAAI,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,EAClD,CAAC;AACH;AAEA,eAAsB,yBAAyB,qBAAqF;AAClI,QAAM,UAAU,iBAAiB,mBAAmB;AACpD,QAAM,qBAAqB,0BAA0B;AACrD,QAAM,OAAO,aAAa,kBAAkB;AAC5C,QAAM,WAAW,QAAQ,aACrB,aAAa,QAAQ,QAAQ,IAAI,GAAG,QAAQ,UAAU,CAAC,IACvD;AACJ,QAAM,SAAS,WACX,UAAU,CAAC,GAAwB,MAAM,QAAQ,IACjD;AAEJ,QAAM,kBAAkB,CACtB,aACA,iBAC0D;AAC1D,QAAI,OAAO,gBAAgB,SAAU,QAAO,EAAE,IAAI,aAAa,SAAS,gBAAgB,CAAC,EAAE;AAC3F,WAAO,EAAE,IAAI,QAAW,SAAS,eAAe,CAAC,EAAE;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,MAAM,aACJ,aACA,cACwB;AACxB,YAAM,EAAE,IAAI,SAAS,YAAY,IAAI,gBAAgB,aAAa,YAAY;AAC9E,UAAI,OAAO,OAAO,MAAM;AACtB,cAAM,IAAI,MAAM,4DAA4D;AAAA,MAC9E;AACA,YAAM,kBAAkB,MAAM,yBAAyB,OAAO,KAAK;AAAA,QACjE,qBAAqB,YAAY,wBAAwB;AAAA,QACzD,KAAK,QAAQ,IAAI;AAAA,MACnB,CAAC;AACD,YAAM,SAAS,gBAAgB,eAAe;AAC9C,YAAM,WAAW,MAAM,OAAO;AAC9B,YAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,KAAK,OAAO,QAAQ,CAAC;AAChF,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,2DAA2D;AACxF,YAAM,aAAa,EAAE,SAAS,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO;AAC7D,YAAM,oBAAoB,YAAY,qBAAqB,OAAO,QAAQ;AAC1E,YAAM,mBAAmB,YAAY,EAAE,GAAG,aAAa,kBAAkB,CAAC;AAC1E,YAAM,QAAQ,6BAA6B,EAAE,WAAW,CAAC;AACzD,6BAAuB,KAAK;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,kBAAkB,SAA8B;AAC9C,YAAM,cAAc,mBAAmB,QAAQ,OAAO;AACtD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,4DAA4D;AAAA,MAC9E;AACA,aAAO,wCAAwC,WAAW;AAAA,IAC5D;AAAA,IACA,MAAM,gBACJ,aACA,cACwB;AACxB,YAAM,EAAE,IAAI,SAAS,YAAY,IAAI,gBAAgB,aAAa,YAAY;AAC9E,YAAM,YAAY,MAAM,wBAAwB,QAAQ;AAAA,QACtD,qBAAqB,YAAY;AAAA,QACjC,SAAS;AAAA,MACX,CAAC;AACD,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,gEAAgE;AAAA,MAClF;AACA,YAAM,UAAU;AAAA,QACd,SAAS,UAAU;AAAA,QACnB,CAAC,UAAU,EAAE,GAAG;AAAA,MAClB;AACA,YAAM,oBAAoB,YAAY,qBAAqB,OAAO,QAAQ;AAC1E,YAAM,mBAAmB,SAAS,EAAE,GAAG,aAAa,kBAAkB,CAAC;AACvE,YAAM,QAAQ,6BAA6B,EAAE,YAAY,QAAQ,CAAC;AAClE,6BAAuB,KAAK;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AD5QA,eAAsB,iBAAiB,SAAkD;AACvF,QAAM,WAAW,MAAM,yBAAyB,OAAO;AACvD,QAAM,MAAM,MAAM,SAAS,aAAa;AACxC,QAAM,MAAM,uBAAuB;AACnC,MAAI,IAAI,mBAAmB,WAAW,GAAG;AACzC,MAAI;AACF,UAAM,QAAQ,SAAS,kBAAkB;AACzC,QAAI,IAAI,mBAAmB,YAAY,KAAK;AAAA,EAC9C,QAAQ;AAAA,EAER;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/api/register-model.ts","../src/api/create-agent-model-registry.ts"],"sourcesContent":["import { AgentContextTokens, getDefaultAgentContext } from \"@easynet/agent-common\";\nimport { createAgentModelRegistry, type CreateAgentModelRegistryOptions } from \"./create-agent-model-registry.js\";\n\nexport interface CreateAgentModelOptions extends CreateAgentModelRegistryOptions {}\n\n/**\n * Initialize the chat model (and embedding model) and register them into the\n * process-level singleton AgentContext.\n *\n * Sets:\n * - AgentContextTokens.ChatModel → BaseChatModel\n * - AgentContextTokens.EmbedModel → Embeddings\n * - AgentContextTokens.VlmModel → BaseChatModel (image-capable, optional)\n *\n * @example\n * ```ts\n * await createAgentModel({ configPath: \"config/model.yaml\" });\n * ```\n */\nexport async function createAgentModel(options?: CreateAgentModelOptions): Promise<void> {\n const registry = await createAgentModelRegistry(options);\n const llm = await registry.getChatModel();\n const ctx = getDefaultAgentContext();\n ctx.set(AgentContextTokens.ChatModel, llm);\n try {\n const embed = registry.getEmbeddingModel();\n ctx.set(AgentContextTokens.EmbedModel, embed);\n } catch {\n // No embed section configured — embedding model is optional\n }\n try {\n const vlm = await registry.getVlmChatModel();\n ctx.set(AgentContextTokens.VlmModel, vlm);\n } catch {\n // No vlm/image model configured — VLM is optional\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { Embeddings } from \"@langchain/core/embeddings\";\nimport { OpenAIEmbeddings } from \"@langchain/openai\";\nimport { deepMerge, type ConnectionStatus } from \"@easynet/agent-common\";\nimport { loadModelConfig, type ModelConfigResult } from \"../config/loader.js\";\nimport { createChatModelFromLlmConfig } from \"../langchain/index.js\";\nimport { resolveLlmSectionWithNpm } from \"../extensions/npm-protocol.js\";\nimport { parseLlmSection } from \"../model/llm-parser.js\";\nimport { parseEmbedSection } from \"../model/embed-parser.js\";\nimport type { LLMConfig } from \"../model/types.js\";\nimport { applyDefaultToolChoice } from \"./chat-model.js\";\nimport { ensureConnectivity } from \"./connectivity.js\";\n\nexport interface CreateAgentModelRegistryOptions {\n configPath?: string;\n}\n\nexport interface CreateAgentModelChatOptions {\n installNpmIfMissing?: boolean;\n checkConnectivity?: boolean;\n onConnectionStatus?: (status: ConnectionStatus) => void;\n connectivityTimeoutMs?: number;\n}\n\nexport interface AgentModel {\n getChatModel(idOrOptions?: string | CreateAgentModelChatOptions, maybeOptions?: CreateAgentModelChatOptions): Promise<BaseChatModel>;\n getEmbeddingModel(id?: string): Embeddings;\n getVlmChatModel(idOrOptions?: string | CreateAgentModelChatOptions, maybeOptions?: CreateAgentModelChatOptions): Promise<BaseChatModel>;\n}\n\nfunction resolveEmbeddedConfigPath(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(moduleDir, \"../config/model.yaml\"),\n resolve(moduleDir, \"../model.yaml\"),\n resolve(moduleDir, \"../../config/model.yaml\"),\n resolve(moduleDir, \"../../model.yaml\"),\n ];\n const found = candidates.find((candidate) => existsSync(candidate));\n if (found) return found;\n throw new Error(`createAgentModelRegistry failed: embedded model.yaml not found. Tried: ${candidates.join(\", \")}`);\n}\n\nfunction normalizeOptions(configPathOrOptions?: string | CreateAgentModelRegistryOptions): CreateAgentModelRegistryOptions {\n if (configPathOrOptions == null) return {};\n if (typeof configPathOrOptions === \"string\") return { configPath: configPathOrOptions };\n return configPathOrOptions;\n}\n\nfunction ensureConfig(path: string): ModelConfigResult {\n const loaded = loadModelConfig(path);\n if (!loaded) {\n throw new Error(`createAgentModelRegistry failed: config file not found: ${path}`);\n }\n return loaded;\n}\n\nasync function resolveDefaultVlmConfig(\n merged: ModelConfigResult,\n options: { installNpmIfMissing?: boolean; modelId?: string } = {},\n): Promise<LLMConfig | null> {\n const sourceSection = merged.vlm ?? merged.llm;\n if (sourceSection == null) return null;\n\n const resolved = await resolveLlmSectionWithNpm(sourceSection, {\n installNpmIfMissing: options.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n const { defaultId, configs } = parseLlmSection(resolved);\n const imageConfigs = configs.filter((c: LLMConfig) => c.type === \"image\");\n if (imageConfigs.length === 0) return null;\n const targetId = options.modelId ?? defaultId;\n return imageConfigs.find((c: LLMConfig) => c.id === targetId) ?? imageConfigs[0] ?? null;\n}\n\nfunction resolveEmbedConfig(merged: ModelConfigResult, embedId?: string): LLMConfig | null {\n if (!merged.embed) return null;\n const parsed = parseEmbedSection(merged.embed);\n if (parsed.configs.length === 0) return null;\n const id = embedId ?? parsed.defaultId;\n return parsed.configs.find((c) => c.id === id) ?? parsed.configs[0] ?? null;\n}\n\nfunction createLangChainEmbeddingModelFromConfig(config: LLMConfig): Embeddings {\n const opts = (config.options as Record<string, unknown> | undefined) ?? {};\n const baseURLRaw = typeof config.baseURL === \"string\" ? config.baseURL : undefined;\n const baseURL =\n typeof baseURLRaw === \"string\" && baseURLRaw.length > 0\n ? (baseURLRaw.replace(/\\/$/, \"\").endsWith(\"/v1\") ? baseURLRaw : `${baseURLRaw.replace(/\\/$/, \"\")}/v1`)\n : undefined;\n const apiKey = typeof config.apiKey === \"string\" && config.apiKey.length > 0 ? config.apiKey : \"not-needed\";\n const timeout = typeof opts.timeoutMs === \"number\" ? opts.timeoutMs : undefined;\n const dimensions = typeof opts.dimensions === \"number\" ? opts.dimensions : undefined;\n\n return new OpenAIEmbeddings({\n model: typeof config.model === \"string\" && config.model.length > 0 ? config.model : \"text-embedding-3-small\",\n ...(dimensions != null ? { dimensions } : {}),\n ...(timeout != null ? { timeout } : {}),\n apiKey,\n ...(baseURL ? { configuration: { baseURL } } : {}),\n });\n}\n\nexport async function createAgentModelRegistry(configPathOrOptions?: string | CreateAgentModelRegistryOptions): Promise<AgentModel> {\n const options = normalizeOptions(configPathOrOptions);\n const embeddedConfigPath = resolveEmbeddedConfigPath();\n const base = ensureConfig(embeddedConfigPath);\n const override = options.configPath\n ? ensureConfig(resolve(process.cwd(), options.configPath))\n : undefined;\n const merged = override\n ? deepMerge({} as ModelConfigResult, base, override)\n : base;\n\n const resolveChatArgs = (\n idOrOptions?: string | CreateAgentModelChatOptions,\n maybeOptions?: CreateAgentModelChatOptions,\n ): { id?: string; options: CreateAgentModelChatOptions } => {\n if (typeof idOrOptions === \"string\") return { id: idOrOptions, options: maybeOptions ?? {} };\n return { id: undefined, options: idOrOptions ?? {} };\n };\n\n return {\n async getChatModel(\n idOrOptions?: string | CreateAgentModelChatOptions,\n maybeOptions?: CreateAgentModelChatOptions\n ): Promise<BaseChatModel> {\n const { id, options: chatOptions } = resolveChatArgs(idOrOptions, maybeOptions);\n if (merged.llm == null) {\n throw new Error(\"createAgentModelRegistry failed: no llm section configured\");\n }\n const resolvedSection = await resolveLlmSectionWithNpm(merged.llm, {\n installNpmIfMissing: chatOptions.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n const parsed = parseLlmSection(resolvedSection);\n const chosenId = id ?? parsed.defaultId;\n const config = parsed.configs.find((c) => c.id === chosenId) ?? parsed.configs[0];\n if (!config) throw new Error(\"createAgentModelRegistry failed: no chat model configured\");\n const llmSection = { default: config.id, [config.id]: config };\n const checkConnectivity = chatOptions.checkConnectivity ?? merged.runtime.check_connectivity;\n await ensureConnectivity(llmSection, { ...chatOptions, checkConnectivity });\n const model = createChatModelFromLlmConfig({ llmSection });\n applyDefaultToolChoice(model);\n return model;\n },\n getEmbeddingModel(embedId?: string): Embeddings {\n const embedConfig = resolveEmbedConfig(merged, embedId);\n if (!embedConfig) {\n throw new Error(\"createAgentModelRegistry failed: no embed model configured\");\n }\n return createLangChainEmbeddingModelFromConfig(embedConfig);\n },\n async getVlmChatModel(\n idOrOptions?: string | CreateAgentModelChatOptions,\n maybeOptions?: CreateAgentModelChatOptions\n ): Promise<BaseChatModel> {\n const { id, options: chatOptions } = resolveChatArgs(idOrOptions, maybeOptions);\n const vlmConfig = await resolveDefaultVlmConfig(merged, {\n installNpmIfMissing: chatOptions.installNpmIfMissing,\n modelId: id,\n });\n if (!vlmConfig) {\n throw new Error(\"createAgentModelRegistry failed: no vlm/image model configured\");\n }\n const section = {\n default: vlmConfig.id,\n [vlmConfig.id]: vlmConfig,\n };\n const checkConnectivity = chatOptions.checkConnectivity ?? merged.runtime.check_connectivity;\n await ensureConnectivity(section, { ...chatOptions, checkConnectivity });\n const model = createChatModelFromLlmConfig({ llmSection: section });\n applyDefaultToolChoice(model);\n return model;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,oBAAoB,8BAA8B;;;ACA3D,SAAS,kBAAkB;AAC3B,SAAS,SAAS,eAAe;AACjC,SAAS,qBAAqB;AAG9B,SAAS,wBAAwB;AACjC,SAAS,iBAAwC;AA2BjD,SAAS,4BAAoC;AAC3C,QAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,QAAM,aAAa;AAAA,IACjB,QAAQ,WAAW,sBAAsB;AAAA,IACzC,QAAQ,WAAW,eAAe;AAAA,IAClC,QAAQ,WAAW,yBAAyB;AAAA,IAC5C,QAAQ,WAAW,kBAAkB;AAAA,EACvC;AACA,QAAM,QAAQ,WAAW,KAAK,CAAC,cAAc,WAAW,SAAS,CAAC;AAClE,MAAI,MAAO,QAAO;AAClB,QAAM,IAAI,MAAM,0EAA0E,WAAW,KAAK,IAAI,CAAC,EAAE;AACnH;AAEA,SAAS,iBAAiB,qBAAiG;AACzH,MAAI,uBAAuB,KAAM,QAAO,CAAC;AACzC,MAAI,OAAO,wBAAwB,SAAU,QAAO,EAAE,YAAY,oBAAoB;AACtF,SAAO;AACT;AAEA,SAAS,aAAa,MAAiC;AACrD,QAAM,SAAS,gBAAgB,IAAI;AACnC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,2DAA2D,IAAI,EAAE;AAAA,EACnF;AACA,SAAO;AACT;AAEA,eAAe,wBACb,QACA,UAA+D,CAAC,GACrC;AAC3B,QAAM,gBAAgB,OAAO,OAAO,OAAO;AAC3C,MAAI,iBAAiB,KAAM,QAAO;AAElC,QAAM,WAAW,MAAM,yBAAyB,eAAe;AAAA,IAC7D,qBAAqB,QAAQ,wBAAwB;AAAA,IACrD,KAAK,QAAQ,IAAI;AAAA,EACnB,CAAC;AACD,QAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB,QAAQ;AACvD,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAiB,EAAE,SAAS,OAAO;AACxE,MAAI,aAAa,WAAW,EAAG,QAAO;AACtC,QAAM,WAAW,QAAQ,WAAW;AACpC,SAAO,aAAa,KAAK,CAAC,MAAiB,EAAE,OAAO,QAAQ,KAAK,aAAa,CAAC,KAAK;AACtF;AAEA,SAAS,mBAAmB,QAA2B,SAAoC;AACzF,MAAI,CAAC,OAAO,MAAO,QAAO;AAC1B,QAAM,SAAS,kBAAkB,OAAO,KAAK;AAC7C,MAAI,OAAO,QAAQ,WAAW,EAAG,QAAO;AACxC,QAAM,KAAK,WAAW,OAAO;AAC7B,SAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,QAAQ,CAAC,KAAK;AACzE;AAEA,SAAS,wCAAwC,QAA+B;AAC9E,QAAM,OAAQ,OAAO,WAAmD,CAAC;AACzE,QAAM,aAAa,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACzE,QAAM,UACJ,OAAO,eAAe,YAAY,WAAW,SAAS,IACjD,WAAW,QAAQ,OAAO,EAAE,EAAE,SAAS,KAAK,IAAI,aAAa,GAAG,WAAW,QAAQ,OAAO,EAAE,CAAC,QAC9F;AACN,QAAM,SAAS,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,SAAS,IAAI,OAAO,SAAS;AAC/F,QAAM,UAAU,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AACtE,QAAM,aAAa,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAE3E,SAAO,IAAI,iBAAiB;AAAA,IAC1B,OAAO,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,SAAS,IAAI,OAAO,QAAQ;AAAA,IACpF,GAAI,cAAc,OAAO,EAAE,WAAW,IAAI,CAAC;AAAA,IAC3C,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrC;AAAA,IACA,GAAI,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,EAClD,CAAC;AACH;AAEA,eAAsB,yBAAyB,qBAAqF;AAClI,QAAM,UAAU,iBAAiB,mBAAmB;AACpD,QAAM,qBAAqB,0BAA0B;AACrD,QAAM,OAAO,aAAa,kBAAkB;AAC5C,QAAM,WAAW,QAAQ,aACrB,aAAa,QAAQ,QAAQ,IAAI,GAAG,QAAQ,UAAU,CAAC,IACvD;AACJ,QAAM,SAAS,WACX,UAAU,CAAC,GAAwB,MAAM,QAAQ,IACjD;AAEJ,QAAM,kBAAkB,CACtB,aACA,iBAC0D;AAC1D,QAAI,OAAO,gBAAgB,SAAU,QAAO,EAAE,IAAI,aAAa,SAAS,gBAAgB,CAAC,EAAE;AAC3F,WAAO,EAAE,IAAI,QAAW,SAAS,eAAe,CAAC,EAAE;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,MAAM,aACJ,aACA,cACwB;AACxB,YAAM,EAAE,IAAI,SAAS,YAAY,IAAI,gBAAgB,aAAa,YAAY;AAC9E,UAAI,OAAO,OAAO,MAAM;AACtB,cAAM,IAAI,MAAM,4DAA4D;AAAA,MAC9E;AACA,YAAM,kBAAkB,MAAM,yBAAyB,OAAO,KAAK;AAAA,QACjE,qBAAqB,YAAY,wBAAwB;AAAA,QACzD,KAAK,QAAQ,IAAI;AAAA,MACnB,CAAC;AACD,YAAM,SAAS,gBAAgB,eAAe;AAC9C,YAAM,WAAW,MAAM,OAAO;AAC9B,YAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,KAAK,OAAO,QAAQ,CAAC;AAChF,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,2DAA2D;AACxF,YAAM,aAAa,EAAE,SAAS,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO;AAC7D,YAAM,oBAAoB,YAAY,qBAAqB,OAAO,QAAQ;AAC1E,YAAM,mBAAmB,YAAY,EAAE,GAAG,aAAa,kBAAkB,CAAC;AAC1E,YAAM,QAAQ,6BAA6B,EAAE,WAAW,CAAC;AACzD,6BAAuB,KAAK;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,kBAAkB,SAA8B;AAC9C,YAAM,cAAc,mBAAmB,QAAQ,OAAO;AACtD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,4DAA4D;AAAA,MAC9E;AACA,aAAO,wCAAwC,WAAW;AAAA,IAC5D;AAAA,IACA,MAAM,gBACJ,aACA,cACwB;AACxB,YAAM,EAAE,IAAI,SAAS,YAAY,IAAI,gBAAgB,aAAa,YAAY;AAC9E,YAAM,YAAY,MAAM,wBAAwB,QAAQ;AAAA,QACtD,qBAAqB,YAAY;AAAA,QACjC,SAAS;AAAA,MACX,CAAC;AACD,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,gEAAgE;AAAA,MAClF;AACA,YAAM,UAAU;AAAA,QACd,SAAS,UAAU;AAAA,QACnB,CAAC,UAAU,EAAE,GAAG;AAAA,MAClB;AACA,YAAM,oBAAoB,YAAY,qBAAqB,OAAO,QAAQ;AAC1E,YAAM,mBAAmB,SAAS,EAAE,GAAG,aAAa,kBAAkB,CAAC;AACvE,YAAM,QAAQ,6BAA6B,EAAE,YAAY,QAAQ,CAAC;AAClE,6BAAuB,KAAK;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ADhKA,eAAsB,iBAAiB,SAAkD;AACvF,QAAM,WAAW,MAAM,yBAAyB,OAAO;AACvD,QAAM,MAAM,MAAM,SAAS,aAAa;AACxC,QAAM,MAAM,uBAAuB;AACnC,MAAI,IAAI,mBAAmB,WAAW,GAAG;AACzC,MAAI;AACF,UAAM,QAAQ,SAAS,kBAAkB;AACzC,QAAI,IAAI,mBAAmB,YAAY,KAAK;AAAA,EAC9C,QAAQ;AAAA,EAER;AACA,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,gBAAgB;AAC3C,QAAI,IAAI,mBAAmB,UAAU,GAAG;AAAA,EAC1C,QAAQ;AAAA,EAER;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easynet/agent-model",
3
- "version": "1.0.72",
3
+ "version": "1.0.74",
4
4
  "description": "Agent LLM: multi-provider, multi-model, simple chat/image API. Consumes agent.yaml llm section.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,6 +15,7 @@
15
15
  }
16
16
  },
17
17
  "scripts": {
18
+ "preinstall": "node -e \"const fs=require('fs'); const {execSync}=require('child_process'); if (fs.existsSync('scripts/resolve-deps.js')) { execSync('node scripts/resolve-deps.js', { stdio: 'inherit' }); } else { console.log('Skipping resolve-deps for published package'); }\"",
18
19
  "build": "tsup && tsc -p tsconfig.dts.json",
19
20
  "dev": "tsup --watch",
20
21
  "test": "vitest run",
@@ -1,10 +0,0 @@
1
- export type EmbedFn = (input: string | string[]) => Promise<number[][]>;
2
- /**
3
- * Load model.yaml and build an EmbedFn from the `embed:` section.
4
- * Returns undefined if no embed section is configured.
5
- *
6
- * @param configPath - Path to model.yaml
7
- * @param embedId - Which embed instance to use (defaults to the `default:` key)
8
- */
9
- export declare function createEmbedFnFromModelsConfig(configPath: string, embedId?: string): EmbedFn | undefined;
10
- //# sourceMappingURL=create-embed-fn.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-embed-fn.d.ts","sourceRoot":"","sources":["../../src/api/create-embed-fn.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAExE;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,GAAG,SAAS,CAsBrB"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Load model.yaml, resolve npm providers, and return the default LLMConfig.
3
- * For use by CLIs (e.g. wallee-llm) that need config without creating a model.
4
- */
5
- import type { LLMConfig } from "../types.js";
6
- export interface GetDefaultLlmConfigOptions {
7
- /** Path to model.yaml. Default: process.cwd() + "/model.yaml" */
8
- configPath?: string;
9
- /** Install npm provider packages if missing. Default true. */
10
- installNpmIfMissing?: boolean;
11
- }
12
- /**
13
- * Returns the default LLM config from model.yaml (after resolving npm: providers), or null if no config file.
14
- */
15
- export declare function getDefaultLlmConfig(options?: GetDefaultLlmConfigOptions): Promise<LLMConfig | null>;
16
- //# sourceMappingURL=get-default-llm-config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-default-llm-config.d.ts","sourceRoot":"","sources":["../../src/api/get-default-llm-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,0BAA0B;IACzC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAa3B"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Load model.yaml, resolve npm providers, and return a default VLM (type=image) config.
3
- */
4
- import type { LLMConfig } from "../types.js";
5
- export interface GetDefaultVlmConfigOptions {
6
- /** Path to model.yaml. Default: process.cwd() + "/model.yaml" */
7
- configPath?: string;
8
- /** Install npm provider packages if missing. Default true. */
9
- installNpmIfMissing?: boolean;
10
- }
11
- /**
12
- * Returns the default VLM config (type=image) from model.yaml, or null if not configured.
13
- */
14
- export declare function getDefaultVlmConfig(options?: GetDefaultVlmConfigOptions): Promise<LLMConfig | null>;
15
- //# sourceMappingURL=get-default-vlm-config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-default-vlm-config.d.ts","sourceRoot":"","sources":["../../src/api/get-default-vlm-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,0BAA0B;IACzC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAuB3B"}
@@ -1,75 +0,0 @@
1
- // src/config/yaml-utils.ts
2
- import {
3
- loadYamlFile,
4
- loadYamlFileSync,
5
- parseYamlContent,
6
- clearYamlFileCache
7
- } from "@easynet/agent-common";
8
-
9
- // src/config/loader.ts
10
- function substituteEnvInString(input) {
11
- return input.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_, key) => {
12
- return process.env[key] ?? `\${${key}}`;
13
- });
14
- }
15
- function substituteEnv(input) {
16
- if (typeof input === "string") return substituteEnvInString(input);
17
- if (Array.isArray(input)) return input.map((item) => substituteEnv(item));
18
- if (input && typeof input === "object") {
19
- const out = {};
20
- for (const [k, v] of Object.entries(input)) out[k] = substituteEnv(v);
21
- return out;
22
- }
23
- return input;
24
- }
25
- function parseLlmYaml(content, options = {}) {
26
- const { substituteEnv: doSub = true } = options;
27
- const parsed = parseYamlContent(content, {
28
- substituteEnv: doSub,
29
- missingEnv: "keep"
30
- });
31
- const llm = parsed?.spec?.llm ?? parsed?.llm;
32
- if (llm == null) return void 0;
33
- return llm;
34
- }
35
- function loadModelConfig(filePath, options = {}) {
36
- if (typeof filePath !== "string" || filePath.trim().length === 0) {
37
- throw new Error("agent-model: loadModelConfig requires a non-empty file path");
38
- }
39
- try {
40
- const parsed = loadYamlFileSync(filePath, {
41
- substituteEnv: options.substituteEnv !== false,
42
- missingEnv: "keep",
43
- cache: true
44
- });
45
- if (parsed == null) return null;
46
- const source = parsed.spec ?? parsed;
47
- return {
48
- llm: source.llm ?? null,
49
- vlm: source.vlm ?? null,
50
- embed: source.embed ?? null,
51
- runtime: {
52
- check_connectivity: typeof source.runtime?.check_connectivity === "boolean" ? source.runtime.check_connectivity : void 0
53
- }
54
- };
55
- } catch (e) {
56
- const msg = e instanceof Error ? e.message : String(e);
57
- throw new Error(`agent-model: failed to parse config file ${filePath}: ${msg}`, { cause: e });
58
- }
59
- }
60
- function loadLlmConfig(filePath, options = {}) {
61
- const result = loadModelConfig(filePath, options);
62
- return result?.llm ?? null;
63
- }
64
-
65
- export {
66
- loadYamlFile,
67
- loadYamlFileSync,
68
- parseYamlContent,
69
- clearYamlFileCache,
70
- substituteEnv,
71
- parseLlmYaml,
72
- loadModelConfig,
73
- loadLlmConfig
74
- };
75
- //# sourceMappingURL=chunk-4V7M3TFR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/yaml-utils.ts","../src/config/loader.ts"],"sourcesContent":["export {\n loadYamlFile,\n loadYamlFileSync,\n parseYamlContent,\n clearYamlFileCache,\n type LoadYamlOptions,\n type YamlEnvOptions,\n} from \"@easynet/agent-common\";\n","/**\n * Load and parse LLM config from YAML (e.g. model.yaml).\n * Supports ${VAR} substitution from process.env.\n */\nimport { loadYamlFileSync, parseYamlContent } from \"./yaml-utils.js\";\n\nexport interface LoadLlmConfigOptions {\n substituteEnv?: boolean;\n}\n\nfunction substituteEnvInString(input: string): string {\n return input.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g, (_, key: string) => {\n return process.env[key] ?? `\\${${key}}`;\n });\n}\n\nexport function substituteEnv(input: unknown): unknown {\n if (typeof input === \"string\") return substituteEnvInString(input);\n if (Array.isArray(input)) return input.map((item) => substituteEnv(item));\n if (input && typeof input === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) out[k] = substituteEnv(v);\n return out;\n }\n return input;\n}\n\nexport function parseLlmYaml(\n content: string,\n options: LoadLlmConfigOptions = {}\n): unknown {\n const { substituteEnv: doSub = true } = options;\n const parsed = parseYamlContent<{ llm?: unknown; spec?: { llm?: unknown } }>(content, {\n substituteEnv: doSub,\n missingEnv: \"keep\",\n });\n const llm = parsed?.spec?.llm ?? parsed?.llm;\n if (llm == null) return undefined;\n return llm;\n}\n\nexport interface ModelConfigResult {\n llm: unknown;\n vlm: unknown;\n embed: unknown;\n runtime: { check_connectivity?: boolean };\n}\n\n/**\n * Load the full model.yaml config, returning llm, vlm, embed, and runtime sections.\n */\nexport function loadModelConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {},\n): ModelConfigResult | null {\n if (typeof filePath !== \"string\" || filePath.trim().length === 0) {\n throw new Error(\"agent-model: loadModelConfig requires a non-empty file path\");\n }\n try {\n const parsed = loadYamlFileSync<{\n llm?: unknown;\n vlm?: unknown;\n embed?: unknown;\n runtime?: Record<string, unknown>;\n spec?: {\n llm?: unknown;\n vlm?: unknown;\n embed?: unknown;\n runtime?: Record<string, unknown>;\n };\n }>(filePath, {\n substituteEnv: options.substituteEnv !== false,\n missingEnv: \"keep\",\n cache: true,\n });\n if (parsed == null) return null;\n const source = parsed.spec ?? parsed;\n return {\n llm: source.llm ?? null,\n vlm: source.vlm ?? null,\n embed: source.embed ?? null,\n runtime: {\n check_connectivity:\n typeof source.runtime?.check_connectivity === \"boolean\"\n ? source.runtime.check_connectivity\n : undefined,\n },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-model: failed to parse config file ${filePath}: ${msg}`, { cause: e });\n }\n}\n\n/**\n * Load only the llm section from a YAML config file.\n * @deprecated Use loadModelConfig() instead.\n */\nexport function loadLlmConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {}\n): unknown | null {\n const result = loadModelConfig(filePath, options);\n return result?.llm ?? null;\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACGP,SAAS,sBAAsB,OAAuB;AACpD,SAAO,MAAM,QAAQ,mCAAmC,CAAC,GAAG,QAAgB;AAC1E,WAAO,QAAQ,IAAI,GAAG,KAAK,MAAM,GAAG;AAAA,EACtC,CAAC;AACH;AAEO,SAAS,cAAc,OAAyB;AACrD,MAAI,OAAO,UAAU,SAAU,QAAO,sBAAsB,KAAK;AACjE,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC;AACxE,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,EAAG,KAAI,CAAC,IAAI,cAAc,CAAC;AACpE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,aACd,SACA,UAAgC,CAAC,GACxB;AACT,QAAM,EAAE,eAAe,QAAQ,KAAK,IAAI;AACxC,QAAM,SAAS,iBAA8D,SAAS;AAAA,IACpF,eAAe;AAAA,IACf,YAAY;AAAA,EACd,CAAC;AACD,QAAM,MAAM,QAAQ,MAAM,OAAO,QAAQ;AACzC,MAAI,OAAO,KAAM,QAAO;AACxB,SAAO;AACT;AAYO,SAAS,gBACd,UACA,UAAgC,CAAC,GACP;AAC1B,MAAI,OAAO,aAAa,YAAY,SAAS,KAAK,EAAE,WAAW,GAAG;AAChE,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,MAAI;AACF,UAAM,SAAS,iBAWZ,UAAU;AAAA,MACX,eAAe,QAAQ,kBAAkB;AAAA,MACzC,YAAY;AAAA,MACZ,OAAO;AAAA,IACT,CAAC;AACD,QAAI,UAAU,KAAM,QAAO;AAC3B,UAAM,SAAS,OAAO,QAAQ;AAC9B,WAAO;AAAA,MACL,KAAK,OAAO,OAAO;AAAA,MACnB,KAAK,OAAO,OAAO;AAAA,MACnB,OAAO,OAAO,SAAS;AAAA,MACvB,SAAS;AAAA,QACP,oBACE,OAAO,OAAO,SAAS,uBAAuB,YAC1C,OAAO,QAAQ,qBACf;AAAA,MACR;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AACV,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,UAAM,IAAI,MAAM,4CAA4C,QAAQ,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,EAC9F;AACF;AAMO,SAAS,cACd,UACA,UAAgC,CAAC,GACjB;AAChB,QAAM,SAAS,gBAAgB,UAAU,OAAO;AAChD,SAAO,QAAQ,OAAO;AACxB;","names":[]}
@@ -1,105 +0,0 @@
1
- // src/connectivity/check.ts
2
- import https from "https";
3
- var DEFAULT_TIMEOUT_MS = 8e3;
4
- function probePath(baseURL) {
5
- const base = baseURL.replace(/\/+$/, "");
6
- if (base.endsWith("/v1")) return `${base}/models`;
7
- return base.includes("/v1") ? `${base}/models` : `${base}/v1/models`;
8
- }
9
- function resolveProbeRequest(baseURL, endpointOptions) {
10
- let path = probePath(baseURL);
11
- const urlObj = new URL(path);
12
- const resolveFrom = endpointOptions?.resolveHost?.from;
13
- const resolveTo = endpointOptions?.resolveHost?.to;
14
- let hostHeader = endpointOptions?.host;
15
- if (resolveFrom && resolveTo && urlObj.hostname) {
16
- urlObj.hostname = urlObj.hostname.replace(resolveFrom, resolveTo);
17
- hostHeader = hostHeader ?? resolveFrom;
18
- }
19
- const searchParams = new URLSearchParams(urlObj.search);
20
- if (endpointOptions?.bypassAuth === true) searchParams.set("bypass_auth", "true");
21
- urlObj.search = searchParams.toString();
22
- return { url: urlObj.toString(), hostHeader };
23
- }
24
- function checkWithHttps(url, hostHeader, options) {
25
- return new Promise((resolve) => {
26
- const u = new URL(url);
27
- const reqOpts = {
28
- hostname: u.hostname,
29
- port: u.port || (u.protocol === "https:" ? 443 : 80),
30
- path: u.pathname + u.search,
31
- method: "GET",
32
- headers: { Accept: "application/json" },
33
- rejectUnauthorized: options.verifySSL
34
- };
35
- if (hostHeader) reqOpts.headers = { ...reqOpts.headers, Host: hostHeader };
36
- const timeoutId = setTimeout(() => {
37
- req.destroy();
38
- resolve({ reachable: false, message: "Connection timed out" });
39
- }, options.timeoutMs);
40
- const req = https.request(reqOpts, (res) => {
41
- clearTimeout(timeoutId);
42
- resolve({
43
- reachable: true,
44
- message: res.statusCode === 200 ? "OK" : `HTTP ${res.statusCode}`,
45
- statusCode: res.statusCode
46
- });
47
- });
48
- req.on("error", (err) => {
49
- clearTimeout(timeoutId);
50
- resolve({ reachable: false, message: err.message || "Connection failed" });
51
- });
52
- req.end();
53
- });
54
- }
55
- async function checkEndpointConnectivity(baseURL, options) {
56
- const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
57
- const useHttps = options?.resolveHost != null || options?.verifySSL === false || options?.host != null || options?.bypassAuth === true;
58
- if (useHttps) {
59
- const { url: url2, hostHeader } = resolveProbeRequest(baseURL, options);
60
- return checkWithHttps(url2, hostHeader, {
61
- timeoutMs,
62
- verifySSL: options?.verifySSL === true
63
- });
64
- }
65
- const url = probePath(baseURL);
66
- const controller = new AbortController();
67
- const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
68
- try {
69
- const res = await fetch(url, {
70
- method: "GET",
71
- signal: controller.signal,
72
- headers: { Accept: "application/json" }
73
- });
74
- clearTimeout(timeoutId);
75
- return {
76
- reachable: true,
77
- message: res.ok ? "OK" : `HTTP ${res.status}`,
78
- statusCode: res.status
79
- };
80
- } catch (err) {
81
- clearTimeout(timeoutId);
82
- const message = err instanceof Error ? err.message : String(err);
83
- const isTimeout = err instanceof Error && err.name === "AbortError";
84
- return {
85
- reachable: false,
86
- message: isTimeout ? "Connection timed out" : message || "Connection failed"
87
- };
88
- }
89
- }
90
- var CIS_UNREACHABLE_REMINDER = "Please ensure you are connected to Secure VPN and try again.";
91
- function buildUnreachableError(endpointId, baseURL, detail) {
92
- const parts = [
93
- `Cannot connect to CIS (endpoint: ${endpointId}, base URL: ${baseURL}).`,
94
- detail && ` ${detail}`,
95
- ` ${CIS_UNREACHABLE_REMINDER}`
96
- ];
97
- return parts.filter(Boolean).join("").trim();
98
- }
99
-
100
- export {
101
- checkEndpointConnectivity,
102
- CIS_UNREACHABLE_REMINDER,
103
- buildUnreachableError
104
- };
105
- //# sourceMappingURL=chunk-AUQEXHUP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/connectivity/check.ts"],"sourcesContent":["/**\n * Check connectivity to OpenAI-compatible / CIS endpoints.\n */\nimport https from \"node:https\";\nimport type { CheckConnectivityResult } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 8000;\n\nexport interface EndpointConnectivityOptions {\n timeoutMs?: number;\n resolveHost?: { from: string; to: string };\n host?: string;\n verifySSL?: boolean;\n bypassAuth?: boolean;\n featureKey?: string;\n}\n\nfunction probePath(baseURL: string): string {\n const base = baseURL.replace(/\\/+$/, \"\");\n if (base.endsWith(\"/v1\")) return `${base}/models`;\n return base.includes(\"/v1\") ? `${base}/models` : `${base}/v1/models`;\n}\n\nfunction resolveProbeRequest(\n baseURL: string,\n endpointOptions?: EndpointConnectivityOptions | null\n): { url: string; hostHeader: string | undefined } {\n let path = probePath(baseURL);\n const urlObj = new URL(path);\n const resolveFrom = endpointOptions?.resolveHost?.from;\n const resolveTo = endpointOptions?.resolveHost?.to;\n let hostHeader = endpointOptions?.host;\n if (resolveFrom && resolveTo && urlObj.hostname) {\n urlObj.hostname = urlObj.hostname.replace(resolveFrom, resolveTo);\n hostHeader = hostHeader ?? resolveFrom;\n }\n const searchParams = new URLSearchParams(urlObj.search);\n if (endpointOptions?.bypassAuth === true) searchParams.set(\"bypass_auth\", \"true\");\n urlObj.search = searchParams.toString();\n return { url: urlObj.toString(), hostHeader };\n}\n\nfunction checkWithHttps(\n url: string,\n hostHeader: string | undefined,\n options: { timeoutMs: number; verifySSL: boolean }\n): Promise<CheckConnectivityResult> {\n return new Promise((resolve) => {\n const u = new URL(url);\n const reqOpts: https.RequestOptions = {\n hostname: u.hostname,\n port: u.port || (u.protocol === \"https:\" ? 443 : 80),\n path: u.pathname + u.search,\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n rejectUnauthorized: options.verifySSL,\n };\n if (hostHeader) reqOpts.headers = { ...reqOpts.headers, Host: hostHeader };\n\n const timeoutId = setTimeout(() => {\n req.destroy();\n resolve({ reachable: false, message: \"Connection timed out\" });\n }, options.timeoutMs);\n\n const req = https.request(reqOpts, (res) => {\n clearTimeout(timeoutId);\n resolve({\n reachable: true,\n message: res.statusCode === 200 ? \"OK\" : `HTTP ${res.statusCode}`,\n statusCode: res.statusCode,\n });\n });\n req.on(\"error\", (err) => {\n clearTimeout(timeoutId);\n resolve({ reachable: false, message: err.message || \"Connection failed\" });\n });\n req.end();\n });\n}\n\nexport async function checkEndpointConnectivity(\n baseURL: string,\n options?: { timeoutMs?: number } & EndpointConnectivityOptions\n): Promise<CheckConnectivityResult> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const useHttps =\n options?.resolveHost != null ||\n options?.verifySSL === false ||\n options?.host != null ||\n options?.bypassAuth === true;\n\n if (useHttps) {\n const { url, hostHeader } = resolveProbeRequest(baseURL, options);\n return checkWithHttps(url, hostHeader, {\n timeoutMs,\n verifySSL: options?.verifySSL === true,\n });\n }\n\n const url = probePath(baseURL);\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n });\n clearTimeout(timeoutId);\n return {\n reachable: true,\n message: res.ok ? \"OK\" : `HTTP ${res.status}`,\n statusCode: res.status,\n };\n } catch (err) {\n clearTimeout(timeoutId);\n const message = err instanceof Error ? err.message : String(err);\n const isTimeout = err instanceof Error && err.name === \"AbortError\";\n return {\n reachable: false,\n message: isTimeout ? \"Connection timed out\" : message || \"Connection failed\",\n };\n }\n}\n\nexport const CIS_UNREACHABLE_REMINDER =\n \"Please ensure you are connected to Secure VPN and try again.\";\n\nexport function buildUnreachableError(\n endpointId: string,\n baseURL: string,\n detail?: string\n): string {\n const parts = [\n `Cannot connect to CIS (endpoint: ${endpointId}, base URL: ${baseURL}).`,\n detail && ` ${detail}`,\n ` ${CIS_UNREACHABLE_REMINDER}`,\n ];\n return parts.filter(Boolean).join(\"\").trim();\n}\n"],"mappings":"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","names":["url"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/extensions/loader.ts","../src/types.ts","../src/extensions/npm-protocol.ts"],"sourcesContent":["/**\n * Load LLM extensions by npm package name or by dynamic discovery.\n * Extensions register a ChatModel factory via registerChatModelProvider.\n */\n\nimport { readdirSync, readFileSync, existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ILLMExtension } from \"../types.js\";\nimport { AGENT_LLM_PROVIDER_FIELD } from \"../types.js\";\nimport { registerChatModelProvider, type ChatModelFactory } from \"../registry/chat-model.js\";\n\nconst loadedPackages = new Set<string>();\n\nfunction isLLMExtension(m: unknown): m is ILLMExtension {\n if (m == null || typeof m !== \"object\") return false;\n const e = m as ILLMExtension;\n if (typeof e.providerName !== \"string\") return false;\n const hasRegister = typeof e.register === \"function\";\n const hasChatModel = typeof e.createChatModel === \"function\";\n return hasRegister || hasChatModel;\n}\n\nfunction registerExtension(ext: ILLMExtension): void {\n if (typeof ext.createChatModel === \"function\") {\n registerChatModelProvider(ext.providerName, ext.createChatModel as ChatModelFactory);\n return;\n }\n if (typeof ext.register === \"function\") {\n ext.register();\n }\n}\n\nfunction getExtensionFromModule(m: Record<string, unknown>): ILLMExtension | null {\n if (isLLMExtension(m)) return m;\n if (typeof m.getLLMExtension === \"function\") {\n const ext = m.getLLMExtension();\n return isLLMExtension(ext) ? ext : null;\n }\n if (isLLMExtension(m.default)) return m.default;\n return null;\n}\n\nexport function resolveLLMExtensionPackages(types?: string | string[]): string[] {\n if (types == null) return [];\n const typeList = Array.isArray(types) ? types : [types];\n return typeList.filter(\n (t): t is string => typeof t === \"string\" && String(t).trim().length > 0\n );\n}\n\nfunction readPackageProviderName(pkgPath: string): string | null {\n if (!existsSync(pkgPath)) return null;\n try {\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw) as { agentLlmProvider?: boolean; keywords?: string[]; name?: string };\n const declared =\n pkg[AGENT_LLM_PROVIDER_FIELD] === true ||\n (Array.isArray(pkg.keywords) && pkg.keywords.includes(\"agent-model-provider\"));\n return declared && typeof pkg.name === \"string\" ? pkg.name : null;\n } catch {\n return null;\n }\n}\n\nexport function discoverLLMExtensions(cwd: string = process.cwd()): string[] {\n const dir = typeof cwd === \"string\" && cwd.trim().length > 0 ? cwd : process.cwd();\n const nodeModules = join(dir, \"node_modules\");\n if (!existsSync(nodeModules)) return [];\n const names: string[] = [];\n const seen = new Set<string>();\n try {\n const entries = readdirSync(nodeModules, { withFileTypes: true });\n for (const e of entries) {\n if (e.name.startsWith(\".\") || e.name === \"node\") continue;\n if (e.name.startsWith(\"@\") && e.isDirectory()) {\n const scopePath = join(nodeModules, e.name);\n const scopeEntries = readdirSync(scopePath, { withFileTypes: true });\n for (const se of scopeEntries) {\n if (!se.isDirectory()) continue;\n const name = readPackageProviderName(join(scopePath, se.name, \"package.json\"));\n if (name && !seen.has(name)) {\n seen.add(name);\n names.push(name);\n }\n }\n continue;\n }\n const name = readPackageProviderName(join(nodeModules, e.name, \"package.json\"));\n if (name && !seen.has(name)) {\n seen.add(name);\n names.push(name);\n }\n }\n } catch {\n // no node_modules or not readable\n }\n return names;\n}\n\nasync function loadModuleFromPath(pkgDir: string): Promise<Record<string, unknown>> {\n const pkgJsonPath = join(pkgDir, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n throw new Error(`package.json not found in ${pkgDir}`);\n }\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as { main?: string };\n const main = pkgJson?.main ?? \"index.js\";\n const entryPath = join(pkgDir, main);\n if (!existsSync(entryPath)) {\n throw new Error(`Entry ${main} not found in ${pkgDir}`);\n }\n const entryUrl = pathToFileURL(entryPath).href;\n return (await import(/* @vite-ignore */ entryUrl)) as Record<string, unknown>;\n}\n\n/**\n * Resolve package main entry from cwd so we load the copy in cwd's node_modules,\n * not a different copy from bare import (e.g. under @wallee/agent).\n */\nfunction resolvePackageEntryFromCwd(pkg: string, cwd: string): string | null {\n const pkgDir = join(cwd, \"node_modules\", pkg);\n const pkgJsonPath = join(pkgDir, \"package.json\");\n if (!existsSync(pkgJsonPath)) return null;\n try {\n const req = createRequire(pkgJsonPath);\n return req.resolve(pkg);\n } catch {\n return null;\n }\n}\n\nexport interface LoadLLMExtensionsOptions {\n cwd?: string;\n}\n\nexport async function loadLLMExtensions(\n extensionPackages?: string[],\n options?: LoadLLMExtensionsOptions\n): Promise<void> {\n const packages = Array.isArray(extensionPackages)\n ? extensionPackages.filter((p): p is string => typeof p === \"string\" && String(p).trim().length > 0)\n : [];\n const cwd = options?.cwd ?? process.cwd();\n for (const pkg of packages) {\n if (loadedPackages.has(pkg)) continue;\n loadedPackages.add(pkg);\n let loaded = false;\n const cwdPkgDir = join(cwd, \"node_modules\", pkg);\n const cwdIsProject =\n existsSync(join(cwd, \"package.json\")) &&\n (() => {\n try {\n const name = (JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf-8\")) as { name?: string }).name;\n return name === pkg;\n } catch {\n return false;\n }\n })();\n const dirsToTry = [cwdPkgDir, ...(cwdIsProject ? [cwd] : [])];\n for (const pkgDir of dirsToTry) {\n if (!existsSync(join(pkgDir, \"package.json\"))) continue;\n try {\n const m = await loadModuleFromPath(pkgDir);\n const ext = getExtensionFromModule(m);\n if (ext) {\n registerExtension(ext);\n loaded = true;\n break;\n }\n if (typeof (m as { registerLLMExtension?: () => void }).registerLLMExtension === \"function\") {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n loaded = true;\n break;\n }\n } catch {\n // try next path\n }\n }\n if (loaded) continue;\n // Prefer cwd-resolved entry so we load the copy just installed, not another copy from bare import\n const resolvedEntry = resolvePackageEntryFromCwd(pkg, cwd);\n if (resolvedEntry) {\n try {\n const entryUrl = pathToFileURL(resolvedEntry).href;\n const m = (await import(/* @vite-ignore */ entryUrl)) as Record<string, unknown>;\n const ext = getExtensionFromModule(m);\n if (ext) {\n registerExtension(ext);\n continue;\n }\n if (typeof (m as { registerLLMExtension?: () => void }).registerLLMExtension === \"function\") {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n continue;\n }\n } catch {\n // fall through to bare import\n }\n }\n try {\n const m = await import(/* @vite-ignore */ pkg) as Record<string, unknown>;\n const ext = getExtensionFromModule(m);\n if (ext) {\n registerExtension(ext);\n continue;\n }\n if (typeof (m as { registerLLMExtension?: () => void }).registerLLMExtension === \"function\") {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (typeof process !== \"undefined\" && process.emitWarning) {\n process.emitWarning(`[agent-model] Failed to load extension \"${pkg}\": ${msg}`, { code: \"AGENT_LLM_EXTENSION_LOAD\" });\n }\n }\n }\n}\n\nexport async function loadDiscoveredExtensions(cwd: string = process.cwd()): Promise<string[]> {\n const dir = typeof cwd === \"string\" && cwd.trim().length > 0 ? cwd : process.cwd();\n const names = discoverLLMExtensions(dir);\n await loadLLMExtensions(names);\n return names;\n}\n","/**\n * Agent LLM: OpenAI-compatible config.\n * Returns LangChain BaseChatModel instances.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\n\n// LLM types now live locally in agent-model\nexport type { LLMType, LLMConfig, AgentConfigLlmSection } from \"./model/types.js\";\n\n/** package.json field: when true, the package is an agent-model provider (legacy name kept for compatibility). */\nexport const AGENT_LLM_PROVIDER_FIELD = \"agentLlmProvider\";\n\n/**\n * Extension interface: register a ChatModel factory by provider name.\n * Extensions implement getLLMExtension(); framework registers the factory when loading.\n */\nexport interface ILLMExtension {\n readonly providerName: string;\n /** ChatModel factory. Framework calls registerChatModelProvider(providerName, createChatModel). */\n readonly createChatModel?: (config: import(\"./model/types.js\").LLMConfig) => BaseChatModel;\n /** Legacy: if extension provides register(), framework calls it. */\n register?(): void;\n}\n","/**\n * npm: protocol in provider — specify an npm package name (and optional version) in config's provider.\n * When installNpmIfMissing is true, the framework will run npm install <package>[@version] if the package is not found.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { loadLLMExtensions } from \"./loader.js\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\nimport { createChatModelFromLlmConfig } from \"../langchain/index.js\";\nimport type { CreateChatModelOptions } from \"../langchain/index.js\";\nimport {\n NPM_PROTOCOL_PREFIX,\n parseNpmProviderSpec,\n isNpmProviderSpec,\n resolveLatestVersionFromRegistry,\n getInstalledVersion as getInstalledVersionFromCommon,\n ensureNpmPackageInstalled as ensureNpmPackageInstalledFromCommon,\n} from \"@easynet/agent-common/npm\";\n\nexport { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec };\n\nexport async function getLatestVersion(\n packageName: string,\n options: { cwd?: string } = {}\n): Promise<string> {\n return resolveLatestVersionFromRegistry(packageName, { cwd: options.cwd ?? process.cwd() });\n}\n\nexport function getInstalledVersion(packageName: string, options: { cwd?: string } = {}): string | null {\n return getInstalledVersionFromCommon(packageName, options);\n}\n\nexport interface EnsureNpmPackageInstalledOptions {\n version?: string;\n cwd?: string;\n}\n\nfunction isModuleNotFoundError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return (\n msg.includes(\"Cannot find module\") ||\n msg.includes(\"Cannot find package\") ||\n msg.includes(\"MODULE_NOT_FOUND\") ||\n msg.includes(\"ERR_MODULE_NOT_FOUND\") ||\n msg.includes(\"Failed to load url\") ||\n msg.includes(\"Does the file exist\")\n );\n}\n\n/**\n * Ensure the npm package is installed at the required version.\n * We only use version numbers for management; \"latest\" is always resolved to the actual\n * version from the registry, then we install that version if missing or different.\n */\nexport async function ensureNpmPackageInstalled(\n packageName: string,\n options: EnsureNpmPackageInstalledOptions = {}\n): Promise<void> {\n await ensureNpmPackageInstalledFromCommon(packageName, {\n version: options.version,\n cwd: options.cwd,\n stdio: \"inherit\",\n noPackageLock: true,\n logPrefix: \"[agent-model]\",\n });\n}\n\nexport interface ResolveNpmProviderOptions {\n installNpmIfMissing?: boolean;\n cwd?: string;\n}\n\nfunction normalizeError(e: unknown, context: string): Error {\n if (e instanceof Error) return new Error(`${context}: ${e.message}`, { cause: e });\n return new Error(`${context}: ${String(e)}`);\n}\n\nexport async function resolveNpmProvider(\n spec: string,\n options: ResolveNpmProviderOptions = {}\n): Promise<string | null> {\n if (typeof spec !== \"string\" || spec.trim().length === 0) return null;\n const parsed = parseNpmProviderSpec(spec);\n if (!parsed) return null;\n const { packageName, version, provider: fragmentProvider } = parsed;\n const installNpmIfMissing = options.installNpmIfMissing !== false;\n const cwd = options.cwd ?? process.cwd();\n\n const load = async (): Promise<void> => {\n await loadLLMExtensions([packageName], { cwd });\n };\n\n if (installNpmIfMissing) {\n await ensureNpmPackageInstalled(packageName, { version, cwd });\n }\n\n try {\n await load();\n } catch (err) {\n if (installNpmIfMissing && isModuleNotFoundError(err)) {\n try {\n await ensureNpmPackageInstalled(packageName, { version, cwd });\n await load();\n } catch (installErr) {\n throw normalizeError(installErr, `Failed to install or load npm provider \"${packageName}\"`);\n }\n } else {\n throw normalizeError(err, `Failed to load npm provider \"${packageName}\"`);\n }\n }\n\n if (fragmentProvider && !getChatModelFactory(fragmentProvider)) {\n if (installNpmIfMissing) {\n await ensureNpmPackageInstalled(packageName, { version, cwd });\n await load();\n }\n if (!getChatModelFactory(fragmentProvider)) {\n throw new Error(`Package \"${packageName}\" was installed but did not register provider \"${fragmentProvider}\". Check that the package exports getLLMExtension() or registerLLMExtension().`);\n }\n }\n\n if (fragmentProvider) return fragmentProvider;\n\n try {\n const m = await import(/* @vite-ignore */ packageName);\n if (typeof (m as { getDefaultProviderName?: () => string }).getDefaultProviderName === \"function\") {\n return (m as { getDefaultProviderName: () => string }).getDefaultProviderName();\n }\n } catch {\n // ignore\n }\n throw new Error(\n `Provider spec ${spec} has no #provider fragment and the package does not export getDefaultProviderName(). Use e.g. npm:${packageName}#<provider-name>.`\n );\n}\n\nexport interface ResolveLlmSectionWithNpmOptions extends ResolveNpmProviderOptions {}\n\nexport async function resolveLlmSectionWithNpm(\n llmSection: unknown,\n options: ResolveLlmSectionWithNpmOptions = {}\n): Promise<unknown> {\n if (llmSection == null) return llmSection;\n if (Array.isArray(llmSection)) {\n const out: unknown[] = [];\n for (let i = 0; i < llmSection.length; i++) {\n try {\n out.push(await resolveLlmSectionWithNpm(llmSection[i], options));\n } catch (e) {\n throw normalizeError(e, `Failed to resolve llm section at index ${i}`);\n }\n }\n return out;\n }\n if (typeof llmSection === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(llmSection)) {\n if (k === \"provider\" && isNpmProviderSpec(v)) {\n try {\n const resolved = await resolveNpmProvider(v as string, options);\n out[k] = resolved ?? v;\n } catch (e) {\n throw normalizeError(e, `Failed to resolve provider \"${String(v)}\"`);\n }\n continue;\n }\n try {\n out[k] = await resolveLlmSectionWithNpm(v, options);\n } catch (e) {\n throw normalizeError(e, `Failed to resolve llm section key \"${k}\"`);\n }\n }\n return out;\n }\n return llmSection;\n}\n\nexport interface CreateChatModelWithNpmOptions\n extends CreateChatModelOptions,\n ResolveNpmProviderOptions {}\n\nexport async function createChatModelWithNpm(\n options: CreateChatModelWithNpmOptions = {}\n): Promise<BaseChatModel> {\n try {\n const { installNpmIfMissing, cwd, ...rest } = options;\n const resolvedSection = await resolveLlmSectionWithNpm(options.llmSection ?? null, {\n installNpmIfMissing,\n cwd,\n });\n return createChatModelFromLlmConfig({\n ...rest,\n llmSection: resolvedSection,\n });\n } catch (e) {\n throw normalizeError(e, \"createChatModelWithNpm failed\");\n }\n}\n"],"mappings":"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","names":["name"]}
@@ -1,18 +0,0 @@
1
- import { type LoadLlmConfigOptions, type ModelConfigResult } from "./loader.js";
2
- export { parseLlmSection } from "./parser.js";
3
- export { loadLlmConfig, parseLlmYaml, substituteEnv } from "./loader.js";
4
- export { loadYamlConfig } from "./yaml.js";
5
- export { normalizeAgentModelConfigRef } from "./ref.js";
6
- export { loadYamlFile, loadYamlFileSync, parseYamlContent, clearYamlFileCache, type LoadYamlOptions, type YamlEnvOptions, } from "./yaml-utils.js";
7
- export type { LoadLlmConfigOptions, ModelConfigResult } from "./loader.js";
8
- export type { AgentModelConfigRef } from "./ref.js";
9
- export interface LoadModelConfigOptions {
10
- configPath?: string;
11
- loadOptions?: LoadLlmConfigOptions;
12
- }
13
- export interface CreateModelConfigOptions extends LoadModelConfigOptions {
14
- overrides?: Partial<ModelConfigResult>;
15
- }
16
- export declare function loadModelRuntimeConfig(options?: LoadModelConfigOptions): ModelConfigResult | null;
17
- export declare function createModelConfig(options?: CreateModelConfigOptions): ModelConfigResult | null;
18
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEjG,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC3E,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC;AAED,MAAM,WAAW,wBAAyB,SAAQ,sBAAsB;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,GAAG,IAAI,CAGrG;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,iBAAiB,GAAG,IAAI,CAKlG"}