@easynet/agent-model 1.0.67 → 1.0.68

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 (43) hide show
  1. package/dist/api/create-agent-model-registry.d.ts +19 -0
  2. package/dist/api/create-agent-model-registry.d.ts.map +1 -0
  3. package/dist/{chunk-CCGNXMFC.js → chunk-6EQCGQTV.js} +4 -15
  4. package/dist/chunk-6EQCGQTV.js.map +1 -0
  5. package/dist/{chunk-EPVJLBGC.js → chunk-AUQEXHUP.js} +2 -15
  6. package/dist/chunk-AUQEXHUP.js.map +1 -0
  7. package/dist/{chunk-K3JR2N4E.js → chunk-KE7IMUSA.js} +2 -29
  8. package/dist/chunk-KE7IMUSA.js.map +1 -0
  9. package/dist/chunk-MFLWZSWI.js +17 -0
  10. package/dist/chunk-MFLWZSWI.js.map +1 -0
  11. package/dist/{chunk-XSR4TAZ7.js → chunk-RRZDREGU.js} +9 -9
  12. package/dist/cli/index.js +252 -8
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/config/index.js +44 -7
  15. package/dist/config/index.js.map +1 -1
  16. package/dist/connectivity/index.js +1 -2
  17. package/dist/extensions/index.js +5 -7
  18. package/dist/index.d.ts +3 -57
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +191 -109
  21. package/dist/index.js.map +1 -1
  22. package/dist/langchain/index.js +2 -3
  23. package/dist/model/index.js +172 -5
  24. package/dist/model/index.js.map +1 -1
  25. package/dist/npm/index.js +1 -2
  26. package/dist/registry/index.js +0 -2
  27. package/package.json +1 -33
  28. package/dist/chunk-5QOKZ2JF.js +0 -83
  29. package/dist/chunk-5QOKZ2JF.js.map +0 -1
  30. package/dist/chunk-CCGNXMFC.js.map +0 -1
  31. package/dist/chunk-CJK5NAOX.js +0 -260
  32. package/dist/chunk-CJK5NAOX.js.map +0 -1
  33. package/dist/chunk-EPVJLBGC.js.map +0 -1
  34. package/dist/chunk-HCU4AWIV.js +0 -19
  35. package/dist/chunk-HCU4AWIV.js.map +0 -1
  36. package/dist/chunk-K3JR2N4E.js.map +0 -1
  37. package/dist/chunk-PZ5AY32C.js +0 -10
  38. package/dist/chunk-PZ5AY32C.js.map +0 -1
  39. package/dist/chunk-V5QTINFH.js +0 -43
  40. package/dist/chunk-V5QTINFH.js.map +0 -1
  41. package/dist/chunk-Z4E7LN4P.js +0 -205
  42. package/dist/chunk-Z4E7LN4P.js.map +0 -1
  43. /package/dist/{chunk-XSR4TAZ7.js.map → chunk-RRZDREGU.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../src/config/index.ts","../../src/config/yaml.ts","../../src/config/ref.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { deepMerge } from \"@easynet/agent-common\";\nimport { loadModelConfig, type LoadLlmConfigOptions, type ModelConfigResult } from \"./loader.js\";\n\nexport { parseLlmSection } from \"./parser.js\";\nexport { loadLlmConfig, parseLlmYaml, substituteEnv } from \"./loader.js\";\nexport { loadYamlConfig } from \"./yaml.js\";\nexport { normalizeAgentModelConfigRef } from \"./ref.js\";\nexport {\n loadYamlFile,\n loadYamlFileSync,\n parseYamlContent,\n clearYamlFileCache,\n type LoadYamlOptions,\n type YamlEnvOptions,\n} from \"./yaml-utils.js\";\nexport type { LoadLlmConfigOptions, ModelConfigResult } from \"./loader.js\";\nexport type { AgentModelConfigRef } from \"./ref.js\";\n\nexport interface LoadModelConfigOptions {\n configPath?: string;\n loadOptions?: LoadLlmConfigOptions;\n}\n\nexport interface CreateModelConfigOptions extends LoadModelConfigOptions {\n overrides?: Partial<ModelConfigResult>;\n}\n\nexport function loadModelRuntimeConfig(options: LoadModelConfigOptions = {}): ModelConfigResult | null {\n const configPath = options.configPath ?? join(process.cwd(), \"model.yaml\");\n return loadModelConfig(configPath, options.loadOptions);\n}\n\nexport function createModelConfig(options: CreateModelConfigOptions = {}): ModelConfigResult | null {\n const base = loadModelRuntimeConfig(options);\n if (!base) return base;\n if (!options.overrides) return base;\n return deepMerge({} as ModelConfigResult, base, options.overrides);\n}\n","/**\n * Generic YAML file loader utility.\n */\n\nimport { loadYamlFileSync } from \"./yaml-utils.js\";\n\n/**\n * Load and parse a YAML file into a typed object.\n * Returns empty object if file doesn't exist.\n */\nexport function loadYamlConfig<T = Record<string, unknown>>(filePath: string): T {\n try {\n const parsed = loadYamlFileSync<T>(filePath, {\n substituteEnv: true,\n missingEnv: \"keep\",\n cache: true,\n });\n return (parsed ?? ({} as T)) as T;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to load YAML config from ${filePath}: ${msg}`, { cause: e });\n }\n}\n","/** Agent-level reference to models config file. */\nexport interface AgentModelConfigRef {\n ref?: string;\n}\n\nfunction asObject(input: unknown): Record<string, unknown> | undefined {\n return typeof input === \"object\" && input !== null ? (input as Record<string, unknown>) : undefined;\n}\n\n/** Normalize unknown value to AgentModelConfigRef. */\nexport function normalizeAgentModelConfigRef(raw: unknown): Partial<AgentModelConfigRef> {\n if (typeof raw === \"string\" && raw.trim().length > 0) return { ref: raw.trim() };\n const obj = asObject(raw);\n if (!obj) return {};\n if (typeof obj.ref === \"string\" && obj.ref.trim().length > 0) return { ref: obj.ref.trim() };\n return {};\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,iBAAiB;;;ACSnB,SAAS,eAA4C,UAAqB;AAC/E,MAAI;AACF,UAAM,SAAS,iBAAoB,UAAU;AAAA,MAC3C,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,IACT,CAAC;AACD,WAAQ,UAAW,CAAC;AAAA,EACtB,SAAS,GAAG;AACV,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,UAAM,IAAI,MAAM,mCAAmC,QAAQ,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,EACrF;AACF;;;ACjBA,SAAS,SAAS,OAAqD;AACrE,SAAO,OAAO,UAAU,YAAY,UAAU,OAAQ,QAAoC;AAC5F;AAGO,SAAS,6BAA6B,KAA4C;AACvF,MAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAE,SAAS,EAAG,QAAO,EAAE,KAAK,IAAI,KAAK,EAAE;AAC/E,QAAM,MAAM,SAAS,GAAG;AACxB,MAAI,CAAC,IAAK,QAAO,CAAC;AAClB,MAAI,OAAO,IAAI,QAAQ,YAAY,IAAI,IAAI,KAAK,EAAE,SAAS,EAAG,QAAO,EAAE,KAAK,IAAI,IAAI,KAAK,EAAE;AAC3F,SAAO,CAAC;AACV;;;AFYO,SAAS,uBAAuB,UAAkC,CAAC,GAA6B;AACrG,QAAM,aAAa,QAAQ,cAAc,KAAK,QAAQ,IAAI,GAAG,YAAY;AACzE,SAAO,gBAAgB,YAAY,QAAQ,WAAW;AACxD;AAEO,SAAS,kBAAkB,UAAoC,CAAC,GAA6B;AAClG,QAAM,OAAO,uBAAuB,OAAO;AAC3C,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,QAAQ,UAAW,QAAO;AAC/B,SAAO,UAAU,CAAC,GAAwB,MAAM,QAAQ,SAAS;AACnE;","names":[]}
