@easynet/agent-model 1.0.71 → 1.0.73
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 +8 -4
- package/config/model.yaml +12 -4
- package/dist/api/chat-model.d.ts +9 -0
- package/dist/api/chat-model.d.ts.map +1 -0
- package/dist/api/connectivity.d.ts +8 -0
- package/dist/api/connectivity.d.ts.map +1 -0
- package/dist/api/create-agent-llm.d.ts +1 -1
- package/dist/api/create-agent-llm.d.ts.map +1 -1
- package/dist/api/create-agent-model-registry.d.ts +1 -1
- package/dist/api/create-agent-model-registry.d.ts.map +1 -1
- package/dist/api/register-model.d.ts +1 -0
- package/dist/api/register-model.d.ts.map +1 -1
- package/dist/{chunk-RRZDREGU.js → chunk-NAH4USJ2.js} +20 -27
- package/dist/chunk-NAH4USJ2.js.map +1 -0
- package/dist/chunk-OQPM73A7.js +133 -0
- package/dist/chunk-OQPM73A7.js.map +1 -0
- package/dist/{chunk-6EQCGQTV.js → chunk-UVIUQUYJ.js} +4 -4
- package/dist/cli/index.js +6 -85
- package/dist/cli/index.js.map +1 -1
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/yaml-utils.d.ts +1 -12
- package/dist/config/yaml-utils.d.ts.map +1 -1
- package/dist/extensions/index.d.ts +2 -2
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +6 -14
- package/dist/extensions/npm-protocol.d.ts +1 -8
- package/dist/extensions/npm-protocol.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -83
- package/dist/index.js.map +1 -1
- package/dist/langchain/index.js +2 -2
- package/package.json +3 -2
- package/dist/api/create-embed-fn.d.ts +0 -10
- package/dist/api/create-embed-fn.d.ts.map +0 -1
- package/dist/api/get-default-llm-config.d.ts +0 -16
- package/dist/api/get-default-llm-config.d.ts.map +0 -1
- package/dist/api/get-default-vlm-config.d.ts +0 -15
- package/dist/api/get-default-vlm-config.d.ts.map +0 -1
- package/dist/chunk-3HA2CHZN.js +0 -149
- package/dist/chunk-3HA2CHZN.js.map +0 -1
- package/dist/chunk-AUQEXHUP.js +0 -105
- package/dist/chunk-AUQEXHUP.js.map +0 -1
- package/dist/chunk-KE7IMUSA.js +0 -223
- package/dist/chunk-KE7IMUSA.js.map +0 -1
- package/dist/chunk-RRZDREGU.js.map +0 -1
- package/dist/config/index.d.ts +0 -18
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -71
- package/dist/config/index.js.map +0 -1
- package/dist/config/ref.d.ts +0 -7
- package/dist/config/ref.d.ts.map +0 -1
- package/dist/connectivity/check.d.ts +0 -18
- package/dist/connectivity/check.d.ts.map +0 -1
- package/dist/connectivity/index.d.ts +0 -3
- package/dist/connectivity/index.d.ts.map +0 -1
- package/dist/connectivity/index.js +0 -11
- package/dist/connectivity/index.js.map +0 -1
- package/dist/connectivity/types.d.ts +0 -13
- package/dist/connectivity/types.d.ts.map +0 -1
- package/dist/npm/command.d.ts +0 -37
- package/dist/npm/command.d.ts.map +0 -1
- package/dist/npm/index.d.ts +0 -5
- package/dist/npm/index.d.ts.map +0 -1
- package/dist/npm/index.js +0 -39
- package/dist/npm/index.js.map +0 -1
- package/dist/npm/install.d.ts +0 -9
- package/dist/npm/install.d.ts.map +0 -1
- package/dist/npm/provider.d.ts +0 -15
- package/dist/npm/provider.d.ts.map +0 -1
- package/dist/npm/version.d.ts +0 -12
- package/dist/npm/version.d.ts.map +0 -1
- /package/dist/{chunk-6EQCGQTV.js.map → chunk-UVIUQUYJ.js.map} +0 -0
package/README.md
CHANGED
|
@@ -5,9 +5,11 @@
|
|
|
5
5
|
## 最小接口
|
|
6
6
|
|
|
7
7
|
```ts
|
|
8
|
-
import {
|
|
8
|
+
import { AgentContextTokens, getDefaultAgentContext } from "@easynet/agent-common";
|
|
9
|
+
import { createAgentModel } from "@easynet/agent-model";
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
await createAgentModel();
|
|
12
|
+
const llm = getDefaultAgentContext().get(AgentContextTokens.ChatModel);
|
|
11
13
|
const result = await llm.invoke("hello");
|
|
12
14
|
console.log(result.content);
|
|
13
15
|
```
|
|
@@ -48,11 +50,13 @@ runtime:
|
|
|
48
50
|
## 最简单示例(带注释)
|
|
49
51
|
|
|
50
52
|
```ts
|
|
51
|
-
import {
|
|
53
|
+
import { AgentContextTokens, getDefaultAgentContext } from "@easynet/agent-common";
|
|
54
|
+
import { createAgentModel } from "@easynet/agent-model";
|
|
52
55
|
|
|
53
56
|
async function main() {
|
|
54
57
|
// 1) 从当前目录 model.yaml 读取配置并创建模型
|
|
55
|
-
|
|
58
|
+
await createAgentModel();
|
|
59
|
+
const llm = getDefaultAgentContext().get(AgentContextTokens.ChatModel);
|
|
56
60
|
|
|
57
61
|
// 2) 直接调用模型
|
|
58
62
|
const response = await llm.invoke("请用一句话介绍你自己。");
|
package/config/model.yaml
CHANGED
|
@@ -10,11 +10,19 @@ spec:
|
|
|
10
10
|
base_url: http://localhost:11434/v1
|
|
11
11
|
model: qwen3:0.6b
|
|
12
12
|
|
|
13
|
+
embed:
|
|
14
|
+
default: local
|
|
15
|
+
local:
|
|
16
|
+
provider: openai
|
|
17
|
+
base_url: http://localhost:11434/v1
|
|
18
|
+
model: qwen3-embedding:0.6b
|
|
19
|
+
apiKey: not-needed
|
|
20
|
+
|
|
13
21
|
vlm:
|
|
14
|
-
default:
|
|
15
|
-
|
|
22
|
+
default: glm_ocr
|
|
23
|
+
glm_ocr:
|
|
16
24
|
type: image
|
|
17
25
|
provider: openai
|
|
18
|
-
base_url:
|
|
19
|
-
model:
|
|
26
|
+
base_url: http://localhost:11434/v1
|
|
27
|
+
model: glm-ocr:q8_0
|
|
20
28
|
apiKey: not-needed
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
2
|
+
/**
|
|
3
|
+
* Ensure bindTools always receives tool_choice: "auto" when tools are bound.
|
|
4
|
+
* Fixes "Tool choice is none, but model called a tool" when using this model
|
|
5
|
+
* with LangChain createAgent (AgentNode leaves tool_choice undefined for non-structured tools).
|
|
6
|
+
* Mutates the model in place so it still passes isBaseChatModel / bindTools checks.
|
|
7
|
+
*/
|
|
8
|
+
export declare function applyDefaultToolChoice(model: BaseChatModel): void;
|
|
9
|
+
//# sourceMappingURL=chat-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-model.d.ts","sourceRoot":"","sources":["../../src/api/chat-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAGjF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAcjE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ConnectionStatus } from "@easynet/agent-common";
|
|
2
|
+
export interface EnsureConnectivityOptions {
|
|
3
|
+
checkConnectivity?: boolean;
|
|
4
|
+
onConnectionStatus?: (status: ConnectionStatus) => void;
|
|
5
|
+
connectivityTimeoutMs?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function ensureConnectivity(resolvedLlmSection: unknown, options: EnsureConnectivityOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=connectivity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectivity.d.ts","sourceRoot":"","sources":["../../src/api/connectivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EAEtB,MAAM,uBAAuB,CAAC;AAO/B,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxD,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAmCD,wBAAsB,kBAAkB,CACtC,kBAAkB,EAAE,OAAO,EAC3B,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAsDf"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
2
|
-
import {
|
|
2
|
+
import type { ConnectionStatus } from "@easynet/agent-common";
|
|
3
3
|
export interface CreateAgentLlmOptions {
|
|
4
4
|
configPath?: string;
|
|
5
5
|
installNpmIfMissing?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-agent-llm.d.ts","sourceRoot":"","sources":["../../src/api/create-agent-llm.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,
|
|
1
|
+
{"version":3,"file":"create-agent-llm.d.ts","sourceRoot":"","sources":["../../src/api/create-agent-llm.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAO9D,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxD,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAmBD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,mBAAmB,CAAC,EAAE,MAAM,GAAG,qBAAqB,GACnD,OAAO,CAAC,aAAa,CAAC,CAmCxB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
2
2
|
import type { Embeddings } from "@langchain/core/embeddings";
|
|
3
|
-
import { type ConnectionStatus } from "
|
|
3
|
+
import { type ConnectionStatus } from "@easynet/agent-common";
|
|
4
4
|
export interface CreateAgentModelRegistryOptions {
|
|
5
5
|
configPath?: string;
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-agent-model-registry.d.ts","sourceRoot":"","sources":["../../src/api/create-agent-model-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"create-agent-model-registry.d.ts","sourceRoot":"","sources":["../../src/api/create-agent-model-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAUzE,MAAM,WAAW,+BAA+B;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxD,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,2BAA2B,EAAE,YAAY,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACrI,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3C,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,2BAA2B,EAAE,YAAY,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACzI;AA2ED,wBAAsB,wBAAwB,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,+BAA+B,GAAG,OAAO,CAAC,UAAU,CAAC,CAyElI"}
|
|
@@ -8,6 +8,7 @@ export interface CreateAgentModelOptions extends CreateAgentModelRegistryOptions
|
|
|
8
8
|
* Sets:
|
|
9
9
|
* - AgentContextTokens.ChatModel → BaseChatModel
|
|
10
10
|
* - AgentContextTokens.EmbedModel → Embeddings
|
|
11
|
+
* - AgentContextTokens.VlmModel → BaseChatModel (image-capable, optional)
|
|
11
12
|
*
|
|
12
13
|
* @example
|
|
13
14
|
* ```ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-model.d.ts","sourceRoot":"","sources":["../../src/api/register-model.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAElH,MAAM,WAAW,uBAAwB,SAAQ,+BAA+B;CAAG;AAEnF
|
|
1
|
+
{"version":3,"file":"register-model.d.ts","sourceRoot":"","sources":["../../src/api/register-model.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAElH,MAAM,WAAW,uBAAwB,SAAQ,+BAA+B;CAAG;AAEnF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvF"}
|
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createChatModelFromLlmConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UVIUQUYJ.js";
|
|
4
4
|
import {
|
|
5
5
|
getChatModelFactory,
|
|
6
6
|
registerChatModelProvider
|
|
7
7
|
} from "./chunk-G7MKWPEI.js";
|
|
8
|
-
import {
|
|
9
|
-
ensureNpmPackageInstalled,
|
|
10
|
-
getInstalledVersion,
|
|
11
|
-
isNpmProviderSpec,
|
|
12
|
-
parseNpmProviderSpec,
|
|
13
|
-
resolveLatestVersionFromRegistry
|
|
14
|
-
} from "./chunk-KE7IMUSA.js";
|
|
15
8
|
|
|
16
9
|
// src/extensions/loader.ts
|
|
17
10
|
import { readdirSync, readFileSync, existsSync } from "fs";
|
|
@@ -214,18 +207,14 @@ async function loadDiscoveredExtensions(cwd = process.cwd()) {
|
|
|
214
207
|
}
|
|
215
208
|
|
|
216
209
|
// src/extensions/npm-protocol.ts
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
}
|
|
223
|
-
function
|
|
224
|
-
|
|
225
|
-
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");
|
|
226
|
-
}
|
|
227
|
-
async function ensureNpmPackageInstalled2(packageName, options = {}) {
|
|
228
|
-
await ensureNpmPackageInstalled(packageName, {
|
|
210
|
+
import {
|
|
211
|
+
NPM_PROTOCOL_PREFIX,
|
|
212
|
+
parseNpmProviderSpec,
|
|
213
|
+
isNpmProviderSpec,
|
|
214
|
+
ensureNpmPackageInstalled as ensureNpmPackageInstalledFromCommon
|
|
215
|
+
} from "@easynet/agent-common/npm";
|
|
216
|
+
async function ensureNpmProviderInstalled(packageName, options = {}) {
|
|
217
|
+
await ensureNpmPackageInstalledFromCommon(packageName, {
|
|
229
218
|
version: options.version,
|
|
230
219
|
cwd: options.cwd,
|
|
231
220
|
stdio: "inherit",
|
|
@@ -233,6 +222,10 @@ async function ensureNpmPackageInstalled2(packageName, options = {}) {
|
|
|
233
222
|
logPrefix: "[agent-model]"
|
|
234
223
|
});
|
|
235
224
|
}
|
|
225
|
+
function isModuleNotFoundError(err) {
|
|
226
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
227
|
+
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");
|
|
228
|
+
}
|
|
236
229
|
function normalizeError(e, context) {
|
|
237
230
|
if (e instanceof Error) return new Error(`${context}: ${e.message}`, { cause: e });
|
|
238
231
|
return new Error(`${context}: ${String(e)}`);
|
|
@@ -248,14 +241,14 @@ async function resolveNpmProvider(spec, options = {}) {
|
|
|
248
241
|
await loadLLMExtensions([packageName], { cwd });
|
|
249
242
|
};
|
|
250
243
|
if (installNpmIfMissing) {
|
|
251
|
-
await
|
|
244
|
+
await ensureNpmProviderInstalled(packageName, { version, cwd });
|
|
252
245
|
}
|
|
253
246
|
try {
|
|
254
247
|
await load();
|
|
255
248
|
} catch (err) {
|
|
256
249
|
if (installNpmIfMissing && isModuleNotFoundError(err)) {
|
|
257
250
|
try {
|
|
258
|
-
await
|
|
251
|
+
await ensureNpmProviderInstalled(packageName, { version, cwd });
|
|
259
252
|
await load();
|
|
260
253
|
} catch (installErr) {
|
|
261
254
|
throw normalizeError(installErr, `Failed to install or load npm provider "${packageName}"`);
|
|
@@ -266,7 +259,7 @@ async function resolveNpmProvider(spec, options = {}) {
|
|
|
266
259
|
}
|
|
267
260
|
if (fragmentProvider && !getChatModelFactory(fragmentProvider)) {
|
|
268
261
|
if (installNpmIfMissing) {
|
|
269
|
-
await
|
|
262
|
+
await ensureNpmProviderInstalled(packageName, { version, cwd });
|
|
270
263
|
await load();
|
|
271
264
|
}
|
|
272
265
|
if (!getChatModelFactory(fragmentProvider)) {
|
|
@@ -344,11 +337,11 @@ export {
|
|
|
344
337
|
discoverLLMExtensions,
|
|
345
338
|
loadLLMExtensions,
|
|
346
339
|
loadDiscoveredExtensions,
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
340
|
+
NPM_PROTOCOL_PREFIX,
|
|
341
|
+
parseNpmProviderSpec,
|
|
342
|
+
isNpmProviderSpec,
|
|
350
343
|
resolveNpmProvider,
|
|
351
344
|
resolveLlmSectionWithNpm,
|
|
352
345
|
createChatModelWithNpm
|
|
353
346
|
};
|
|
354
|
-
//# sourceMappingURL=chunk-
|
|
347
|
+
//# sourceMappingURL=chunk-NAH4USJ2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/extensions/loader.ts","../src/types.ts","../src/extensions/npm-protocol.ts"],"sourcesContent":["/**\n * Load LLM extensions by npm package name or by dynamic discovery.\n * Extensions register a ChatModel factory via registerChatModelProvider.\n */\n\nimport { readdirSync, readFileSync, existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ILLMExtension } from \"../types.js\";\nimport { AGENT_LLM_PROVIDER_FIELD } from \"../types.js\";\nimport { registerChatModelProvider, type ChatModelFactory } from \"../registry/chat-model.js\";\n\nconst loadedPackages = new Set<string>();\n\nfunction isLLMExtension(m: unknown): m is ILLMExtension {\n if (m == null || typeof m !== \"object\") return false;\n const e = m as ILLMExtension;\n if (typeof e.providerName !== \"string\") return false;\n const hasRegister = typeof e.register === \"function\";\n const hasChatModel = typeof e.createChatModel === \"function\";\n return hasRegister || hasChatModel;\n}\n\nfunction registerExtension(ext: ILLMExtension): void {\n if (typeof ext.createChatModel === \"function\") {\n registerChatModelProvider(ext.providerName, ext.createChatModel as ChatModelFactory);\n return;\n }\n if (typeof ext.register === \"function\") {\n ext.register();\n }\n}\n\nfunction getExtensionFromModule(m: Record<string, unknown>): ILLMExtension | null {\n if (isLLMExtension(m)) return m;\n if (typeof m.getLLMExtension === \"function\") {\n const ext = m.getLLMExtension();\n return isLLMExtension(ext) ? ext : null;\n }\n if (isLLMExtension(m.default)) return m.default;\n return null;\n}\n\nexport function resolveLLMExtensionPackages(types?: string | string[]): string[] {\n if (types == null) return [];\n const typeList = Array.isArray(types) ? types : [types];\n return typeList.filter(\n (t): t is string => typeof t === \"string\" && String(t).trim().length > 0\n );\n}\n\nfunction readPackageProviderName(pkgPath: string): string | null {\n if (!existsSync(pkgPath)) return null;\n try {\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw) as { agentLlmProvider?: boolean; keywords?: string[]; name?: string };\n const declared =\n pkg[AGENT_LLM_PROVIDER_FIELD] === true ||\n (Array.isArray(pkg.keywords) && pkg.keywords.includes(\"agent-model-provider\"));\n return declared && typeof pkg.name === \"string\" ? pkg.name : null;\n } catch {\n return null;\n }\n}\n\nexport function discoverLLMExtensions(cwd: string = process.cwd()): string[] {\n const dir = typeof cwd === \"string\" && cwd.trim().length > 0 ? cwd : process.cwd();\n const nodeModules = join(dir, \"node_modules\");\n if (!existsSync(nodeModules)) return [];\n const names: string[] = [];\n const seen = new Set<string>();\n try {\n const entries = readdirSync(nodeModules, { withFileTypes: true });\n for (const e of entries) {\n if (e.name.startsWith(\".\") || e.name === \"node\") continue;\n if (e.name.startsWith(\"@\") && e.isDirectory()) {\n const scopePath = join(nodeModules, e.name);\n const scopeEntries = readdirSync(scopePath, { withFileTypes: true });\n for (const se of scopeEntries) {\n if (!se.isDirectory()) continue;\n const name = readPackageProviderName(join(scopePath, se.name, \"package.json\"));\n if (name && !seen.has(name)) {\n seen.add(name);\n names.push(name);\n }\n }\n continue;\n }\n const name = readPackageProviderName(join(nodeModules, e.name, \"package.json\"));\n if (name && !seen.has(name)) {\n seen.add(name);\n names.push(name);\n }\n }\n } catch {\n // no node_modules or not readable\n }\n return names;\n}\n\nasync function loadModuleFromPath(pkgDir: string): Promise<Record<string, unknown>> {\n const pkgJsonPath = join(pkgDir, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n throw new Error(`package.json not found in ${pkgDir}`);\n }\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as { main?: string };\n const main = pkgJson?.main ?? \"index.js\";\n const entryPath = join(pkgDir, main);\n if (!existsSync(entryPath)) {\n throw new Error(`Entry ${main} not found in ${pkgDir}`);\n }\n const entryUrl = pathToFileURL(entryPath).href;\n return (await import(/* @vite-ignore */ entryUrl)) as Record<string, unknown>;\n}\n\n/**\n * Resolve package main entry from cwd so we load the copy in cwd's node_modules,\n * not a different copy from bare import (e.g. under @wallee/agent).\n */\nfunction resolvePackageEntryFromCwd(pkg: string, cwd: string): string | null {\n const pkgDir = join(cwd, \"node_modules\", pkg);\n const pkgJsonPath = join(pkgDir, \"package.json\");\n if (!existsSync(pkgJsonPath)) return null;\n try {\n const req = createRequire(pkgJsonPath);\n return req.resolve(pkg);\n } catch {\n return null;\n }\n}\n\nexport interface LoadLLMExtensionsOptions {\n cwd?: string;\n}\n\nexport async function loadLLMExtensions(\n extensionPackages?: string[],\n options?: LoadLLMExtensionsOptions\n): Promise<void> {\n const packages = Array.isArray(extensionPackages)\n ? extensionPackages.filter((p): p is string => typeof p === \"string\" && String(p).trim().length > 0)\n : [];\n const cwd = options?.cwd ?? process.cwd();\n for (const pkg of packages) {\n if (loadedPackages.has(pkg)) continue;\n loadedPackages.add(pkg);\n let loaded = false;\n const cwdPkgDir = join(cwd, \"node_modules\", pkg);\n const cwdIsProject =\n existsSync(join(cwd, \"package.json\")) &&\n (() => {\n try {\n const name = (JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf-8\")) as { name?: string }).name;\n return name === pkg;\n } catch {\n return false;\n }\n })();\n const dirsToTry = [cwdPkgDir, ...(cwdIsProject ? [cwd] : [])];\n for (const pkgDir of dirsToTry) {\n if (!existsSync(join(pkgDir, \"package.json\"))) continue;\n try {\n const m = await loadModuleFromPath(pkgDir);\n const ext = getExtensionFromModule(m);\n if (ext) {\n registerExtension(ext);\n loaded = true;\n break;\n }\n if (typeof (m as { registerLLMExtension?: () => void }).registerLLMExtension === \"function\") {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n loaded = true;\n break;\n }\n } catch {\n // try next path\n }\n }\n if (loaded) continue;\n // Prefer cwd-resolved entry so we load the copy just installed, not another copy from bare import\n const resolvedEntry = resolvePackageEntryFromCwd(pkg, cwd);\n if (resolvedEntry) {\n try {\n const entryUrl = pathToFileURL(resolvedEntry).href;\n const m = (await import(/* @vite-ignore */ entryUrl)) as Record<string, unknown>;\n const ext = getExtensionFromModule(m);\n if (ext) {\n registerExtension(ext);\n continue;\n }\n if (typeof (m as { registerLLMExtension?: () => void }).registerLLMExtension === \"function\") {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n continue;\n }\n } catch {\n // fall through to bare import\n }\n }\n try {\n const m = await import(/* @vite-ignore */ pkg) as Record<string, unknown>;\n const ext = getExtensionFromModule(m);\n if (ext) {\n registerExtension(ext);\n continue;\n }\n if (typeof (m as { registerLLMExtension?: () => void }).registerLLMExtension === \"function\") {\n (m as { registerLLMExtension: () => void }).registerLLMExtension();\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (typeof process !== \"undefined\" && process.emitWarning) {\n process.emitWarning(`[agent-model] Failed to load extension \"${pkg}\": ${msg}`, { code: \"AGENT_LLM_EXTENSION_LOAD\" });\n }\n }\n }\n}\n\nexport async function loadDiscoveredExtensions(cwd: string = process.cwd()): Promise<string[]> {\n const dir = typeof cwd === \"string\" && cwd.trim().length > 0 ? cwd : process.cwd();\n const names = discoverLLMExtensions(dir);\n await loadLLMExtensions(names);\n return names;\n}\n","/**\n * Agent LLM: OpenAI-compatible config.\n * Returns LangChain BaseChatModel instances.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\n\n// LLM types now live locally in agent-model\nexport type { LLMType, LLMConfig, AgentConfigLlmSection } from \"./model/types.js\";\n\n/** package.json field: when true, the package is an agent-model provider (legacy name kept for compatibility). */\nexport const AGENT_LLM_PROVIDER_FIELD = \"agentLlmProvider\";\n\n/**\n * Extension interface: register a ChatModel factory by provider name.\n * Extensions implement getLLMExtension(); framework registers the factory when loading.\n */\nexport interface ILLMExtension {\n readonly providerName: string;\n /** ChatModel factory. Framework calls registerChatModelProvider(providerName, createChatModel). */\n readonly createChatModel?: (config: import(\"./model/types.js\").LLMConfig) => BaseChatModel;\n /** Legacy: if extension provides register(), framework calls it. */\n register?(): void;\n}\n","/**\n * npm: protocol in provider — specify an npm package name (and optional version) in config's provider.\n * When installNpmIfMissing is true, the framework will run npm install <package>[@version] if the package is not found.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { loadLLMExtensions } from \"./loader.js\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\nimport { createChatModelFromLlmConfig } from \"../langchain/index.js\";\nimport type { CreateChatModelOptions } from \"../langchain/index.js\";\nimport {\n NPM_PROTOCOL_PREFIX,\n parseNpmProviderSpec,\n isNpmProviderSpec,\n ensureNpmPackageInstalled as ensureNpmPackageInstalledFromCommon,\n} from \"@easynet/agent-common/npm\";\n\nexport { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec };\n\nexport interface EnsureNpmPackageInstalledOptions {\n version?: string;\n cwd?: string;\n}\n\nasync function ensureNpmProviderInstalled(\n packageName: string,\n options: EnsureNpmPackageInstalledOptions = {}\n): Promise<void> {\n await ensureNpmPackageInstalledFromCommon(packageName, {\n version: options.version,\n cwd: options.cwd,\n stdio: \"inherit\",\n noPackageLock: true,\n logPrefix: \"[agent-model]\",\n });\n}\n\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 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 ensureNpmProviderInstalled(packageName, { version, cwd });\n }\n\n try {\n await load();\n } catch (err) {\n if (installNpmIfMissing && isModuleNotFoundError(err)) {\n try {\n await ensureNpmProviderInstalled(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 ensureNpmProviderInstalled(packageName, { version, cwd });\n await load();\n }\n if (!getChatModelFactory(fragmentProvider)) {\n throw new Error(`Package \"${packageName}\" was installed but did not register provider \"${fragmentProvider}\". Check that the package exports getLLMExtension() or registerLLMExtension().`);\n }\n }\n\n if (fragmentProvider) return fragmentProvider;\n\n try {\n const m = await import(/* @vite-ignore */ packageName);\n if (typeof (m as { getDefaultProviderName?: () => string }).getDefaultProviderName === \"function\") {\n return (m as { getDefaultProviderName: () => string }).getDefaultProviderName();\n }\n } catch {\n // ignore\n }\n throw new Error(\n `Provider spec ${spec} has no #provider fragment and the package does not export getDefaultProviderName(). Use e.g. npm:${packageName}#<provider-name>.`\n );\n}\n\nexport interface ResolveLlmSectionWithNpmOptions extends ResolveNpmProviderOptions {}\n\nexport async function resolveLlmSectionWithNpm(\n llmSection: unknown,\n options: ResolveLlmSectionWithNpmOptions = {}\n): Promise<unknown> {\n if (llmSection == null) return llmSection;\n if (Array.isArray(llmSection)) {\n const out: unknown[] = [];\n for (let i = 0; i < llmSection.length; i++) {\n try {\n out.push(await resolveLlmSectionWithNpm(llmSection[i], options));\n } catch (e) {\n throw normalizeError(e, `Failed to resolve llm section at index ${i}`);\n }\n }\n return out;\n }\n if (typeof llmSection === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(llmSection)) {\n if (k === \"provider\" && isNpmProviderSpec(v)) {\n try {\n const resolved = await resolveNpmProvider(v as string, options);\n out[k] = resolved ?? v;\n } catch (e) {\n throw normalizeError(e, `Failed to resolve provider \"${String(v)}\"`);\n }\n continue;\n }\n try {\n out[k] = await resolveLlmSectionWithNpm(v, options);\n } catch (e) {\n throw normalizeError(e, `Failed to resolve llm section key \"${k}\"`);\n }\n }\n return out;\n }\n return llmSection;\n}\n\nexport interface CreateChatModelWithNpmOptions\n extends CreateChatModelOptions,\n ResolveNpmProviderOptions {}\n\nexport async function createChatModelWithNpm(\n options: CreateChatModelWithNpmOptions = {}\n): Promise<BaseChatModel> {\n try {\n const { installNpmIfMissing, cwd, ...rest } = options;\n const resolvedSection = await resolveLlmSectionWithNpm(options.llmSection ?? null, {\n installNpmIfMissing,\n cwd,\n });\n return createChatModelFromLlmConfig({\n ...rest,\n llmSection: resolvedSection,\n });\n } catch (e) {\n throw normalizeError(e, \"createChatModelWithNpm failed\");\n }\n}\n"],"mappings":"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","names":["name"]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parseLlmSection
|
|
3
|
+
} from "./chunk-SPDXNDDD.js";
|
|
4
|
+
|
|
5
|
+
// src/config/yaml-utils.ts
|
|
6
|
+
import {
|
|
7
|
+
loadYamlFile,
|
|
8
|
+
loadYamlFileSync,
|
|
9
|
+
parseYamlContent,
|
|
10
|
+
clearYamlFileCache
|
|
11
|
+
} from "@easynet/agent-common";
|
|
12
|
+
|
|
13
|
+
// src/config/loader.ts
|
|
14
|
+
function loadModelConfig(filePath, options = {}) {
|
|
15
|
+
if (typeof filePath !== "string" || filePath.trim().length === 0) {
|
|
16
|
+
throw new Error("agent-model: loadModelConfig requires a non-empty file path");
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const parsed = loadYamlFileSync(filePath, {
|
|
20
|
+
substituteEnv: options.substituteEnv !== false,
|
|
21
|
+
missingEnv: "keep",
|
|
22
|
+
cache: true
|
|
23
|
+
});
|
|
24
|
+
if (parsed == null) return null;
|
|
25
|
+
const source = parsed.spec ?? parsed;
|
|
26
|
+
return {
|
|
27
|
+
llm: source.llm ?? null,
|
|
28
|
+
vlm: source.vlm ?? null,
|
|
29
|
+
embed: source.embed ?? null,
|
|
30
|
+
runtime: {
|
|
31
|
+
check_connectivity: typeof source.runtime?.check_connectivity === "boolean" ? source.runtime.check_connectivity : void 0
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
} catch (e) {
|
|
35
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
36
|
+
throw new Error(`agent-model: failed to parse config file ${filePath}: ${msg}`, { cause: e });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/api/chat-model.ts
|
|
41
|
+
import * as AgentCommon from "@easynet/agent-common";
|
|
42
|
+
function applyDefaultToolChoice2(model) {
|
|
43
|
+
const fromCommon = AgentCommon.applyDefaultToolChoice;
|
|
44
|
+
if (typeof fromCommon === "function") {
|
|
45
|
+
fromCommon(model);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const target = model;
|
|
49
|
+
const original = target.bindTools?.bind(model);
|
|
50
|
+
if (!original) return;
|
|
51
|
+
target.bindTools = function(tools, opts) {
|
|
52
|
+
return original(tools, { ...opts, tool_choice: "auto" });
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/api/connectivity.ts
|
|
57
|
+
import {
|
|
58
|
+
buildUnreachableError,
|
|
59
|
+
checkEndpointConnectivity
|
|
60
|
+
} from "@easynet/agent-common";
|
|
61
|
+
var CIS_DEFAULT_RESOLVE_HOST = "s0010-ml-https.s0010.us-west-2.awswd";
|
|
62
|
+
var CIS_DEFAULT_RESOLVE_IP = "10.210.98.124";
|
|
63
|
+
function buildEndpointConnectivityOptions(config) {
|
|
64
|
+
const opts = config.options ?? config;
|
|
65
|
+
const provider = typeof config.provider === "string" ? config.provider : "";
|
|
66
|
+
const baseURL = config.baseURL;
|
|
67
|
+
const isCis = provider === "cis" || provider.includes("cis");
|
|
68
|
+
const useCisDefault = isCis && baseURL.includes(CIS_DEFAULT_RESOLVE_HOST) && opts?.resolveHost == null;
|
|
69
|
+
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;
|
|
70
|
+
const host = typeof opts?.host === "string" ? opts.host : resolveHost ? resolveHost.from : void 0;
|
|
71
|
+
if (resolveHost == null && host == null) return void 0;
|
|
72
|
+
const verifySSL = opts?.verifySSL === true;
|
|
73
|
+
const bypassAuth = opts?.bypassAuth !== false;
|
|
74
|
+
return {
|
|
75
|
+
resolveHost,
|
|
76
|
+
host,
|
|
77
|
+
verifySSL: resolveHost != null ? false : verifySSL ? true : void 0,
|
|
78
|
+
bypassAuth: bypassAuth ? true : void 0,
|
|
79
|
+
featureKey: typeof opts?.featureKey === "string" ? opts.featureKey : void 0
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function ensureConnectivity(resolvedLlmSection, options) {
|
|
83
|
+
let configs;
|
|
84
|
+
try {
|
|
85
|
+
const parsed = parseLlmSection(resolvedLlmSection ?? null);
|
|
86
|
+
configs = parsed.configs.filter(
|
|
87
|
+
(c) => typeof c.baseURL === "string" && c.baseURL.length > 0 && (c.baseURL.startsWith("http://") || c.baseURL.startsWith("https://")) && !c.baseURL.includes("${")
|
|
88
|
+
);
|
|
89
|
+
} catch {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const shouldCheck = options.checkConnectivity !== false && configs.length > 0;
|
|
93
|
+
if (!shouldCheck) return;
|
|
94
|
+
const report = (status) => options.onConnectionStatus?.(status);
|
|
95
|
+
const timeoutMs = options.connectivityTimeoutMs ?? 8e3;
|
|
96
|
+
for (const config of configs) {
|
|
97
|
+
const { id, baseURL } = config;
|
|
98
|
+
report({
|
|
99
|
+
phase: "checking",
|
|
100
|
+
endpointId: id,
|
|
101
|
+
baseURL,
|
|
102
|
+
message: "Checking connection..."
|
|
103
|
+
});
|
|
104
|
+
const endpointOpts = buildEndpointConnectivityOptions(config);
|
|
105
|
+
const result = await checkEndpointConnectivity(baseURL, {
|
|
106
|
+
timeoutMs,
|
|
107
|
+
...endpointOpts
|
|
108
|
+
});
|
|
109
|
+
if (result.reachable) {
|
|
110
|
+
report({
|
|
111
|
+
phase: "reachable",
|
|
112
|
+
endpointId: id,
|
|
113
|
+
baseURL,
|
|
114
|
+
message: result.message ?? "Connected"
|
|
115
|
+
});
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
report({
|
|
119
|
+
phase: "unreachable",
|
|
120
|
+
endpointId: id,
|
|
121
|
+
baseURL,
|
|
122
|
+
message: result.message ?? "Unreachable"
|
|
123
|
+
});
|
|
124
|
+
throw new Error(buildUnreachableError(id, baseURL, result.message));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export {
|
|
129
|
+
loadModelConfig,
|
|
130
|
+
applyDefaultToolChoice2 as applyDefaultToolChoice,
|
|
131
|
+
ensureConnectivity
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=chunk-OQPM73A7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/yaml-utils.ts","../src/config/loader.ts","../src/api/chat-model.ts","../src/api/connectivity.ts"],"sourcesContent":["export {\n loadYamlFile,\n loadYamlFileSync,\n parseYamlContent,\n clearYamlFileCache,\n type LoadYamlOptions,\n type YamlEnvOptions,\n} from \"@easynet/agent-common\";\n","/**\n * Load and parse LLM config from YAML (e.g. model.yaml).\n * Supports ${VAR} substitution from process.env.\n */\nimport { loadYamlFileSync, parseYamlContent } from \"./yaml-utils.js\";\n\nexport interface LoadLlmConfigOptions {\n substituteEnv?: boolean;\n}\n\nfunction substituteEnvInString(input: string): string {\n return input.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g, (_, key: string) => {\n return process.env[key] ?? `\\${${key}}`;\n });\n}\n\nexport function substituteEnv(input: unknown): unknown {\n if (typeof input === \"string\") return substituteEnvInString(input);\n if (Array.isArray(input)) return input.map((item) => substituteEnv(item));\n if (input && typeof input === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) out[k] = substituteEnv(v);\n return out;\n }\n return input;\n}\n\nexport function parseLlmYaml(\n content: string,\n options: LoadLlmConfigOptions = {}\n): unknown {\n const { substituteEnv: doSub = true } = options;\n const parsed = parseYamlContent<{ llm?: unknown; spec?: { llm?: unknown } }>(content, {\n substituteEnv: doSub,\n missingEnv: \"keep\",\n });\n const llm = parsed?.spec?.llm ?? parsed?.llm;\n if (llm == null) return undefined;\n return llm;\n}\n\nexport interface ModelConfigResult {\n llm: unknown;\n vlm: unknown;\n embed: unknown;\n runtime: { check_connectivity?: boolean };\n}\n\n/**\n * Load the full model.yaml config, returning llm, vlm, embed, and runtime sections.\n */\nexport function loadModelConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {},\n): ModelConfigResult | null {\n if (typeof filePath !== \"string\" || filePath.trim().length === 0) {\n throw new Error(\"agent-model: loadModelConfig requires a non-empty file path\");\n }\n try {\n const parsed = loadYamlFileSync<{\n llm?: unknown;\n vlm?: unknown;\n embed?: unknown;\n runtime?: Record<string, unknown>;\n spec?: {\n llm?: unknown;\n vlm?: unknown;\n embed?: unknown;\n runtime?: Record<string, unknown>;\n };\n }>(filePath, {\n substituteEnv: options.substituteEnv !== false,\n missingEnv: \"keep\",\n cache: true,\n });\n if (parsed == null) return null;\n const source = parsed.spec ?? parsed;\n return {\n llm: source.llm ?? null,\n vlm: source.vlm ?? null,\n embed: source.embed ?? null,\n runtime: {\n check_connectivity:\n typeof source.runtime?.check_connectivity === \"boolean\"\n ? source.runtime.check_connectivity\n : undefined,\n },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-model: failed to parse config file ${filePath}: ${msg}`, { cause: e });\n }\n}\n\n/**\n * Load only the llm section from a YAML config file.\n * @deprecated Use loadModelConfig() instead.\n */\nexport function loadLlmConfig(\n filePath: string,\n options: LoadLlmConfigOptions = {}\n): unknown | null {\n const result = loadModelConfig(filePath, options);\n return result?.llm ?? null;\n}\n","import type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport * as AgentCommon from \"@easynet/agent-common\";\n\n/**\n * Ensure bindTools always receives tool_choice: \"auto\" when tools are bound.\n * Fixes \"Tool choice is none, but model called a tool\" when using this model\n * with LangChain createAgent (AgentNode leaves tool_choice undefined for non-structured tools).\n * Mutates the model in place so it still passes isBaseChatModel / bindTools checks.\n */\nexport function applyDefaultToolChoice(model: BaseChatModel): void {\n const fromCommon = (AgentCommon as Record<string, unknown>).applyDefaultToolChoice;\n if (typeof fromCommon === \"function\") {\n (fromCommon as (value: unknown) => void)(model);\n return;\n }\n const target = model as {\n bindTools?: (tools: unknown, opts?: Record<string, unknown>) => unknown;\n };\n const original = target.bindTools?.bind(model);\n if (!original) return;\n target.bindTools = function (tools: unknown, opts?: Record<string, unknown>) {\n return original(tools, { ...opts, tool_choice: \"auto\" });\n };\n}\n","import {\n buildUnreachableError,\n checkEndpointConnectivity,\n type ConnectionStatus,\n type EndpointConnectivityOptions,\n} from \"@easynet/agent-common\";\nimport { parseLlmSection } from \"../model/llm-parser.js\";\nimport type { LLMConfig } from \"../model/types.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\nexport interface EnsureConnectivityOptions {\n checkConnectivity?: boolean;\n onConnectionStatus?: (status: ConnectionStatus) => void;\n connectivityTimeoutMs?: number;\n}\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 async function ensureConnectivity(\n resolvedLlmSection: unknown,\n options: EnsureConnectivityOptions\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\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 continue;\n }\n\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"],"mappings":"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","names":["applyDefaultToolChoice"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getChatModelFactory
|
|
3
|
-
} from "./chunk-G7MKWPEI.js";
|
|
4
1
|
import {
|
|
5
2
|
parseLlmSection
|
|
6
3
|
} from "./chunk-SPDXNDDD.js";
|
|
4
|
+
import {
|
|
5
|
+
getChatModelFactory
|
|
6
|
+
} from "./chunk-G7MKWPEI.js";
|
|
7
7
|
|
|
8
8
|
// src/langchain/openai-compatible.ts
|
|
9
9
|
import { ChatOpenAI } from "@langchain/openai";
|
|
@@ -151,4 +151,4 @@ export {
|
|
|
151
151
|
applyToolChoiceAuto,
|
|
152
152
|
createChatModelFromLlmConfig
|
|
153
153
|
};
|
|
154
|
-
//# sourceMappingURL=chunk-
|
|
154
|
+
//# sourceMappingURL=chunk-UVIUQUYJ.js.map
|
package/dist/cli/index.js
CHANGED
|
@@ -1,54 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
+
applyDefaultToolChoice,
|
|
4
|
+
ensureConnectivity,
|
|
3
5
|
loadModelConfig
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import {
|
|
6
|
-
buildUnreachableError,
|
|
7
|
-
checkEndpointConnectivity
|
|
8
|
-
} from "../chunk-AUQEXHUP.js";
|
|
6
|
+
} from "../chunk-OQPM73A7.js";
|
|
9
7
|
import {
|
|
10
8
|
resolveLlmSectionWithNpm
|
|
11
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-NAH4USJ2.js";
|
|
12
10
|
import {
|
|
13
11
|
createChatModelFromLlmConfig
|
|
14
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-UVIUQUYJ.js";
|
|
13
|
+
import "../chunk-SPDXNDDD.js";
|
|
15
14
|
import "../chunk-G7MKWPEI.js";
|
|
16
|
-
import {
|
|
17
|
-
parseLlmSection
|
|
18
|
-
} from "../chunk-SPDXNDDD.js";
|
|
19
|
-
import "../chunk-KE7IMUSA.js";
|
|
20
15
|
|
|
21
16
|
// src/api/create-agent-llm.ts
|
|
22
17
|
import { join } from "path";
|
|
23
|
-
function applyDefaultToolChoice(model) {
|
|
24
|
-
const m = model;
|
|
25
|
-
const orig = m.bindTools?.bind(model);
|
|
26
|
-
if (!orig) return;
|
|
27
|
-
m.bindTools = function(tools2, opts) {
|
|
28
|
-
return orig(tools2, { ...opts, tool_choice: "auto" });
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
var CIS_DEFAULT_RESOLVE_HOST = "s0010-ml-https.s0010.us-west-2.awswd";
|
|
32
|
-
var CIS_DEFAULT_RESOLVE_IP = "10.210.98.124";
|
|
33
|
-
function buildEndpointConnectivityOptions(config) {
|
|
34
|
-
const opts = config.options ?? config;
|
|
35
|
-
const provider = typeof config.provider === "string" ? config.provider : "";
|
|
36
|
-
const baseURL = config.baseURL;
|
|
37
|
-
const isCis = provider === "cis" || provider.includes("cis");
|
|
38
|
-
const useCisDefault = isCis && baseURL.includes(CIS_DEFAULT_RESOLVE_HOST) && opts?.resolveHost == null;
|
|
39
|
-
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;
|
|
40
|
-
const host = typeof opts?.host === "string" ? opts.host : resolveHost ? resolveHost.from : void 0;
|
|
41
|
-
if (resolveHost == null && host == null) return void 0;
|
|
42
|
-
const verifySSL = opts?.verifySSL === true;
|
|
43
|
-
const bypassAuth = opts?.bypassAuth !== false;
|
|
44
|
-
return {
|
|
45
|
-
resolveHost,
|
|
46
|
-
host,
|
|
47
|
-
verifySSL: resolveHost != null ? false : verifySSL ? true : void 0,
|
|
48
|
-
bypassAuth: bypassAuth ? true : void 0,
|
|
49
|
-
featureKey: typeof opts?.featureKey === "string" ? opts.featureKey : void 0
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
18
|
function resolveDefaultConfigPath() {
|
|
53
19
|
return join(process.cwd(), "model.yaml");
|
|
54
20
|
}
|
|
@@ -61,51 +27,6 @@ function normalizeError(e, context) {
|
|
|
61
27
|
if (e instanceof Error) return new Error(`${context}: ${e.message}`, { cause: e });
|
|
62
28
|
return new Error(`${context}: ${String(e)}`);
|
|
63
29
|
}
|
|
64
|
-
async function ensureConnectivity(resolvedLlmSection, options) {
|
|
65
|
-
let configs;
|
|
66
|
-
try {
|
|
67
|
-
const parsed = parseLlmSection(resolvedLlmSection ?? null);
|
|
68
|
-
configs = parsed.configs.filter(
|
|
69
|
-
(c) => typeof c.baseURL === "string" && c.baseURL.length > 0 && (c.baseURL.startsWith("http://") || c.baseURL.startsWith("https://")) && !c.baseURL.includes("${")
|
|
70
|
-
);
|
|
71
|
-
} catch {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
const shouldCheck = options.checkConnectivity !== false && configs.length > 0;
|
|
75
|
-
if (!shouldCheck) return;
|
|
76
|
-
const report = (status) => options.onConnectionStatus?.(status);
|
|
77
|
-
const timeoutMs = options.connectivityTimeoutMs ?? 8e3;
|
|
78
|
-
for (const config of configs) {
|
|
79
|
-
const { id, baseURL } = config;
|
|
80
|
-
report({
|
|
81
|
-
phase: "checking",
|
|
82
|
-
endpointId: id,
|
|
83
|
-
baseURL,
|
|
84
|
-
message: "Checking connection..."
|
|
85
|
-
});
|
|
86
|
-
const endpointOpts = buildEndpointConnectivityOptions(config);
|
|
87
|
-
const result = await checkEndpointConnectivity(baseURL, {
|
|
88
|
-
timeoutMs,
|
|
89
|
-
...endpointOpts
|
|
90
|
-
});
|
|
91
|
-
if (result.reachable) {
|
|
92
|
-
report({
|
|
93
|
-
phase: "reachable",
|
|
94
|
-
endpointId: id,
|
|
95
|
-
baseURL,
|
|
96
|
-
message: result.message ?? "Connected"
|
|
97
|
-
});
|
|
98
|
-
} else {
|
|
99
|
-
report({
|
|
100
|
-
phase: "unreachable",
|
|
101
|
-
endpointId: id,
|
|
102
|
-
baseURL,
|
|
103
|
-
message: result.message ?? "Unreachable"
|
|
104
|
-
});
|
|
105
|
-
throw new Error(buildUnreachableError(id, baseURL, result.message));
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
30
|
async function createAgentLlm(configPathOrOptions) {
|
|
110
31
|
try {
|
|
111
32
|
const options = normalizeOptions(configPathOrOptions);
|