@easynet/agent-llm 1.0.36 → 1.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,93 +1,60 @@
1
1
  # @easynet/agent-llm
2
2
 
3
- Load an LLM from **llm.yaml** for CLI or LangChain. Releases are automated via semantic-release on push to `master`.
3
+ 最小目标:从 `llm.yaml` 创建一个可直接给 LangChain 使用的 ChatModel。
4
4
 
5
- **Extensible:** define your own extension (implement `ILLMExtension`).
5
+ ## 最小接口
6
6
 
7
- ---
7
+ ```ts
8
+ import { createAgentLlM } from "@easynet/agent-llm";
9
+
10
+ const llm = await createAgentLlM();
11
+ const result = await llm.invoke("hello");
12
+ console.log(result.content);
13
+ ```
8
14
 
9
- ## Quick start
15
+ ## 最小 YAML(推荐先用这个)
10
16
 
11
- **1.** Add `llm.yaml` in your project root:
17
+ `llm.yaml`
12
18
 
13
19
  ```yaml
14
20
  llm:
21
+ # 默认使用 small 这个实例
15
22
  default: small
23
+
24
+ # 可按需保留 strong;不需要就删掉
16
25
  strong:
17
- provider: npm:@scope/package-name@1.0.0#provider-name
18
- base_url: https://your-api.example.com
19
- model: your-model
26
+ provider: openai
27
+ base_url: ${LLM_BASE_URL}
28
+ model: ${LLM_MODEL}
29
+
30
+ # 本地 Ollama 最常见配置
20
31
  small:
21
32
  provider: openai
22
33
  base_url: http://localhost:11434/v1
23
34
  model: qwen3:0.6b
24
35
  ```
25
36
 
26
- **2.** Run:
27
-
28
- ```bash
29
- npx @easynet/agent-llm "your prompt"
30
- ```
31
-
32
- ---
33
-
34
- ## LangChain agent
35
-
36
- 1. **Get the LLM** (async; resolves `npm:` providers and installs packages if needed):
37
+ ## 最简单示例(带注释)
37
38
 
38
39
  ```ts
39
40
  import { createAgentLlM } from "@easynet/agent-llm";
40
41
 
41
- const llm = await createAgentLlM();
42
- ```
43
-
44
- 2. **Build the agent** with LangChain's `createAgent` and tools:
45
-
46
- ```ts
47
- import { createAgent, tool } from "langchain";
48
- import { z } from "zod";
49
-
50
- const add = tool(
51
- (input: { a: number; b: number }) => String(input.a + input.b),
52
- { name: "add", description: "Add two numbers.", schema: z.object({ a: z.number(), b: z.number() }) }
53
- );
54
-
55
- const agent = createAgent({
56
- model: llm as unknown as Parameters<typeof createAgent>[0]["model"],
57
- tools: [add],
58
- });
59
- ```
42
+ async function main() {
43
+ // 1) 从当前目录 llm.yaml 读取配置并创建模型
44
+ const llm = await createAgentLlM();
60
45
 
61
- 3. **Invoke** with messages:
46
+ // 2) 直接调用模型
47
+ const response = await llm.invoke("请用一句话介绍你自己。");
62
48
 
63
- ```ts
64
- import { HumanMessage } from "@langchain/core/messages";
49
+ // 3) 输出文本
50
+ console.log(response.content);
51
+ }
65
52
 
66
- const result = await agent.invoke({ messages: [new HumanMessage("What is 10 + 20?")] });
67
- console.log(result.messages?.slice(-1)[0]?.content);
53
+ main().catch(console.error);
68
54
  ```
69
55
 
70
- Full runnable example: [examples/langchain-react-agent.ts](examples/langchain-react-agent.ts).
71
-
72
- ---
73
-
74
- ## npm provider protocol
75
-
76
- Use a provider from an **npm package**. If the package is missing, the framework can install it and then load the provider.
77
-
78
- - **Version handling:** You can omit the version or use `@latest`. The framework **never** passes `latest` to `npm install`. It always resolves the current latest version from the registry and uses that version number, and will upgrade an already-installed package when it is not the latest. For reproducible installs, prefer a pinned version (e.g. `npm:@scope/package-name@1.2.3#provider-name`).
79
-
80
- Example in a named entry:
81
-
82
- ```yaml
83
- strong:
84
- provider: "npm:@scope/package-name@1.2.3#provider-name" # pinned; or omit version / use @latest to auto-resolve latest
85
- base_url: https://your-api.example.com
86
- model: your-model
87
- ```
88
-
89
- ---
90
-
91
- ## License
56
+ ## 可选扩展
92
57
 
93
- MIT · [GitHub](https://github.com/easynet-world/agent-llm)
58
+ - 自定义 provider:`registerChatModelProvider(...)`
59
+ - 只取默认模型配置:`getDefaultLlmConfig(...)`
60
+ - 直接从对象构建模型:`createChatModelFromLlmConfig(...)`
@@ -1,46 +1,10 @@
1
- // src/config/loader.ts
2
- import { loadYamlFileSync, parseYamlContent } from "@easynet/agent-common";
3
- function substituteEnv(obj) {
4
- if (obj === null || obj === void 0) return obj;
5
- if (typeof obj === "string") {
6
- const m = obj.match(/^\$\{(\w+)\}$/);
7
- return m ? process.env[m[1]] ?? obj : obj;
8
- }
9
- if (Array.isArray(obj)) return obj.map(substituteEnv);
10
- if (typeof obj === "object") {
11
- const out = {};
12
- for (const [k, v] of Object.entries(obj)) out[k] = substituteEnv(v);
13
- return out;
14
- }
15
- return obj;
16
- }
17
- function parseLlmYaml(content, options = {}) {
18
- const { substituteEnv: doSub = true } = options;
19
- const parsed = parseYamlContent(content, {
20
- substituteEnv: doSub,
21
- missingEnv: "keep"
22
- });
23
- const llm = parsed?.llm;
24
- if (llm == null) return void 0;
25
- return llm;
1
+ // src/registry/chat-model.ts
2
+ var CHAT_MODEL_FACTORIES = /* @__PURE__ */ new Map();
3
+ function registerChatModelProvider(providerName, factory) {
4
+ CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);
26
5
  }
27
- function loadLlmConfig(filePath, options = {}) {
28
- if (typeof filePath !== "string" || filePath.trim().length === 0) {
29
- throw new Error("agent-llm: loadLlmConfig requires a non-empty file path");
30
- }
31
- try {
32
- const parsed = loadYamlFileSync(filePath, {
33
- substituteEnv: options.substituteEnv !== false,
34
- missingEnv: "keep",
35
- cache: true
36
- });
37
- if (parsed == null) return null;
38
- const llm = parsed.llm;
39
- return llm ?? null;
40
- } catch (e) {
41
- const msg = e instanceof Error ? e.message : String(e);
42
- throw new Error(`agent-llm: failed to parse config file ${filePath}: ${msg}`, { cause: e });
43
- }
6
+ function getChatModelFactory(providerName) {
7
+ return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());
44
8
  }
45
9
 
46
10
  // src/langchain/openai-compatible.ts
@@ -68,15 +32,6 @@ function createChatOpenAI(options) {
68
32
  });
69
33
  }