@@ -2,8 +2,7 @@ import {
2
2
  CIS_UNREACHABLE_REMINDER,
3
3
  buildUnreachableError,
4
4
  checkEndpointConnectivity
5
- } from "../chunk-EPVJLBGC.js";
6
- import "../chunk-PZ5AY32C.js";
5
+ } from "../chunk-AUQEXHUP.js";
7
6
  export {
8
7
  CIS_UNREACHABLE_REMINDER,
9
8
  buildUnreachableError,
@@ -1,4 +1,3 @@
1
- import "../chunk-V5QTINFH.js";
2
1
  import {
3
2
  createChatModelWithNpm,
4
3
  discoverLLMExtensions,
@@ -10,16 +9,15 @@ import {
10
9
  resolveLLMExtensionPackages,
11
10
  resolveLlmSectionWithNpm,
12
11
  resolveNpmProvider
13
- } from "../chunk-XSR4TAZ7.js";
12
+ } from "../chunk-RRZDREGU.js";
13
+ import "../chunk-6EQCGQTV.js";
14
+ import "../chunk-G7MKWPEI.js";
15
+ import "../chunk-SPDXNDDD.js";
14
16
  import {
15
17
  NPM_PROTOCOL_PREFIX,
16
18
  isNpmProviderSpec,
17
19
  parseNpmProviderSpec
18
- } from "../chunk-K3JR2N4E.js";
19
- import "../chunk-CCGNXMFC.js";
20
- import "../chunk-SPDXNDDD.js";
21
- import "../chunk-G7MKWPEI.js";
22
- import "../chunk-PZ5AY32C.js";
20
+ } from "../chunk-KE7IMUSA.js";
23
21
  export {
24
22
  NPM_PROTOCOL_PREFIX,
25
23
  createChatModelWithNpm,
package/dist/index.d.ts CHANGED
@@ -1,61 +1,7 @@
1
1
  /**
2
2
  * Minimal public API for @easynet/agent-model.
3
- * Goal: create a chat model from `model.yaml` with the smallest possible surface.
3
+ * Only support creating AgentModel via embedded model.yaml (+ optional override file).
4
4
  */
5
- export { createAgentLlm } from "./api/create-agent-llm.js";
6
- export type { CreateAgentLlmOptions } from "./api/create-agent-llm.js";
7
- export { getDefaultLlmConfig } from "./api/get-default-llm-config.js";
8
- export type { GetDefaultLlmConfigOptions } from "./api/get-default-llm-config.js";
9
- export { getDefaultVlmConfig } from "./api/get-default-vlm-config.js";
10
- export type { GetDefaultVlmConfigOptions } from "./api/get-default-vlm-config.js";
11
- export { createEmbedFnFromModelsConfig } from "./api/create-embed-fn.js";
12
- export type { EmbedFn } from "./api/create-embed-fn.js";
13
- export type { AgentModelConfigRef } from "./config/index.js";
14
- export { normalizeAgentModelConfigRef, loadModelRuntimeConfig, createModelConfig, } from "./config/index.js";
15
- export type { LoadModelConfigOptions, CreateModelConfigOptions } from "./config/index.js";
16
- export { createChatModelFromLlmConfig } from "./langchain/index.js";
17
- export type { CreateChatModelOptions } from "./langchain/index.js";
18
- export { applyToolChoiceAuto } from "./langchain/index.js";
19
- export { registerChatModelProvider, getChatModelFactory } from "./registry/chat-model.js";
20
- export type { ChatModelFactory } from "./registry/chat-model.js";
21
- import { createAgentLlm } from "./api/create-agent-llm.js";
22
- import { getDefaultLlmConfig } from "./api/get-default-llm-config.js";
23
- import { getDefaultVlmConfig } from "./api/get-default-vlm-config.js";
24
- import { createEmbedFnFromModelsConfig } from "./api/create-embed-fn.js";
25
- import { createChatModelFromLlmConfig, applyToolChoiceAuto } from "./langchain/index.js";
26
- import { registerChatModelProvider, getChatModelFactory } from "./registry/chat-model.js";
27
- import * as ConfigApi from "./config/index.js";
28
- import * as LangChainApi from "./langchain/index.js";
29
- import * as ModelApi from "./model/index.js";
30
- import * as RegistryApi from "./registry/index.js";
31
- import * as ExtensionsApi from "./extensions/index.js";
32
- import * as ConnectivityApi from "./connectivity/index.js";
33
- import * as NpmApi from "./npm/index.js";
34
- import * as CliApi from "./cli/index.js";
35
- /**
36
- * Facade: high-frequency model APIs with a single import.
37
- */
38
- export declare const modelApi: {
39
- readonly createAgentLlm: typeof createAgentLlm;
40
- readonly getDefaultLlmConfig: typeof getDefaultLlmConfig;
41
- readonly getDefaultVlmConfig: typeof getDefaultVlmConfig;
42
- readonly createEmbedFnFromModelsConfig: typeof createEmbedFnFromModelsConfig;
43
- readonly createChatModelFromLlmConfig: typeof createChatModelFromLlmConfig;
44
- readonly applyToolChoiceAuto: typeof applyToolChoiceAuto;
45
- readonly registerChatModelProvider: typeof registerChatModelProvider;
46
- readonly getChatModelFactory: typeof getChatModelFactory;
47
- };
48
- /**
49
- * Facade: grouped subpath modules (config/langchain/model/registry/extensions/connectivity/npm/cli).
50
- */
51
- export declare const platformApi: {
52
- readonly config: typeof ConfigApi;
53
- readonly langchain: typeof LangChainApi;
54
- readonly model: typeof ModelApi;
55
- readonly registry: typeof RegistryApi;
56
- readonly extensions: typeof ExtensionsApi;
57
- readonly connectivity: typeof ConnectivityApi;
58
- readonly npm: typeof NpmApi;
59
- readonly cli: typeof CliApi;
60
- };
5
+ export { createAgentModelRegistry } from "./api/create-agent-model-registry.js";
6
+ export type { CreateAgentModelRegistryOptions } from "./api/create-agent-model-registry.js";
61
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,YAAY,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,YAAY,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAG1F,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,YAAY,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,WAAW,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,eAAe,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAEzC;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;CASX,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,YAAY,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC"}
package/dist/index.js CHANGED
@@ -1,73 +1,128 @@
1
1
  import {
2
- cli_exports,
3
- createAgentLlm
4
- } from "./chunk-CJK5NAOX.js";
5
- import {
6
- config_exports,
7
- createModelConfig,
8
- loadModelRuntimeConfig,
9
- normalizeAgentModelConfigRef
10
- } from "./chunk-5QOKZ2JF.js";
11
- import {
12
- loadLlmConfig,
13
2
  loadModelConfig
14
3
  } from "./chunk-3HA2CHZN.js";
15
4
  import {
16
- connectivity_exports
17
- } from "./chunk-EPVJLBGC.js";
18
- import {
19
- extensions_exports
20
- } from "./chunk-V5QTINFH.js";
5
+ buildUnreachableError,
6
+ checkEndpointConnectivity
7
+ } from "./chunk-AUQEXHUP.js";
21
8
  import {
22
9
  resolveLlmSectionWithNpm
23
- } from "./chunk-XSR4TAZ7.js";
24
- import {
25
- npm_exports
26
- } from "./chunk-K3JR2N4E.js";
10
+ } from "./chunk-RRZDREGU.js";
27
11
  import {
28
- applyToolChoiceAuto,
29
- createChatModelFromLlmConfig,
30
- langchain_exports
31
- } from "./chunk-CCGNXMFC.js";
12
+ createChatModelFromLlmConfig
13
+ } from "./chunk-6EQCGQTV.js";
14
+ import "./chunk-G7MKWPEI.js";
32
15
  import {
33
- createModelHub,
34
- model_exports,
35
16
  parseEmbedSection
36
- } from "./chunk-Z4E7LN4P.js";
17
+ } from "./chunk-MFLWZSWI.js";
37
18
  import {
38
19
  parseLlmSection
39
20
  } from "./chunk-SPDXNDDD.js";