70
34
 
71
- // src/registry/chat-model.ts
72
- var CHAT_MODEL_FACTORIES = /* @__PURE__ */ new Map();
73
- function registerChatModelProvider(providerName, factory) {
74
- CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);
75
- }
76
- function getChatModelFactory(providerName) {
77
- return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());
78
- }
79
-
80
35
  // src/langchain/index.ts
81
36
  import { parseLlmSection } from "@easynet/agent-common";
82
37
  var DEFAULT_MODEL = "gpt-4o-mini";
@@ -146,6 +101,35 @@ function createChatModelFromLlmConfig(options = {}) {
146
101
  // src/types.ts
147
102
  var AGENT_LLM_PROVIDER_FIELD = "agentLlmProvider";
148
103
 
104
+ // src/config/loader.ts
105
+ import { loadYamlFileSync, parseYamlContent } from "@easynet/agent-common";
106
+ function loadLlmConfig(filePath, options = {}) {
107
+ if (typeof filePath !== "string" || filePath.trim().length === 0) {
108
+ throw new Error("agent-llm: loadLlmConfig requires a non-empty file path");
109
+ }
110
+ try {
111
+ const parsed = loadYamlFileSync(filePath, {
112
+ substituteEnv: options.substituteEnv !== false,
113
+ missingEnv: "keep",
114
+ cache: true
115
+ });
116
+ if (parsed == null) return null;
117
+ const llm = parsed.llm;
118
+ return llm ?? null;
119
+ } catch (e) {
120
+ const msg = e instanceof Error ? e.message : String(e);
121
+ throw new Error(`agent-llm: failed to parse config file ${filePath}: ${msg}`, { cause: e });
122
+ }
123
+ }
124
+
125
+ // src/api/create-agent-llm.ts
126
+ import { join as join2 } from "path";
127
+ import {
128
+ checkEndpointConnectivity,
129
+ buildUnreachableError,
130
+ parseLlmSection as parseLlmSection2
131
+ } from "@easynet/agent-common";
132
+
149
133
  // src/extensions/loader.ts
150
134
  import { readdirSync, readFileSync, existsSync } from "fs";
151
135
  import { createRequire } from "module";
@@ -178,57 +162,6 @@ function getExtensionFromModule(m) {
178
162
  if (isLLMExtension(m.default)) return m.default;
179
163
  return null;
180
164
  }
181
- function resolveLLMExtensionPackages(types) {
182
- if (types == null) return [];
183
- const typeList = Array.isArray(types) ? types : [types];
184
- return typeList.filter(
185
- (t) => typeof t === "string" && String(t).trim().length > 0
186
- );
187
- }
188
- function readPackageProviderName(pkgPath) {
189
- if (!existsSync(pkgPath)) return null;
190
- try {
191
- const raw = readFileSync(pkgPath, "utf-8");
192
- const pkg = JSON.parse(raw);
193
- const declared = pkg[AGENT_LLM_PROVIDER_FIELD] === true || Array.isArray(pkg.keywords) && pkg.keywords.includes("agent-llm-provider");
194
- return declared && typeof pkg.name === "string" ? pkg.name : null;
195
- } catch {
196
- return null;
197
- }
198
- }
199
- function discoverLLMExtensions(cwd = process.cwd()) {
200
- const dir = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : process.cwd();
201
- const nodeModules = join(dir, "node_modules");
202
- if (!existsSync(nodeModules)) return [];
203
- const names = [];
204
- const seen = /* @__PURE__ */ new Set();
205
- try {
206
- const entries = readdirSync(nodeModules, { withFileTypes: true });
207
- for (const e of entries) {
208
- if (e.name.startsWith(".") || e.name === "node") continue;
209
- if (e.name.startsWith("@") && e.isDirectory()) {
210
- const scopePath = join(nodeModules, e.name);
211
- const scopeEntries = readdirSync(scopePath, { withFileTypes: true });
212
- for (const se of scopeEntries) {
213
- if (!se.isDirectory()) continue;
214
- const name2 = readPackageProviderName(join(scopePath, se.name, "package.json"));
215
- if (name2 && !seen.has(name2)) {
216
- seen.add(name2);
217
- names.push(name2);
218
- }
219
- }
220
- continue;
221
- }
222
- const name = readPackageProviderName(join(nodeModules, e.name, "package.json"));
223
- if (name && !seen.has(name)) {
224
- seen.add(name);
225
- names.push(name);
226
- }
227
- }
228
- } catch {
229
- }
230
- return names;
231
- }
232
165
  async function loadModuleFromPath(pkgDir) {
233
166
  const pkgJsonPath = join(pkgDir, "package.json");
234
167
  if (!existsSync(pkgJsonPath)) {
@@ -334,12 +267,6 @@ async function loadLLMExtensions(extensionPackages, options) {
334
267
  }
335
268
  }
336
269
  }
337
- async function loadDiscoveredExtensions(cwd = process.cwd()) {
338
- const dir = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : process.cwd();
339
- const names = discoverLLMExtensions(dir);
340
- await loadLLMExtensions(names);
341
- return names;
342
- }
343
270
 
344
271
  // src/extensions/npm-protocol.ts
345
272
  import {
@@ -350,12 +277,6 @@ import {
350
277
  getInstalledVersion as getInstalledVersionFromCommon,
351
278
  ensureNpmPackageInstalled as ensureNpmPackageInstalledFromCommon
352
279
  } from "@easynet/agent-common/npm";
353
- async function getLatestVersion(packageName, options = {}) {
354
- return resolveLatestVersionFromRegistry(packageName, { cwd: options.cwd ?? process.cwd() });
355
- }
356
- function getInstalledVersion(packageName, options = {}) {
357
- return getInstalledVersionFromCommon(packageName, options);
358
- }
359
280
  function isModuleNotFoundError(err) {
360
281
  const msg = err instanceof Error ? err.message : String(err);
361
282
  return msg.includes("Cannot find module") || msg.includes("Cannot find package") || msg.includes("MODULE_NOT_FOUND") || msg.includes("ERR_MODULE_NOT_FOUND") || msg.includes("Failed to load url") || msg.includes("Does the file exist");
@@ -459,29 +380,8 @@ async function resolveLlmSectionWithNpm(llmSection, options = {}) {
459
380
  }
460
381
  return llmSection;
461
382
  }
462
- async function createChatModelWithNpm(options = {}) {
463
- try {
464
- const { installNpmIfMissing, cwd, ...rest } = options;
465
- const resolvedSection = await resolveLlmSectionWithNpm(options.llmSection ?? null, {
466
- installNpmIfMissing,
467
- cwd
468
- });
469
- return createChatModelFromLlmConfig({
470
- ...rest,
471
- llmSection: resolvedSection
472
- });
473
- } catch (e) {
474
- throw normalizeError2(e, "createChatModelWithNpm failed");
475
- }
476
- }
477
383
 
478
384
  // src/api/create-agent-llm.ts
479
- import { join as join2 } from "path";
480
- import {
481
- checkEndpointConnectivity,
482
- buildUnreachableError,
483
- parseLlmSection as parseLlmSection2
484
- } from "@easynet/agent-common";
485
385
  var CIS_DEFAULT_RESOLVE_HOST = "s0010-ml-https.s0010.us-west-2.awswd";
486
386
  var CIS_DEFAULT_RESOLVE_IP = "10.210.98.124";
487
387
  function buildEndpointConnectivityOptions(config) {
@@ -601,29 +501,15 @@ function exitWithError(err, code = 1) {
601
501
  }
602
502
 
603
503
  export {
604
- substituteEnv,
605
- parseLlmYaml,
606
- loadLlmConfig,
607
- createChatOpenAI,
608
504
  registerChatModelProvider,
609
505
  getChatModelFactory,
506
+ createChatOpenAI,
610
507
  createChatModelFromLlmConfig,
611
508
  AGENT_LLM_PROVIDER_FIELD,
612
- resolveLLMExtensionPackages,
613
- discoverLLMExtensions,
614
- loadLLMExtensions,
615
- loadDiscoveredExtensions,
616
- NPM_PROTOCOL_PREFIX,
617
- parseNpmProviderSpec,
618
- isNpmProviderSpec,
619
- getLatestVersion,
620
- getInstalledVersion,
621
- ensureNpmPackageInstalled,
622
- resolveNpmProvider,
623
509
  resolveLlmSectionWithNpm,
624
- createChatModelWithNpm,
510
+ loadLlmConfig,
625
511
  createAgentLlM,
626
512
  messageContentToString,
627
513
  exitWithError
628
514
  };
629
- //# sourceMappingURL=chunk-POJY4YYJ.js.map
515
+ //# sourceMappingURL=chunk-OTF3KU7L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry/chat-model.ts","../src/langchain/openai-compatible.ts","../src/langchain/index.ts","../src/types.ts","../src/config/loader.ts","../src/api/create-agent-llm.ts","../src/extensions/loader.ts","../src/extensions/npm-protocol.ts","../src/cli/utils.ts"],"sourcesContent":["/**\n * Registry for LangChain ChatModel by provider name.\n * Extensions register via registerChatModelProvider.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { LLMConfig } from \"@easynet/agent-common\";\n\nexport type ChatModelFactory = (config: LLMConfig) => BaseChatModel;\n\nconst CHAT_MODEL_FACTORIES = new Map<string, ChatModelFactory>();\n\nexport function registerChatModelProvider(providerName: string, factory: ChatModelFactory): void {\n CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);\n}\n\nexport function getChatModelFactory(providerName: string): ChatModelFactory | undefined {\n return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());\n}\n","/**\n * Create ChatOpenAI from config - works with any OpenAI-compatible provider.\n * This is the ONLY place we create ChatOpenAI instances.\n */\n\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { Agent } from \"node:http\";\n\nexport interface CreateChatOpenAIOptions {\n baseURL?: string;\n model: string;\n temperature?: number;\n apiKey?: string;\n defaultHeaders?: Record<string, string>;\n defaultQuery?: Record<string, string>;\n httpAgent?: Agent;\n}\n\n/**\n * Create ChatOpenAI from options.\n * Works with OpenAI and any OpenAI-compatible endpoint (CIS, Ollama, etc.).\n */\nexport function createChatOpenAI(options: CreateChatOpenAIOptions): BaseChatModel {\n const {\n baseURL,\n model,\n temperature = 0,\n apiKey,\n defaultHeaders,\n defaultQuery,\n httpAgent,\n } = options;\n\n const config: {\n baseURL?: string;\n defaultHeaders?: Record<string, string>;\n defaultQuery?: Record<string, string>;\n httpAgent?: Agent;\n } = {};\n\n if (baseURL) config.baseURL = baseURL;\n if (defaultHeaders) config.defaultHeaders = defaultHeaders;\n if (defaultQuery) config.defaultQuery = defaultQuery;\n if (httpAgent) config.httpAgent = httpAgent;\n\n return new ChatOpenAI({\n model,\n temperature,\n ...(apiKey ? { apiKey } : {}),\n ...(Object.keys(config).length > 0 ? { configuration: config } : {}),\n });\n}\n","/**\n * Simple LangChain module: create ChatOpenAI from llm config.\n * Extensions can register custom ChatModel factories via the registry.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { parseLlmSection } from \"@easynet/agent-common\";\nimport type { LLMConfig } from \"@easynet/agent-common\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\nimport { createChatOpenAI } from \"./openai-compatible.js\";\nimport type { Agent } from \"node:http\";\n\nconst DEFAULT_MODEL = \"gpt-4o-mini\";\n\nexport interface CreateChatModelOptions {\n llmSection?: unknown;\n modelEnv?: string;\n apiKeyEnv?: 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\n/**\n * Create a LangChain ChatModel from agent config llm section.\n * Uses extension-registered factory when available; otherwise creates ChatOpenAI.\n */\nexport function createChatModelFromLlmConfig(\n options: CreateChatModelOptions = {}\n): BaseChatModel {\n const { llmSection, modelEnv, apiKeyEnv } = options;\n\n let defaultId: string;\n let configs: LLMConfig[];\n\n try {\n const parsed = parseLlmSection(llmSection ?? null);\n defaultId = parsed.defaultId;\n configs = parsed.configs;\n } catch (e) {\n throw normalizeError(e, \"Failed to parse llm section\");\n }\n\n const config = configs.find((c) => c.id === defaultId) ?? configs[0];\n\n // No config? Use default OpenAI\n if (!config) {\n const model = modelEnv ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n const apiKey = apiKeyEnv ?? process.env.OPENAI_API_KEY;\n\n return createChatOpenAI({\n model,\n temperature: 0,\n ...(apiKey ? { apiKey } : {}),\n });\n }\n\n // Check for registered custom factory\n const provider = config.provider ?? \"openai\";\n const factory = getChatModelFactory(provider);\n\n if (factory) {\n try {\n return factory({\n ...config,\n model: modelEnv ?? config.model ?? DEFAULT_MODEL,\n temperature: typeof config.temperature === \"number\" ? config.temperature : 0,\n });\n } catch (e) {\n throw normalizeError(e, `Failed to create ChatModel for provider \"${provider}\"`);\n }\n }\n\n // Create standard ChatOpenAI for OpenAI-compatible provider\n const model = modelEnv ?? config.model ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n let apiKey = apiKeyEnv ?? config.apiKey ?? process.env.OPENAI_API_KEY;\n let baseURL = config.baseURL;\n\n // Ensure baseURL ends with /v1\n if (baseURL && !baseURL.replace(/\\/$/, \"\").endsWith(\"/v1\")) {\n baseURL = baseURL.replace(/\\/$/, \"\") + \"/v1\";\n }\n\n // For local providers without API keys, use a placeholder\n if (baseURL && !apiKey) {\n apiKey = \"not-needed\";\n }\n\n const temperature = typeof config.temperature === \"number\" ? config.temperature : 0;\n\n // Extract options\n const opts = config.options as Record<string, unknown> | undefined;\n const defaultHeaders = opts?.defaultHeaders as Record<string, string> | undefined;\n const defaultQuery = opts?.defaultQuery as Record<string, string> | undefined;\n const httpAgent = opts?.httpAgent as Agent | undefined;\n\n return createChatOpenAI({\n model,\n temperature,\n baseURL,\n apiKey,\n defaultHeaders,\n defaultQuery,\n httpAgent,\n });\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// Re-export common LLM types (no LangChain) so consumers can import from @easynet/agent-llm\nexport type { LLMType, LLMConfig, AgentConfigLlmSection } from \"@easynet/agent-common\";\n\n/** package.json field: when true, the package is an agent-llm provider (for discovery). */\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(\"@easynet/agent-common\").LLMConfig) => BaseChatModel;\n /** Legacy: if extension provides register(), framework calls it. */\n register?(): void;\n}\n","/**\n * Load and parse LLM config from YAML (e.g. llm.yaml).\n * Supports ${VAR} substitution from process.env.\n */\nimport { loadYamlFileSync, parseYamlContent } from \"@easynet/agent-common\";\n\nexport interface LoadLlmConfigOptions {\n substituteEnv?: boolean;\n}\n\nexport function substituteEnv(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === \"string\") {\n const m = obj.match(/^\\$\\{(\\w+)\\}$/);\n return m ? (process.env[m[1]] ?? obj) : obj;\n }\n if (Array.isArray(obj)) return obj.map(substituteEnv);\n if (typeof obj === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) out[k] = substituteEnv(v);\n return out;\n }\n return obj;\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 }>(content, {\n substituteEnv: doSub,\n missingEnv: \"keep\",\n });\n const llm = parsed?.llm;\n if (llm == null) return undefined;\n return llm;\n}\n\nexport function loadLlmConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {}\n): unknown | null {\n if (typeof filePath !== \"string\" || filePath.trim().length === 0) {\n throw new Error(\"agent-llm: loadLlmConfig requires a non-empty file path\");\n }\n try {\n const parsed = loadYamlFileSync<{ llm?: unknown }>(filePath, {\n substituteEnv: options.substituteEnv !== false,\n missingEnv: \"keep\",\n cache: true,\n });\n if (parsed == null) return null;\n const llm = parsed.llm;\n return llm ?? null;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: failed to parse config file ${filePath}: ${msg}`, { cause: e });\n }\n}\n","/**\n * Simple API: create LangChain ChatModel from llm.yaml config.\n * Supports OpenAI-compatible providers with optional connectivity check and npm: provider resolution.\n */\nimport { join } from \"node:path\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport {\n checkEndpointConnectivity,\n buildUnreachableError,\n parseLlmSection,\n type LLMConfig,\n type EndpointConnectivityOptions,\n type ConnectionStatus,\n} from \"@easynet/agent-common\";\nimport { createChatModelFromLlmConfig } from \"../langchain/index.js\";\nimport { resolveLlmSectionWithNpm } from \"../extensions/npm-protocol.js\";\nimport { loadLlmConfig } from \"../config/loader.js\";\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\nexport interface CreateAgentLlMOptions {\n configPath?: string;\n installNpmIfMissing?: boolean;\n checkConnectivity?: boolean;\n onConnectionStatus?: (status: ConnectionStatus) => void;\n connectivityTimeoutMs?: number;\n}\n\nfunction resolveDefaultConfigPath(): string {\n return join(process.cwd(), \"llm.yaml\");\n}\n\nfunction normalizeOptions(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): CreateAgentLlMOptions {\n if (configPathOrOptions == null) return {};\n if (typeof configPathOrOptions === \"string\") return { configPath: configPathOrOptions };\n return configPathOrOptions;\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\nasync function ensureConnectivity(\n resolvedLlmSection: unknown,\n options: {\n checkConnectivity?: boolean;\n onConnectionStatus?: (status: ConnectionStatus) => void;\n connectivityTimeoutMs?: number;\n }\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 const shouldCheck = options.checkConnectivity !== false && configs.length > 0;\n if (!shouldCheck) 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\n/**\n * Create a LangChain ChatModel from llm.yaml config.\n * Returns BaseChatModel compatible with LangChain's createAgent and other tools.\n */\nexport async function createAgentLlM(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): Promise<BaseChatModel> {\n try {\n const options = normalizeOptions(configPathOrOptions);\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n\n if (llmSection == null) {\n throw new Error(\n `No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`\n );\n }\n\n const resolvedSection = await resolveLlmSectionWithNpm(llmSection, {\n installNpmIfMissing: options.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n\n await ensureConnectivity(resolvedSection, {\n checkConnectivity: options.checkConnectivity,\n onConnectionStatus: options.onConnectionStatus,\n connectivityTimeoutMs: options.connectivityTimeoutMs,\n });\n\n return createChatModelFromLlmConfig({ llmSection: resolvedSection });\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"No LLM config\")) throw e;\n if (e instanceof Error && e.message.includes(\"Cannot connect to\")) throw e;\n throw normalizeError(e, \"createAgentLlM failed\");\n }\n}\n","/**\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-llm-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-llm] 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 * 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-llm]\",\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","/**\n * Shared CLI helpers for agent-llm and provider CLIs.\n */\n\n/**\n * Turn LangChain message content (string | array of parts) into a single string.\n */\nexport function messageContentToString(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return (content as { type?: string; text?: string }[])\n .map((c) => (\"text\" in c && c.text ? c.text : \"\"))\n .join(\"\");\n }\n return String(content ?? \"\");\n}\n\n/**\n * Log error and exit. Use in CLIs for consistent error handling.\n */\nexport function exitWithError(err: unknown, code = 1): never {\n console.error(\"Error:\", err instanceof Error ? err.message : String(err));\n process.exit(code);\n}\n"],"mappings":"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","names":["model","apiKey","join","parseLlmSection","normalizeError","join","normalizeError","parseLlmSection"]}
package/dist/cli/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  createAgentLlM,
4
4
  messageContentToString
5
- } from "../chunk-POJY4YYJ.js";
5
+ } from "../chunk-OTF3KU7L.js";
6
6
 
7
7
  // src/cli/index.ts
8
8
  import { tool } from "@langchain/core/tools";
package/dist/index.d.ts CHANGED
@@ -1,32 +1,20 @@
1
1
  /**
2
- * @easynet/agent-llm: Simple LangChain ChatModel from llm.yaml.
3
- * Multi-provider support via extensions; default is ChatOpenAI from @langchain/openai.
2
+ * Minimal public API for @easynet/agent-llm.
3
+ * Goal: create a chat model from `llm.yaml` with the smallest possible surface.
4
4
  */
5
- export { parseLlmSection } from "@easynet/agent-common";
6
- export { loadLlmConfig, parseLlmYaml, substituteEnv } from "./config/loader.js";
7
- export { loadYamlConfig } from "./config/yaml.js";
8
- export type { LoadLlmConfigOptions } from "./config/loader.js";
9
- export { deepMerge } from "@easynet/agent-common";
10
- export { createModelHub } from "@easynet/agent-common";
11
- export type { CreateModelHubOptions, ModelHub, ChatGenerateRequest, ChatGenerateResult, EmbedRequest, EmbedResult } from "@easynet/agent-common";
12
- export { createChatOpenAI } from "./langchain/openai-compatible.js";
13
- export type { CreateChatOpenAIOptions } from "./langchain/openai-compatible.js";
14
- export { createChatModelFromLlmConfig } from "./langchain/index.js";
15
- export type { CreateChatModelOptions } from "./langchain/index.js";
16
- export { registerChatModelProvider, getChatModelFactory } from "./registry/chat-model.js";
17
- export type { ChatModelFactory } from "./registry/chat-model.js";
18
- export { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec, getLatestVersion, getInstalledVersion, ensureNpmPackageInstalled, resolveNpmProvider, resolveLlmSectionWithNpm, createChatModelWithNpm, } from "./extensions/npm-protocol.js";
19
- export type { EnsureNpmPackageInstalledOptions, ResolveNpmProviderOptions, ResolveLlmSectionWithNpmOptions, CreateChatModelWithNpmOptions, } from "./extensions/npm-protocol.js";
20
- export { loadLLMExtensions, resolveLLMExtensionPackages, discoverLLMExtensions, loadDiscoveredExtensions, } from "./extensions/loader.js";
21
- export type { LoadLLMExtensionsOptions } from "./extensions/loader.js";
22
5
  export { createAgentLlM } from "./api/create-agent-llm.js";
23
6
  export type { CreateAgentLlMOptions } from "./api/create-agent-llm.js";
24
7
  export { getDefaultLlmConfig } from "./api/get-default-llm-config.js";
25
8
  export type { GetDefaultLlmConfigOptions } from "./api/get-default-llm-config.js";
9
+ export { createChatModelFromLlmConfig } from "./langchain/index.js";
10
+ export type { CreateChatModelOptions } from "./langchain/index.js";
11
+ export { createChatOpenAI } from "./langchain/openai-compatible.js";
12
+ export type { CreateChatOpenAIOptions } from "./langchain/openai-compatible.js";
13
+ export { loadLlmConfig } from "./config/loader.js";
14
+ export type { LoadLlmConfigOptions } from "./config/loader.js";
15
+ export { registerChatModelProvider, getChatModelFactory } from "./registry/chat-model.js";
16
+ export type { ChatModelFactory } from "./registry/chat-model.js";
26
17
  export { messageContentToString, exitWithError } from "./cli/utils.js";
27
- export { checkEndpointConnectivity, buildUnreachableError, CIS_UNREACHABLE_REMINDER, } from "@easynet/agent-common";
28
- export type { EndpointConnectivityOptions } from "@easynet/agent-common";
29
- export type { ConnectionStatus, ConnectionPhase, CheckConnectivityResult, } from "@easynet/agent-common";
30
- export type { LLMType, LLMConfig, AgentConfigLlmSection, ILLMExtension, } from "./types.js";
18
+ export type { LLMType, LLMConfig, AgentConfigLlmSection, ILLMExtension } from "./types.js";
31
19
  export { AGENT_LLM_PROVIDER_FIELD } from "./types.js";
32
20
  //# 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,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGjJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,gCAAgC,EAChC,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGvE,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;AAGlF,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC"}
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;AAGlF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGvE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,52 +1,15 @@
1
1
  import {
2
2
  AGENT_LLM_PROVIDER_FIELD,
3
- NPM_PROTOCOL_PREFIX,
4
3
  createAgentLlM,
5
4
  createChatModelFromLlmConfig,
6
- createChatModelWithNpm,
7
5
  createChatOpenAI,
8
- discoverLLMExtensions,
9
- ensureNpmPackageInstalled,
10
6
  exitWithError,
11
7
  getChatModelFactory,
12
- getInstalledVersion,
13
- getLatestVersion,
14
- isNpmProviderSpec,
15
- loadDiscoveredExtensions,
16
- loadLLMExtensions,
17
8
  loadLlmConfig,
18
9
  messageContentToString,
19
- parseLlmYaml,
20
- parseNpmProviderSpec,
21
10
  registerChatModelProvider,
22
- resolveLLMExtensionPackages,
23
- resolveLlmSectionWithNpm,
24
- resolveNpmProvider,
25
- substituteEnv
26
- } from "./chunk-POJY4YYJ.js";
27
-
28
- // src/index.ts
29
- import { parseLlmSection as parseLlmSection2 } from "@easynet/agent-common";
30
-
31
- // src/config/yaml.ts
32
- import { loadYamlFileSync } from "@easynet/agent-common";
33
- function loadYamlConfig(filePath) {
34
- try {
35
- const parsed = loadYamlFileSync(filePath, {
36
- substituteEnv: true,
37
- missingEnv: "keep",
38
- cache: true
39
- });
40
- return parsed ?? {};
41
- } catch (e) {
42
- const msg = e instanceof Error ? e.message : String(e);
43
- throw new Error(`Failed to load YAML config from ${filePath}: ${msg}`, { cause: e });
44
- }
45
- }
46
-
47
- // src/index.ts
48
- import { deepMerge } from "@easynet/agent-common";
49
- import { createModelHub } from "@easynet/agent-common";
11
+ resolveLlmSectionWithNpm
12
+ } from "./chunk-OTF3KU7L.js";
50
13
 