40
- import {
41
- registry_exports
42
- } from "./chunk-HCU4AWIV.js";
43
- import {
44
- getChatModelFactory,
45
- registerChatModelProvider
46
- } from "./chunk-G7MKWPEI.js";
47
- import "./chunk-PZ5AY32C.js";
21
+ import "./chunk-KE7IMUSA.js";
48
22
 
49
- // src/api/get-default-llm-config.ts
50
- import { join } from "path";
51
- async function getDefaultLlmConfig(options = {}) {
52
- const configPath = options.configPath ?? join(process.cwd(), "model.yaml");
53
- const llmSection = loadLlmConfig(configPath);
54
- if (llmSection == null) return null;
55
- const resolved = await resolveLlmSectionWithNpm(llmSection, {
56
- installNpmIfMissing: options.installNpmIfMissing !== false,
57
- cwd: process.cwd()
58
- });
59
- const { defaultId, configs } = parseLlmSection(resolved);
60
- const defaultConfig = configs.find((c) => c.id === defaultId) ?? configs[0] ?? null;
61
- return defaultConfig;
23
+ // src/api/create-agent-model-registry.ts
24
+ import { existsSync } from "fs";
25
+ import { dirname, resolve } from "path";
26
+ import { fileURLToPath } from "url";
27
+ import { OpenAIEmbeddings } from "@langchain/openai";
28
+ import { deepMerge } from "@easynet/agent-common";
29
+ function resolveEmbeddedConfigPath() {
30
+ const moduleDir = dirname(fileURLToPath(import.meta.url));
31
+ const candidates = [
32
+ resolve(moduleDir, "../../config/model.yaml"),
33
+ resolve(moduleDir, "../../model.yaml")
34
+ ];
35
+ const found = candidates.find((candidate) => existsSync(candidate));
36
+ if (found) return found;
37
+ throw new Error(`createAgentModelRegistry failed: embedded model.yaml not found. Tried: ${candidates.join(", ")}`);
62
38
  }
63
-
64
- // src/api/get-default-vlm-config.ts
65
- import { join as join2 } from "path";
66
- async function getDefaultVlmConfig(options = {}) {
67
- const configPath = options.configPath ?? join2(process.cwd(), "model.yaml");
68
- const modelConfig = loadModelConfig(configPath);
69
- if (modelConfig == null) return null;
70
- const sourceSection = modelConfig.vlm ?? modelConfig.llm;
39
+ function normalizeOptions(configPathOrOptions) {
40
+ if (configPathOrOptions == null) return {};
41
+ if (typeof configPathOrOptions === "string") return { configPath: configPathOrOptions };
42
+ return configPathOrOptions;
43
+ }
44
+ function ensureConfig(path) {
45
+ const loaded = loadModelConfig(path);
46
+ if (!loaded) {
47
+ throw new Error(`createAgentModelRegistry failed: config file not found: ${path}`);
48
+ }
49
+ return loaded;
50
+ }
51
+ function applyDefaultToolChoice(model) {
52
+ const m = model;
53
+ const orig = m.bindTools?.bind(model);
54
+ if (!orig) return;
55
+ m.bindTools = function(tools, opts) {
56
+ return orig(tools, { ...opts, tool_choice: "auto" });
57
+ };
58
+ }
59
+ var CIS_DEFAULT_RESOLVE_HOST = "s0010-ml-https.s0010.us-west-2.awswd";
60
+ var CIS_DEFAULT_RESOLVE_IP = "10.210.98.124";
61
+ function buildEndpointConnectivityOptions(config) {
62
+ const opts = config.options ?? config;
63
+ const provider = typeof config.provider === "string" ? config.provider : "";
64
+ const baseURL = config.baseURL;
65
+ const isCis = provider === "cis" || provider.includes("cis");
66
+ const useCisDefault = isCis && baseURL.includes(CIS_DEFAULT_RESOLVE_HOST) && opts?.resolveHost == null;
67
+ 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;
68
+ const host = typeof opts?.host === "string" ? opts.host : resolveHost ? resolveHost.from : void 0;
69
+ if (resolveHost == null && host == null) return void 0;
70
+ const verifySSL = opts?.verifySSL === true;
71
+ const bypassAuth = opts?.bypassAuth !== false;
72
+ return {
73
+ resolveHost,
74
+ host,
75
+ verifySSL: resolveHost != null ? false : verifySSL ? true : void 0,
76
+ bypassAuth: bypassAuth ? true : void 0,
77
+ featureKey: typeof opts?.featureKey === "string" ? opts.featureKey : void 0
78
+ };
79
+ }
80
+ async function ensureConnectivity(resolvedLlmSection, options) {
81
+ let configs;
82
+ try {
83
+ const parsed = parseLlmSection(resolvedLlmSection ?? null);
84
+ configs = parsed.configs.filter(
85
+ (c) => typeof c.baseURL === "string" && c.baseURL.length > 0 && (c.baseURL.startsWith("http://") || c.baseURL.startsWith("https://")) && !c.baseURL.includes("${")
86
+ );
87
+ } catch {
88
+ return;
89
+ }
90
+ if (options.checkConnectivity === false || configs.length === 0) return;
91
+ const report = (status) => options.onConnectionStatus?.(status);
92
+ const timeoutMs = options.connectivityTimeoutMs ?? 8e3;
93
+ for (const config of configs) {
94
+ const { id, baseURL } = config;
95
+ report({
96
+ phase: "checking",
97
+ endpointId: id,
98
+ baseURL,
99
+ message: "Checking connection..."
100
+ });
101
+ const endpointOpts = buildEndpointConnectivityOptions(config);
102
+ const result = await checkEndpointConnectivity(baseURL, {
103
+ timeoutMs,
104
+ ...endpointOpts
105
+ });
106
+ if (result.reachable) {
107
+ report({
108
+ phase: "reachable",
109
+ endpointId: id,
110
+ baseURL,
111
+ message: result.message ?? "Connected"
112
+ });
113
+ } else {
114
+ report({
115
+ phase: "unreachable",
116
+ endpointId: id,
117
+ baseURL,
118
+ message: result.message ?? "Unreachable"
119
+ });
120
+ throw new Error(buildUnreachableError(id, baseURL, result.message));
121
+ }
122
+ }
123
+ }
124
+ async function resolveDefaultVlmConfig(merged, options = {}) {
125
+ const sourceSection = merged.vlm ?? merged.llm;
71
126
  if (sourceSection == null) return null;
72
127
  const resolved = await resolveLlmSectionWithNpm(sourceSection, {
73
128
  installNpmIfMissing: options.installNpmIfMissing !== false,
@@ -76,64 +131,91 @@ async function getDefaultVlmConfig(options = {}) {
76
131
  const { defaultId, configs } = parseLlmSection(resolved);
77
132
  const imageConfigs = configs.filter((c) => c.type === "image");
78
133
  if (imageConfigs.length === 0) return null;
79
- const defaultConfig = imageConfigs.find((c) => c.id === defaultId) ?? imageConfigs[0] ?? null;
80
- return defaultConfig;
134
+ const targetId = options.modelId ?? defaultId;
135
+ return imageConfigs.find((c) => c.id === targetId) ?? imageConfigs[0] ?? null;
81
136
  }
82
-
83
- // src/api/create-embed-fn.ts
84
- function createEmbedFnFromModelsConfig(configPath, embedId) {
85
- const config = loadModelConfig(configPath);
86
- if (!config?.embed) return void 0;
87
- const parsed = parseEmbedSection(config.embed);
88
- if (parsed.configs.length === 0) return void 0;
137
+ function resolveEmbedConfig(merged, embedId) {
138
+ if (!merged.embed) return null;
139
+ const parsed = parseEmbedSection(merged.embed);
140
+ if (parsed.configs.length === 0) return null;
89
141
  const id = embedId ?? parsed.defaultId;
90
- const embedConfig = parsed.configs.find((c) => c.id === id) ?? parsed.configs[0];
91
- if (!embedConfig) return void 0;
92
- const hub = createModelHub({
93
- embeddingBaseURL: embedConfig.baseURL,
94
- embeddingModel: embedConfig.model,
95
- embeddingApiKey: embedConfig.apiKey
142
+ return parsed.configs.find((c) => c.id === id) ?? parsed.configs[0] ?? null;
143
+ }
144
+ function createLangChainEmbeddingModelFromConfig(config) {
145
+ const opts = config.options ?? {};
146
+ const baseURLRaw = typeof config.baseURL === "string" ? config.baseURL : void 0;
147
+ const baseURL = typeof baseURLRaw === "string" && baseURLRaw.length > 0 ? baseURLRaw.replace(/\/$/, "").endsWith("/v1") ? baseURLRaw : `${baseURLRaw.replace(/\/$/, "")}/v1` : void 0;
148
+ const apiKey = typeof config.apiKey === "string" && config.apiKey.length > 0 ? config.apiKey : "not-needed";
149
+ const timeout = typeof opts.timeoutMs === "number" ? opts.timeoutMs : void 0;
150
+ const dimensions = typeof opts.dimensions === "number" ? opts.dimensions : void 0;
151
+ return new OpenAIEmbeddings({
152
+ model: typeof config.model === "string" && config.model.length > 0 ? config.model : "text-embedding-3-small",
153
+ ...dimensions != null ? { dimensions } : {},
154
+ ...timeout != null ? { timeout } : {},
155
+ apiKey,
156
+ ...baseURL ? { configuration: { baseURL } } : {}
96
157
  });
97
- return async (input) => {
98
- const result = await hub.embed({ input });
99
- return result.vectors;
158
+ }
159
+ async function createAgentModelRegistry(configPathOrOptions) {
160
+ const options = normalizeOptions(configPathOrOptions);
161
+ const embeddedConfigPath = resolveEmbeddedConfigPath();
162
+ const base = ensureConfig(embeddedConfigPath);
163
+ const override = options.configPath ? ensureConfig(resolve(process.cwd(), options.configPath)) : void 0;
164
+ const merged = override ? deepMerge({}, base, override) : base;
165
+ const resolveChatArgs = (idOrOptions, maybeOptions) => {
166
+ if (typeof idOrOptions === "string") return { id: idOrOptions, options: maybeOptions ?? {} };
167
+ return { id: void 0, options: idOrOptions ?? {} };
168
+ };
169
+ return {
170
+ async getChatModel(idOrOptions, maybeOptions) {
171
+ const { id, options: chatOptions } = resolveChatArgs(idOrOptions, maybeOptions);
172
+ if (merged.llm == null) {
173
+ throw new Error("createAgentModelRegistry failed: no llm section configured");
174
+ }
175
+ const resolvedSection = await resolveLlmSectionWithNpm(merged.llm, {
176
+ installNpmIfMissing: chatOptions.installNpmIfMissing !== false,
177
+ cwd: process.cwd()
178
+ });
179
+ const parsed = parseLlmSection(resolvedSection);
180
+ const chosenId = id ?? parsed.defaultId;
181
+ const config = parsed.configs.find((c) => c.id === chosenId) ?? parsed.configs[0];
182
+ if (!config) throw new Error("createAgentModelRegistry failed: no chat model configured");
183
+ const llmSection = { default: config.id, [config.id]: config };
184
+ const checkConnectivity = chatOptions.checkConnectivity ?? merged.runtime.check_connectivity;
185
+ await ensureConnectivity(llmSection, { ...chatOptions, checkConnectivity });
186
+ const model = createChatModelFromLlmConfig({ llmSection });
187
+ applyDefaultToolChoice(model);
188
+ return model;
189
+ },
190
+ getEmbeddingModel(embedId) {
191
+ const embedConfig = resolveEmbedConfig(merged, embedId);
192
+ if (!embedConfig) {
193
+ throw new Error("createAgentModelRegistry failed: no embed model configured");
194
+ }
195
+ return createLangChainEmbeddingModelFromConfig(embedConfig);
196
+ },
197
+ async getVlmChatModel(idOrOptions, maybeOptions) {
198
+ const { id, options: chatOptions } = resolveChatArgs(idOrOptions, maybeOptions);
199
+ const vlmConfig = await resolveDefaultVlmConfig(merged, {
200
+ installNpmIfMissing: chatOptions.installNpmIfMissing,
201
+ modelId: id
202
+ });
203
+ if (!vlmConfig) {
204
+ throw new Error("createAgentModelRegistry failed: no vlm/image model configured");
205
+ }
206
+ const section = {
207
+ default: vlmConfig.id,
208
+ [vlmConfig.id]: vlmConfig
209
+ };
210
+ const checkConnectivity = chatOptions.checkConnectivity ?? merged.runtime.check_connectivity;
211
+ await ensureConnectivity(section, { ...chatOptions, checkConnectivity });
212
+ const model = createChatModelFromLlmConfig({ llmSection: section });
213
+ applyDefaultToolChoice(model);
214
+ return model;
215
+ }
100
216
  };
101
217
  }
102
-
103
- // src/index.ts
104
- var modelApi = {
105
- createAgentLlm,
106
- getDefaultLlmConfig,
107
- getDefaultVlmConfig,
108
- createEmbedFnFromModelsConfig,
109
- createChatModelFromLlmConfig,
110
- applyToolChoiceAuto,
111
- registerChatModelProvider,
112
- getChatModelFactory
113
- };
114
- var platformApi = {
115
- config: config_exports,
116
- langchain: langchain_exports,
117
- model: model_exports,
118
- registry: registry_exports,
119
- extensions: extensions_exports,
120
- connectivity: connectivity_exports,
121
- npm: npm_exports,
122
- cli: cli_exports
123
- };
124
218
  export {
125
- applyToolChoiceAuto,
126
- createAgentLlm,
127
- createChatModelFromLlmConfig,
128
- createEmbedFnFromModelsConfig,
129
- createModelConfig,
130
- getChatModelFactory,
131
- getDefaultLlmConfig,
132
- getDefaultVlmConfig,
133
- loadModelRuntimeConfig,
134
- modelApi,
135
- normalizeAgentModelConfigRef,
136
- platformApi,
137
- registerChatModelProvider
219
+ createAgentModelRegistry
138
220
  };
139
221
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/get-default-llm-config.ts","../src/api/get-default-vlm-config.ts","../src/api/create-embed-fn.ts","../src/index.ts"],"sourcesContent":["/**\n * Load model.yaml, resolve npm providers, and return the default LLMConfig.\n * For use by CLIs (e.g. wallee-llm) that need config without creating a model.\n */\n\nimport { join } from \"node:path\";\nimport { loadLlmConfig } from \"../config/loader.js\";\nimport { parseLlmSection } from \"../config/parser.js\";\nimport { resolveLlmSectionWithNpm } from \"../extensions/npm-protocol.js\";\nimport type { LLMConfig } from \"../types.js\";\n\nexport interface GetDefaultLlmConfigOptions {\n /** Path to model.yaml. Default: process.cwd() + \"/model.yaml\" */\n configPath?: string;\n /** Install npm provider packages if missing. Default true. */\n installNpmIfMissing?: boolean;\n}\n\n/**\n * Returns the default LLM config from model.yaml (after resolving npm: providers), or null if no config file.\n */\nexport async function getDefaultLlmConfig(\n options: GetDefaultLlmConfigOptions = {}\n): Promise<LLMConfig | null> {\n const configPath = options.configPath ?? join(process.cwd(), \"model.yaml\");\n const llmSection = loadLlmConfig(configPath);\n if (llmSection == null) return null;\n\n const resolved = await resolveLlmSectionWithNpm(llmSection, {\n installNpmIfMissing: options.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n\n const { defaultId, configs } = parseLlmSection(resolved);\n const defaultConfig = configs.find((c: LLMConfig) => c.id === defaultId) ?? configs[0] ?? null;\n return defaultConfig;\n}\n","/**\n * Load model.yaml, resolve npm providers, and return a default VLM (type=image) config.\n */\n\nimport { join } from \"node:path\";\nimport { loadModelConfig } from \"../config/loader.js\";\nimport { parseLlmSection } from \"../config/parser.js\";\nimport { resolveLlmSectionWithNpm } from \"../extensions/npm-protocol.js\";\nimport type { LLMConfig } from \"../types.js\";\n\nexport interface GetDefaultVlmConfigOptions {\n /** Path to model.yaml. Default: process.cwd() + \"/model.yaml\" */\n configPath?: string;\n /** Install npm provider packages if missing. Default true. */\n installNpmIfMissing?: boolean;\n}\n\n/**\n * Returns the default VLM config (type=image) from model.yaml, or null if not configured.\n */\nexport async function getDefaultVlmConfig(\n options: GetDefaultVlmConfigOptions = {},\n): Promise<LLMConfig | null> {\n const configPath = options.configPath ?? join(process.cwd(), \"model.yaml\");\n const modelConfig = loadModelConfig(configPath);\n if (modelConfig == null) return null;\n\n // Prefer top-level `vlm:`. Fallback to `llm:` section with type=image entries.\n const sourceSection = modelConfig.vlm ?? modelConfig.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\n const { defaultId, configs } = parseLlmSection(resolved);\n const imageConfigs = configs.filter((c: LLMConfig) => c.type === \"image\");\n if (imageConfigs.length === 0) return null;\n\n const defaultConfig =\n imageConfigs.find((c: LLMConfig) => c.id === defaultId) ??\n imageConfigs[0] ??\n null;\n return defaultConfig;\n}\n","/**\n * Create an EmbedFn from the embed section of model.yaml.\n */\nimport { createModelHub } from \"../model/hub.js\";\nimport { parseEmbedSection } from \"../model/embed-parser.js\";\nimport { loadModelConfig } from \"../config/loader.js\";\n\nexport type EmbedFn = (input: string | string[]) => Promise<number[][]>;\n\n/**\n * Load model.yaml and build an EmbedFn from the `embed:` section.\n * Returns undefined if no embed section is configured.\n *\n * @param configPath - Path to model.yaml\n * @param embedId - Which embed instance to use (defaults to the `default:` key)\n */\nexport function createEmbedFnFromModelsConfig(\n configPath: string,\n embedId?: string,\n): EmbedFn | undefined {\n const config = loadModelConfig(configPath);\n if (!config?.embed) return undefined;\n\n const parsed = parseEmbedSection(config.embed);\n if (parsed.configs.length === 0) return undefined;\n\n const id = embedId ?? parsed.defaultId;\n const embedConfig =\n parsed.configs.find((c) => c.id === id) ?? parsed.configs[0];\n if (!embedConfig) return undefined;\n\n const hub = createModelHub({\n embeddingBaseURL: embedConfig.baseURL,\n embeddingModel: embedConfig.model,\n embeddingApiKey: embedConfig.apiKey,\n });\n\n return async (input: string | string[]) => {\n const result = await hub.embed({ input });\n return result.vectors;\n };\n}\n","/**\n * Minimal public API for @easynet/agent-model.\n * Goal: create a chat model from `model.yaml` with the smallest possible surface.\n */\n\n// Main high-level APIs\nexport { createAgentLlm } from \"./api/create-agent-llm.js\";\nexport type { CreateAgentLlmOptions } from \"./api/create-agent-llm.js\";\nexport { getDefaultLlmConfig } from \"./api/get-default-llm-config.js\";\nexport type { GetDefaultLlmConfigOptions } from \"./api/get-default-llm-config.js\";\nexport { getDefaultVlmConfig } from \"./api/get-default-vlm-config.js\";\nexport type { GetDefaultVlmConfigOptions } from \"./api/get-default-vlm-config.js\";\nexport { createEmbedFnFromModelsConfig } from \"./api/create-embed-fn.js\";\nexport type { EmbedFn } from \"./api/create-embed-fn.js\";\nexport type { AgentModelConfigRef } from \"./config/index.js\";\nexport {\n normalizeAgentModelConfigRef,\n loadModelRuntimeConfig,\n createModelConfig,\n} from \"./config/index.js\";\nexport type { LoadModelConfigOptions, CreateModelConfigOptions } from \"./config/index.js\";\n\n// Common runtime helper (used by agent-runtime)\nexport { createChatModelFromLlmConfig } from \"./langchain/index.js\";\nexport type { CreateChatModelOptions } from \"./langchain/index.js\";\nexport { applyToolChoiceAuto } from \"./langchain/index.js\";\n\n// Provider extension registration\nexport { registerChatModelProvider, getChatModelFactory } from \"./registry/chat-model.js\";\nexport type { ChatModelFactory } from \"./registry/chat-model.js\";\n\nimport { createAgentLlm } from \"./api/create-agent-llm.js\";\nimport { getDefaultLlmConfig } from \"./api/get-default-llm-config.js\";\nimport { getDefaultVlmConfig } from \"./api/get-default-vlm-config.js\";\nimport { createEmbedFnFromModelsConfig } from \"./api/create-embed-fn.js\";\nimport { createChatModelFromLlmConfig, applyToolChoiceAuto } from \"./langchain/index.js\";\nimport { registerChatModelProvider, getChatModelFactory } from \"./registry/chat-model.js\";\nimport * as ConfigApi from \"./config/index.js\";\nimport * as LangChainApi from \"./langchain/index.js\";\nimport * as ModelApi from \"./model/index.js\";\nimport * as RegistryApi from \"./registry/index.js\";\nimport * as ExtensionsApi from \"./extensions/index.js\";\nimport * as ConnectivityApi from \"./connectivity/index.js\";\nimport * as NpmApi from \"./npm/index.js\";\nimport * as CliApi from \"./cli/index.js\";\n\n/**\n * Facade: high-frequency model APIs with a single import.\n */\nexport const modelApi = {\n createAgentLlm,\n getDefaultLlmConfig,\n getDefaultVlmConfig,\n createEmbedFnFromModelsConfig,\n createChatModelFromLlmConfig,\n applyToolChoiceAuto,\n registerChatModelProvider,\n getChatModelFactory,\n} as const;\n\n/**\n * Facade: grouped subpath modules (config/langchain/model/registry/extensions/connectivity/npm/cli).\n */\nexport const platformApi = {\n config: ConfigApi,\n langchain: LangChainApi,\n model: ModelApi,\n registry: RegistryApi,\n extensions: ExtensionsApi,\n connectivity: ConnectivityApi,\n npm: NpmApi,\n cli: CliApi,\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,SAAS,YAAY;AAgBrB,eAAsB,oBACpB,UAAsC,CAAC,GACZ;AAC3B,QAAM,aAAa,QAAQ,cAAc,KAAK,QAAQ,IAAI,GAAG,YAAY;AACzE,QAAM,aAAa,cAAc,UAAU;AAC3C,MAAI,cAAc,KAAM,QAAO;AAE/B,QAAM,WAAW,MAAM,yBAAyB,YAAY;AAAA,IAC1D,qBAAqB,QAAQ,wBAAwB;AAAA,IACrD,KAAK,QAAQ,IAAI;AAAA,EACnB,CAAC;AAED,QAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB,QAAQ;AACvD,QAAM,gBAAgB,QAAQ,KAAK,CAAC,MAAiB,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,KAAK;AAC1F,SAAO;AACT;;;AChCA,SAAS,QAAAA,aAAY;AAgBrB,eAAsB,oBACpB,UAAsC,CAAC,GACZ;AAC3B,QAAM,aAAa,QAAQ,cAAcC,MAAK,QAAQ,IAAI,GAAG,YAAY;AACzE,QAAM,cAAc,gBAAgB,UAAU;AAC9C,MAAI,eAAe,KAAM,QAAO;AAGhC,QAAM,gBAAgB,YAAY,OAAO,YAAY;AACrD,MAAI,iBAAiB,KAAM,QAAO;AAElC,QAAM,WAAW,MAAM,yBAAyB,eAAe;AAAA,IAC7D,qBAAqB,QAAQ,wBAAwB;AAAA,IACrD,KAAK,QAAQ,IAAI;AAAA,EACnB,CAAC;AAED,QAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB,QAAQ;AACvD,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAiB,EAAE,SAAS,OAAO;AACxE,MAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,QAAM,gBACJ,aAAa,KAAK,CAAC,MAAiB,EAAE,OAAO,SAAS,KACtD,aAAa,CAAC,KACd;AACF,SAAO;AACT;;;AC7BO,SAAS,8BACd,YACA,SACqB;AACrB,QAAM,SAAS,gBAAgB,UAAU;AACzC,MAAI,CAAC,QAAQ,MAAO,QAAO;AAE3B,QAAM,SAAS,kBAAkB,OAAO,KAAK;AAC7C,MAAI,OAAO,QAAQ,WAAW,EAAG,QAAO;AAExC,QAAM,KAAK,WAAW,OAAO;AAC7B,QAAM,cACJ,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,QAAQ,CAAC;AAC7D,MAAI,CAAC,YAAa,QAAO;AAEzB,QAAM,MAAM,eAAe;AAAA,IACzB,kBAAkB,YAAY;AAAA,IAC9B,gBAAgB,YAAY;AAAA,IAC5B,iBAAiB,YAAY;AAAA,EAC/B,CAAC;AAED,SAAO,OAAO,UAA6B;AACzC,UAAM,SAAS,MAAM,IAAI,MAAM,EAAE,MAAM,CAAC;AACxC,WAAO,OAAO;AAAA,EAChB;AACF;;;ACQO,IAAM,WAAW;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,cAAc;AAAA,EACzB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,KAAK;AAAA,EACL,KAAK;AACP;","names":["join","join"]}
1
+ {"version":3,"sources":["../src/api/create-agent-model-registry.ts"],"sourcesContent":["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 ];\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":"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","names":[]}
@@ -1,10 +1,9 @@
1
1
  import {
2
2
  applyToolChoiceAuto,
3
3
  createChatModelFromLlmConfig
4
- } from "../chunk-CCGNXMFC.js";
5
- import "../chunk-SPDXNDDD.js";
4
+ } from "../chunk-6EQCGQTV.js";
6
5
  import "../chunk-G7MKWPEI.js";
7
- import "../chunk-PZ5AY32C.js";
6
+ import "../chunk-SPDXNDDD.js";
8
7
  export {
9
8
  applyToolChoiceAuto,
10
9
  createChatModelFromLlmConfig