51
14
  // src/api/get-default-llm-config.ts
52
15
  import { join } from "path";
@@ -67,45 +30,16 @@ async function getDefaultLlmConfig(options = {}) {
67
30
  const defaultConfig = configs.find((c) => c.id === defaultId) ?? configs[0] ?? null;
68
31
  return defaultConfig;
69
32
  }
70
-
71
- // src/index.ts
72
- import {
73
- checkEndpointConnectivity,
74
- buildUnreachableError,
75
- CIS_UNREACHABLE_REMINDER
76
- } from "@easynet/agent-common";
77
33
  export {
78
34
  AGENT_LLM_PROVIDER_FIELD,
79
- CIS_UNREACHABLE_REMINDER,
80
- NPM_PROTOCOL_PREFIX,
81
- buildUnreachableError,
82
- checkEndpointConnectivity,
83
35
  createAgentLlM,
84
36
  createChatModelFromLlmConfig,
85
- createChatModelWithNpm,
86
37
  createChatOpenAI,
87
- createModelHub,
88
- deepMerge,
89
- discoverLLMExtensions,
90
- ensureNpmPackageInstalled,
91
38
  exitWithError,
92
39
  getChatModelFactory,
93
40
  getDefaultLlmConfig,
94
- getInstalledVersion,
95
- getLatestVersion,
96
- isNpmProviderSpec,
97
- loadDiscoveredExtensions,
98
- loadLLMExtensions,
99
41
  loadLlmConfig,
100
- loadYamlConfig,
101
42
  messageContentToString,
102
- parseLlmSection2 as parseLlmSection,
103
- parseLlmYaml,
104
- parseNpmProviderSpec,
105
- registerChatModelProvider,
106
- resolveLLMExtensionPackages,
107
- resolveLlmSectionWithNpm,
108
- resolveNpmProvider,
109
- substituteEnv
43
+ registerChatModelProvider
110
44
  };
111
45
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config/yaml.ts","../src/api/get-default-llm-config.ts","../src/config/parser.ts"],"sourcesContent":["/**\n * @easynet/agent-llm: Simple LangChain ChatModel from llm.yaml.\n * Multi-provider support via extensions; default is ChatOpenAI from @langchain/openai.\n */\n\n// Config loading and parsing (parser from agent-common; loader stays here)\nexport { parseLlmSection } from \"@easynet/agent-common\";\nexport { loadLlmConfig, parseLlmYaml, substituteEnv } from \"./config/loader.js\";\nexport { loadYamlConfig } from \"./config/yaml.js\";\nexport type { LoadLlmConfigOptions } from \"./config/loader.js\";\n\n// Utilities (from agent-common)\nexport { deepMerge } from \"@easynet/agent-common\";\nexport { createModelHub } from \"@easynet/agent-common\";\nexport type { CreateModelHubOptions, ModelHub, ChatGenerateRequest, ChatGenerateResult, EmbedRequest, EmbedResult } from \"@easynet/agent-common\";\n\n// LangChain integration\nexport { createChatOpenAI } from \"./langchain/openai-compatible.js\";\nexport type { CreateChatOpenAIOptions } from \"./langchain/openai-compatible.js\";\nexport { createChatModelFromLlmConfig } from \"./langchain/index.js\";\nexport type { CreateChatModelOptions } from \"./langchain/index.js\";\n\n// Registry for custom providers\nexport { registerChatModelProvider, getChatModelFactory } from \"./registry/chat-model.js\";\nexport type { ChatModelFactory } from \"./registry/chat-model.js\";\n\n// NPM provider protocol\nexport {\n NPM_PROTOCOL_PREFIX,\n parseNpmProviderSpec,\n isNpmProviderSpec,\n getLatestVersion,\n getInstalledVersion,\n ensureNpmPackageInstalled,\n resolveNpmProvider,\n resolveLlmSectionWithNpm,\n createChatModelWithNpm,\n} from \"./extensions/npm-protocol.js\";\nexport type {\n EnsureNpmPackageInstalledOptions,\n ResolveNpmProviderOptions,\n ResolveLlmSectionWithNpmOptions,\n CreateChatModelWithNpmOptions,\n} from \"./extensions/npm-protocol.js\";\n\n// Extension loading\nexport {\n loadLLMExtensions,\n resolveLLMExtensionPackages,\n discoverLLMExtensions,\n loadDiscoveredExtensions,\n} from \"./extensions/loader.js\";\nexport type { LoadLLMExtensionsOptions } from \"./extensions/loader.js\";\n\n// Main API\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\";\n\n// CLI utilities\nexport { messageContentToString, exitWithError } from \"./cli/utils.js\";\n\n// Connectivity checking (from agent-common)\nexport {\n checkEndpointConnectivity,\n buildUnreachableError,\n CIS_UNREACHABLE_REMINDER,\n} from \"@easynet/agent-common\";\nexport type { EndpointConnectivityOptions } from \"@easynet/agent-common\";\nexport type {\n ConnectionStatus,\n ConnectionPhase,\n CheckConnectivityResult,\n} from \"@easynet/agent-common\";\n\n// Types (LLM types re-exported from agent-common; ILLMExtension and AGENT_LLM_PROVIDER_FIELD stay here)\nexport type {\n LLMType,\n LLMConfig,\n AgentConfigLlmSection,\n ILLMExtension,\n} from \"./types.js\";\nexport { AGENT_LLM_PROVIDER_FIELD } from \"./types.js\";\n","/**\n * Generic YAML file loader utility.\n */\n\nimport { loadYamlFileSync } from \"@easynet/agent-common\";\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","/**\n * Load llm.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 llm.yaml. Default: process.cwd() + \"/llm.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 llm.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(), \"llm.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 * Re-export LLM section parser from agent-common.\n */\n\nexport { parseLlmSection } from \"@easynet/agent-common\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,mBAAAA,wBAAuB;;;ACFhC,SAAS,wBAAwB;AAM1B,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;;;ADVA,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;;;AER/B,SAAS,YAAY;;;ACDrB,SAAS,uBAAuB;;;ADiBhC,eAAsB,oBACpB,UAAsC,CAAC,GACZ;AAC3B,QAAM,aAAa,QAAQ,cAAc,KAAK,QAAQ,IAAI,GAAG,UAAU;AACvE,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;;;AF4BA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":["parseLlmSection"]}
1
+ {"version":3,"sources":["../src/api/get-default-llm-config.ts","../src/config/parser.ts"],"sourcesContent":["/**\n * Load llm.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 llm.yaml. Default: process.cwd() + \"/llm.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 llm.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(), \"llm.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 * Re-export LLM section parser from agent-common.\n */\n\nexport { parseLlmSection } from \"@easynet/agent-common\";\n"],"mappings":";;;;;;;;;;;;;;AAKA,SAAS,YAAY;;;ACDrB,SAAS,uBAAuB;;;ADiBhC,eAAsB,oBACpB,UAAsC,CAAC,GACZ;AAC3B,QAAM,aAAa,QAAQ,cAAc,KAAK,QAAQ,IAAI,GAAG,UAAU;AACvE,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;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easynet/agent-llm",
3
- "version": "1.0.36",
3
+ "version": "1.0.38",
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": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/loader.ts","../src/langchain/openai-compatible.ts","../src/registry/chat-model.ts","../src/langchain/index.ts","../src/types.ts","../src/extensions/loader.ts","../src/extensions/npm-protocol.ts","../src/api/create-agent-llm.ts","../src/cli/utils.ts"],"sourcesContent":["/**\n * Load and parse LLM config from YAML (e.g. llm.yaml).\n * Supports ${VAR} substitution from process.env.\n */\nimport { loadYamlFileSync, parseYamlContent } from \"@easynet/agent-common\";\n\nexport interface LoadLlmConfigOptions {\n substituteEnv?: boolean;\n}\n\nexport function substituteEnv(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === \"string\") {\n const m = obj.match(/^\\$\\{(\\w+)\\}$/);\n return m ? (process.env[m[1]] ?? obj) : obj;\n }\n if (Array.isArray(obj)) return obj.map(substituteEnv);\n if (typeof obj === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) out[k] = substituteEnv(v);\n return out;\n }\n return obj;\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 }>(content, {\n substituteEnv: doSub,\n missingEnv: \"keep\",\n });\n const llm = parsed?.llm;\n if (llm == null) return undefined;\n return llm;\n}\n\nexport function loadLlmConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {}\n): unknown | null {\n if (typeof filePath !== \"string\" || filePath.trim().length === 0) {\n throw new Error(\"agent-llm: loadLlmConfig requires a non-empty file path\");\n }\n try {\n const parsed = loadYamlFileSync<{ llm?: unknown }>(filePath, {\n substituteEnv: options.substituteEnv !== false,\n missingEnv: \"keep\",\n cache: true,\n });\n if (parsed == null) return null;\n const llm = parsed.llm;\n return llm ?? null;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: failed to parse config file ${filePath}: ${msg}`, { cause: e });\n }\n}\n","/**\n * Create ChatOpenAI from config - works with any OpenAI-compatible provider.\n * This is the ONLY place we create ChatOpenAI instances.\n */\n\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { Agent } from \"node:http\";\n\nexport interface CreateChatOpenAIOptions {\n baseURL?: string;\n model: string;\n temperature?: number;\n apiKey?: string;\n defaultHeaders?: Record<string, string>;\n defaultQuery?: Record<string, string>;\n httpAgent?: Agent;\n}\n\n/**\n * Create ChatOpenAI from options.\n * Works with OpenAI and any OpenAI-compatible endpoint (CIS, Ollama, etc.).\n */\nexport function createChatOpenAI(options: CreateChatOpenAIOptions): BaseChatModel {\n const {\n baseURL,\n model,\n temperature = 0,\n apiKey,\n defaultHeaders,\n defaultQuery,\n httpAgent,\n } = options;\n\n const config: {\n baseURL?: string;\n defaultHeaders?: Record<string, string>;\n defaultQuery?: Record<string, string>;\n httpAgent?: Agent;\n } = {};\n\n if (baseURL) config.baseURL = baseURL;\n if (defaultHeaders) config.defaultHeaders = defaultHeaders;\n if (defaultQuery) config.defaultQuery = defaultQuery;\n if (httpAgent) config.httpAgent = httpAgent;\n\n return new ChatOpenAI({\n model,\n temperature,\n ...(apiKey ? { apiKey } : {}),\n ...(Object.keys(config).length > 0 ? { configuration: config } : {}),\n });\n}\n","/**\n * Registry for LangChain ChatModel by provider name.\n * Extensions register via registerChatModelProvider.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { LLMConfig } from \"@easynet/agent-common\";\n\nexport type ChatModelFactory = (config: LLMConfig) => BaseChatModel;\n\nconst CHAT_MODEL_FACTORIES = new Map<string, ChatModelFactory>();\n\nexport function registerChatModelProvider(providerName: string, factory: ChatModelFactory): void {\n CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);\n}\n\nexport function getChatModelFactory(providerName: string): ChatModelFactory | undefined {\n return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());\n}\n","/**\n * Simple LangChain module: create ChatOpenAI from llm config.\n * Extensions can register custom ChatModel factories via the registry.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { parseLlmSection } from \"@easynet/agent-common\";\nimport type { LLMConfig } from \"@easynet/agent-common\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\nimport { createChatOpenAI } from \"./openai-compatible.js\";\nimport type { Agent } from \"node:http\";\n\nconst DEFAULT_MODEL = \"gpt-4o-mini\";\n\nexport interface CreateChatModelOptions {\n llmSection?: unknown;\n modelEnv?: string;\n apiKeyEnv?: 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\n/**\n * Create a LangChain ChatModel from agent config llm section.\n * Uses extension-registered factory when available; otherwise creates ChatOpenAI.\n */\nexport function createChatModelFromLlmConfig(\n options: CreateChatModelOptions = {}\n): BaseChatModel {\n const { llmSection, modelEnv, apiKeyEnv } = options;\n\n let defaultId: string;\n let configs: LLMConfig[];\n\n try {\n const parsed = parseLlmSection(llmSection ?? null);\n defaultId = parsed.defaultId;\n configs = parsed.configs;\n } catch (e) {\n throw normalizeError(e, \"Failed to parse llm section\");\n }\n\n const config = configs.find((c) => c.id === defaultId) ?? configs[0];\n\n // No config? Use default OpenAI\n if (!config) {\n const model = modelEnv ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n const apiKey = apiKeyEnv ?? process.env.OPENAI_API_KEY;\n\n return createChatOpenAI({\n model,\n temperature: 0,\n ...(apiKey ? { apiKey } : {}),\n });\n }\n\n // Check for registered custom factory\n const provider = config.provider ?? \"openai\";\n const factory = getChatModelFactory(provider);\n\n if (factory) {\n try {\n return factory({\n ...config,\n model: modelEnv ?? config.model ?? DEFAULT_MODEL,\n temperature: typeof config.temperature === \"number\" ? config.temperature : 0,\n });\n } catch (e) {\n throw normalizeError(e, `Failed to create ChatModel for provider \"${provider}\"`);\n }\n }\n\n // Create standard ChatOpenAI for OpenAI-compatible provider\n const model = modelEnv ?? config.model ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n let apiKey = apiKeyEnv ?? config.apiKey ?? process.env.OPENAI_API_KEY;\n let baseURL = config.baseURL;\n\n // Ensure baseURL ends with /v1\n if (baseURL && !baseURL.replace(/\\/$/, \"\").endsWith(\"/v1\")) {\n baseURL = baseURL.replace(/\\/$/, \"\") + \"/v1\";\n }\n\n // For local providers without API keys, use a placeholder\n if (baseURL && !apiKey) {\n apiKey = \"not-needed\";\n }\n\n const temperature = typeof config.temperature === \"number\" ? config.temperature : 0;\n\n // Extract options\n const opts = config.options as Record<string, unknown> | undefined;\n const defaultHeaders = opts?.defaultHeaders as Record<string, string> | undefined;\n const defaultQuery = opts?.defaultQuery as Record<string, string> | undefined;\n const httpAgent = opts?.httpAgent as Agent | undefined;\n\n return createChatOpenAI({\n model,\n temperature,\n baseURL,\n apiKey,\n defaultHeaders,\n defaultQuery,\n httpAgent,\n });\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// Re-export common LLM types (no LangChain) so consumers can import from @easynet/agent-llm\nexport type { LLMType, LLMConfig, AgentConfigLlmSection } from \"@easynet/agent-common\";\n\n/** package.json field: when true, the package is an agent-llm provider (for discovery). */\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(\"@easynet/agent-common\").LLMConfig) => BaseChatModel;\n /** Legacy: if extension provides register(), framework calls it. */\n register?(): void;\n}\n","/**\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-llm-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-llm] 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 * 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-llm]\",\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","/**\n * Simple API: create LangChain ChatModel from llm.yaml config.\n * Supports OpenAI-compatible providers with optional connectivity check and npm: provider resolution.\n */\nimport { join } from \"node:path\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport {\n checkEndpointConnectivity,\n buildUnreachableError,\n parseLlmSection,\n type LLMConfig,\n type EndpointConnectivityOptions,\n type ConnectionStatus,\n} from \"@easynet/agent-common\";\nimport { createChatModelFromLlmConfig } from \"../langchain/index.js\";\nimport { resolveLlmSectionWithNpm } from \"../extensions/npm-protocol.js\";\nimport { loadLlmConfig } from \"../config/loader.js\";\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\nexport interface CreateAgentLlMOptions {\n configPath?: string;\n installNpmIfMissing?: boolean;\n checkConnectivity?: boolean;\n onConnectionStatus?: (status: ConnectionStatus) => void;\n connectivityTimeoutMs?: number;\n}\n\nfunction resolveDefaultConfigPath(): string {\n return join(process.cwd(), \"llm.yaml\");\n}\n\nfunction normalizeOptions(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): CreateAgentLlMOptions {\n if (configPathOrOptions == null) return {};\n if (typeof configPathOrOptions === \"string\") return { configPath: configPathOrOptions };\n return configPathOrOptions;\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\nasync function ensureConnectivity(\n resolvedLlmSection: unknown,\n options: {\n checkConnectivity?: boolean;\n onConnectionStatus?: (status: ConnectionStatus) => void;\n connectivityTimeoutMs?: number;\n }\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 const shouldCheck = options.checkConnectivity !== false && configs.length > 0;\n if (!shouldCheck) 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\n/**\n * Create a LangChain ChatModel from llm.yaml config.\n * Returns BaseChatModel compatible with LangChain's createAgent and other tools.\n */\nexport async function createAgentLlM(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): Promise<BaseChatModel> {\n try {\n const options = normalizeOptions(configPathOrOptions);\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n\n if (llmSection == null) {\n throw new Error(\n `No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`\n );\n }\n\n const resolvedSection = await resolveLlmSectionWithNpm(llmSection, {\n installNpmIfMissing: options.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n\n await ensureConnectivity(resolvedSection, {\n checkConnectivity: options.checkConnectivity,\n onConnectionStatus: options.onConnectionStatus,\n connectivityTimeoutMs: options.connectivityTimeoutMs,\n });\n\n return createChatModelFromLlmConfig({ llmSection: resolvedSection });\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"No LLM config\")) throw e;\n if (e instanceof Error && e.message.includes(\"Cannot connect to\")) throw e;\n throw normalizeError(e, \"createAgentLlM failed\");\n }\n}\n","/**\n * Shared CLI helpers for agent-llm and provider CLIs.\n */\n\n/**\n * Turn LangChain message content (string | array of parts) into a single string.\n */\nexport function messageContentToString(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return (content as { type?: string; text?: string }[])\n .map((c) => (\"text\" in c && c.text ? c.text : \"\"))\n .join(\"\");\n }\n return String(content ?? \"\");\n}\n\n/**\n * Log error and exit. Use in CLIs for consistent error handling.\n */\nexport function exitWithError(err: unknown, code = 1): never {\n console.error(\"Error:\", err instanceof Error ? err.message : String(err));\n process.exit(code);\n}\n"],"mappings":"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","names":["model","apiKey","name","normalizeError","join","parseLlmSection","join","normalizeError","parseLlmSection"]}