@easynet/agent-llm 1.0.13 → 1.0.14
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 +4 -2
- package/dist/api/create-agent-llm.d.ts +15 -1
- package/dist/api/create-agent-llm.d.ts.map +1 -1
- package/dist/{chunk-MYGWM3YH.js → chunk-VHC4NEWF.js} +162 -8
- package/dist/chunk-VHC4NEWF.js.map +1 -0
- package/dist/cli/index.js +1 -1
- package/dist/connectivity/check.d.ts +20 -0
- package/dist/connectivity/check.d.ts.map +1 -0
- package/dist/connectivity/index.d.ts +6 -0
- package/dist/connectivity/index.d.ts.map +1 -0
- package/dist/connectivity/types.d.ts +24 -0
- package/dist/connectivity/types.d.ts.map +1 -0
- package/dist/extensions/index.d.ts +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/npm-protocol.d.ts +16 -1
- package/dist/extensions/npm-protocol.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-MYGWM3YH.js.map +0 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Load an LLM from **llm.yaml** for CLI or LangChain. Releases are automated via s
|
|
|
14
14
|
llm:
|
|
15
15
|
default: small
|
|
16
16
|
strong:
|
|
17
|
-
provider: npm:@scope/package-name@
|
|
17
|
+
provider: npm:@scope/package-name@1.0.0#provider-name
|
|
18
18
|
base_url: https://your-api.example.com
|
|
19
19
|
model: your-model
|
|
20
20
|
small:
|
|
@@ -75,11 +75,13 @@ Full runnable example: [examples/langchain-react-agent.ts](examples/langchain-re
|
|
|
75
75
|
|
|
76
76
|
Use a provider from an **npm package**. If the package is missing, the framework can install it and then load the provider.
|
|
77
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
|
+
|
|
78
80
|
Example in a named entry:
|
|
79
81
|
|
|
80
82
|
```yaml
|
|
81
83
|
strong:
|
|
82
|
-
provider: "npm:@scope/package-name@
|
|
84
|
+
provider: "npm:@scope/package-name@1.2.3#provider-name" # pinned; or omit version / use @latest to auto-resolve latest
|
|
83
85
|
base_url: https://your-api.example.com
|
|
84
86
|
model: your-model
|
|
85
87
|
```
|
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
import { createChatModelFromLlmConfig } from "../langchain/adapter.js";
|
|
2
|
+
import type { ConnectionStatus } from "../connectivity/types.js";
|
|
2
3
|
export interface CreateAgentLlMOptions {
|
|
3
4
|
/** Path to YAML config file. If omitted, uses llm.yaml in the current directory (cwd). */
|
|
4
5
|
configPath?: string;
|
|
5
6
|
/** If true (default), run npm install when provider is npm:<package> and package is not found. */
|
|
6
7
|
installNpmIfMissing?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* If true (default when any endpoint has baseURL), check connectivity to CIS/LLM endpoints before use.
|
|
10
|
+
* When unreachable, throws with a reminder to connect to Secure VPN.
|
|
11
|
+
*/
|
|
12
|
+
checkConnectivity?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Callback for real-time connection status (e.g. "checking", "reachable", "unreachable").
|
|
15
|
+
* Use this to display live status in the UI.
|
|
16
|
+
*/
|
|
17
|
+
onConnectionStatus?: (status: ConnectionStatus) => void;
|
|
18
|
+
/** Timeout in ms for each connectivity check. Default 8000. */
|
|
19
|
+
connectivityTimeoutMs?: number;
|
|
7
20
|
}
|
|
8
21
|
/**
|
|
9
22
|
* Create a LangChain-formatted LLM from config. Resolves npm: providers and optionally installs packages.
|
|
23
|
+
* Checks connectivity to CIS/LLM endpoints by default and reports real-time status via onConnectionStatus.
|
|
10
24
|
* - createAgentLlM() — uses llm.yaml in the current directory
|
|
11
25
|
* - createAgentLlM("path/to/llm.yaml") — use specific config file
|
|
12
|
-
* - createAgentLlM({ configPath: "...",
|
|
26
|
+
* - createAgentLlM({ configPath: "...", onConnectionStatus: (s) => console.log(s) }) — options object
|
|
13
27
|
*/
|
|
14
28
|
export declare function createAgentLlM(configPathOrOptions?: string | CreateAgentLlMOptions): Promise<ReturnType<typeof createChatModelFromLlmConfig>>;
|
|
15
29
|
//# sourceMappingURL=create-agent-llm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-agent-llm.d.ts","sourceRoot":"","sources":["../../src/api/create-agent-llm.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-agent-llm.d.ts","sourceRoot":"","sources":["../../src/api/create-agent-llm.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAYvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,qBAAqB;IACpC,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kGAAkG;IAClG,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxD,+DAA+D;IAC/D,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAgHD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,mBAAmB,CAAC,EAAE,MAAM,GAAG,qBAAqB,GACnD,OAAO,CAAC,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CA0B1D"}
|
|
@@ -597,8 +597,38 @@ async function loadDiscoveredExtensions(cwd = process.cwd()) {
|
|
|
597
597
|
}
|
|
598
598
|
|
|
599
599
|
// src/extensions/npm-protocol.ts
|
|
600
|
-
import {
|
|
600
|
+
import { execFileSync } from "child_process";
|
|
601
|
+
import { readFileSync as readFileSync3 } from "fs";
|
|
602
|
+
import { createRequire } from "module";
|
|
601
603
|
var NPM_PROTOCOL_PREFIX = "npm:";
|
|
604
|
+
var VERSION_LATEST = "latest";
|
|
605
|
+
async function getLatestVersion(packageName, options = {}) {
|
|
606
|
+
const cwd = options.cwd ?? process.cwd();
|
|
607
|
+
try {
|
|
608
|
+
const out = execFileSync("npm", ["view", packageName, "version"], {
|
|
609
|
+
cwd,
|
|
610
|
+
encoding: "utf-8",
|
|
611
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
612
|
+
});
|
|
613
|
+
const version = (out ?? "").trim();
|
|
614
|
+
if (!version) throw new Error("Empty version from npm view");
|
|
615
|
+
return version;
|
|
616
|
+
} catch (e) {
|
|
617
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
618
|
+
throw new Error(`agent-llm: failed to get latest version for "${packageName}": ${msg}`, { cause: e });
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
function getInstalledVersion(packageName, options = {}) {
|
|
622
|
+
const cwd = options.cwd ?? process.cwd();
|
|
623
|
+
const require2 = createRequire(import.meta.url);
|
|
624
|
+
try {
|
|
625
|
+
const p = require2.resolve(`${packageName}/package.json`, { paths: [cwd] });
|
|
626
|
+
const j = JSON.parse(readFileSync3(p, "utf-8"));
|
|
627
|
+
return typeof j.version === "string" ? j.version : null;
|
|
628
|
+
} catch {
|
|
629
|
+
return null;
|
|
630
|
+
}
|
|
631
|
+
}
|
|
602
632
|
function parseNpmProviderSpec(spec) {
|
|
603
633
|
if (typeof spec !== "string" || !spec.startsWith(NPM_PROTOCOL_PREFIX)) return null;
|
|
604
634
|
const rest = spec.slice(NPM_PROTOCOL_PREFIX.length);
|
|
@@ -616,26 +646,50 @@ function isNpmProviderSpec(spec) {
|
|
|
616
646
|
}
|
|
617
647
|
function isModuleNotFoundError(err) {
|
|
618
648
|
const msg = err instanceof Error ? err.message : String(err);
|
|
619
|
-
return msg.includes("Cannot find module") || msg.includes("Cannot find package") || msg.includes("MODULE_NOT_FOUND") || msg.includes("ERR_MODULE_NOT_FOUND");
|
|
649
|
+
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");
|
|
650
|
+
}
|
|
651
|
+
async function resolveInstallVersion(packageName, version, cwd) {
|
|
652
|
+
if (version === void 0 || version === "" || version === VERSION_LATEST) {
|
|
653
|
+
return getLatestVersion(packageName, { cwd });
|
|
654
|
+
}
|
|
655
|
+
return version;
|
|
620
656
|
}
|
|
621
657
|
async function ensureNpmPackageInstalled(packageName, options = {}) {
|
|
622
658
|
if (typeof packageName !== "string" || packageName.trim().length === 0) {
|
|
623
659
|
throw new Error("agent-llm: ensureNpmPackageInstalled requires a non-empty package name");
|
|
624
660
|
}
|
|
625
661
|
const cwd = options.cwd ?? process.cwd();
|
|
626
|
-
const
|
|
662
|
+
const requestedVersion = options.version;
|
|
663
|
+
const resolvedVersion = await resolveInstallVersion(packageName, requestedVersion, cwd);
|
|
627
664
|
try {
|
|
628
665
|
await import(
|
|
629
666
|
/* @vite-ignore */
|
|
630
667
|
packageName
|
|
631
668
|
);
|
|
669
|
+
const askedForLatest = requestedVersion === void 0 || requestedVersion === "" || requestedVersion === VERSION_LATEST;
|
|
670
|
+
if (askedForLatest && resolvedVersion !== void 0) {
|
|
671
|
+
const installed = getInstalledVersion(packageName, { cwd });
|
|
672
|
+
if (installed !== null && installed !== resolvedVersion) {
|
|
673
|
+
const installSpec2 = `${packageName}@${resolvedVersion}`;
|
|
674
|
+
try {
|
|
675
|
+
execFileSync("npm", ["install", installSpec2], {
|
|
676
|
+
cwd,
|
|
677
|
+
stdio: "inherit",
|
|
678
|
+
encoding: "utf-8"
|
|
679
|
+
});
|
|
680
|
+
} catch (e) {
|
|
681
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
682
|
+
throw new Error(`agent-llm: npm install failed for ${installSpec2}: ${msg}`, { cause: e });
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
}
|
|
632
686
|
return;
|
|
633
687
|
} catch (err) {
|
|
634
688
|
if (!isModuleNotFoundError(err)) throw err;
|
|
635
689
|
}
|
|
636
|
-
const installSpec =
|
|
690
|
+
const installSpec = resolvedVersion ? `${packageName}@${resolvedVersion}` : packageName;
|
|
637
691
|
try {
|
|
638
|
-
|
|
692
|
+
execFileSync("npm", ["install", installSpec], {
|
|
639
693
|
cwd,
|
|
640
694
|
stdio: "inherit",
|
|
641
695
|
encoding: "utf-8"
|
|
@@ -752,6 +806,50 @@ async function createChatModelFromLlmConfigWithNpm(options) {
|
|
|
752
806
|
}
|
|
753
807
|
}
|
|
754
808
|
|
|
809
|
+
// src/connectivity/check.ts
|
|
810
|
+
var DEFAULT_TIMEOUT_MS = 8e3;
|
|
811
|
+
function probeUrl(baseURL) {
|
|
812
|
+
const base = baseURL.replace(/\/+$/, "");
|
|
813
|
+
if (base.endsWith("/v1")) return `${base}/models`;
|
|
814
|
+
return base.includes("/v1") ? `${base}/models` : `${base}/v1/models`;
|
|
815
|
+
}
|
|
816
|
+
async function checkEndpointConnectivity(baseURL, options) {
|
|
817
|
+
const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
818
|
+
const url = probeUrl(baseURL);
|
|
819
|
+
const controller = new AbortController();
|
|
820
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
821
|
+
try {
|
|
822
|
+
const res = await fetch(url, {
|
|
823
|
+
method: "GET",
|
|
824
|
+
signal: controller.signal,
|
|
825
|
+
headers: { Accept: "application/json" }
|
|
826
|
+
});
|
|
827
|
+
clearTimeout(timeoutId);
|
|
828
|
+
return {
|
|
829
|
+
reachable: true,
|
|
830
|
+
message: res.ok ? "OK" : `HTTP ${res.status}`,
|
|
831
|
+
statusCode: res.status
|
|
832
|
+
};
|
|
833
|
+
} catch (err) {
|
|
834
|
+
clearTimeout(timeoutId);
|
|
835
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
836
|
+
const isTimeout = err instanceof Error && err.name === "AbortError";
|
|
837
|
+
return {
|
|
838
|
+
reachable: false,
|
|
839
|
+
message: isTimeout ? "Connection timed out" : message || "Connection failed"
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
var CIS_UNREACHABLE_REMINDER = "Please ensure you are connected to Secure VPN and try again.";
|
|
844
|
+
function buildUnreachableError(endpointId, baseURL, detail) {
|
|
845
|
+
const parts = [
|
|
846
|
+
`Cannot connect to CIS (endpoint: ${endpointId}, base URL: ${baseURL}).`,
|
|
847
|
+
detail && ` ${detail}`,
|
|
848
|
+
` ${CIS_UNREACHABLE_REMINDER}`
|
|
849
|
+
];
|
|
850
|
+
return parts.filter(Boolean).join("").trim();
|
|
851
|
+
}
|
|
852
|
+
|
|
755
853
|
// src/api/create-agent-llm.ts
|
|
756
854
|
import { join as join2 } from "path";
|
|
757
855
|
function resolveDefaultConfigPath() {
|
|
@@ -767,6 +865,51 @@ function normalizeAgentLlMError3(e, context) {
|
|
|
767
865
|
if (e instanceof Error) return new Error(`${context}: ${e.message}`, { cause: e });
|
|
768
866
|
return new Error(`${context}: ${String(e)}`);
|
|
769
867
|
}
|
|
868
|
+
async function ensureConnectivity(resolvedLlmSection, options) {
|
|
869
|
+
let configs;
|
|
870
|
+
try {
|
|
871
|
+
const parsed = parseLlmSection(resolvedLlmSection ?? null);
|
|
872
|
+
configs = parsed.configs.filter(
|
|
873
|
+
(c) => typeof c.baseURL === "string" && c.baseURL.length > 0
|
|
874
|
+
);
|
|
875
|
+
} catch {
|
|
876
|
+
return;
|
|
877
|
+
}
|
|
878
|
+
const shouldCheck = options.checkConnectivity !== false && configs.length > 0;
|
|
879
|
+
if (!shouldCheck) return;
|
|
880
|
+
const report = (status) => {
|
|
881
|
+
options.onConnectionStatus?.(status);
|
|
882
|
+
};
|
|
883
|
+
const timeoutMs = options.connectivityTimeoutMs ?? 8e3;
|
|
884
|
+
for (const config of configs) {
|
|
885
|
+
const { id, baseURL } = config;
|
|
886
|
+
report({
|
|
887
|
+
phase: "checking",
|
|
888
|
+
endpointId: id,
|
|
889
|
+
baseURL,
|
|
890
|
+
message: "Checking CIS connection..."
|
|
891
|
+
});
|
|
892
|
+
const result = await checkEndpointConnectivity(baseURL, { timeoutMs });
|
|
893
|
+
if (result.reachable) {
|
|
894
|
+
report({
|
|
895
|
+
phase: "reachable",
|
|
896
|
+
endpointId: id,
|
|
897
|
+
baseURL,
|
|
898
|
+
message: result.message ?? "Connected"
|
|
899
|
+
});
|
|
900
|
+
} else {
|
|
901
|
+
report({
|
|
902
|
+
phase: "unreachable",
|
|
903
|
+
endpointId: id,
|
|
904
|
+
baseURL,
|
|
905
|
+
message: result.message ?? "Unreachable"
|
|
906
|
+
});
|
|
907
|
+
throw new Error(
|
|
908
|
+
buildUnreachableError(id, baseURL, result.message)
|
|
909
|
+
);
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
}
|
|
770
913
|
async function createAgentLlM(configPathOrOptions) {
|
|
771
914
|
try {
|
|
772
915
|
const options = normalizeCreateOptions(configPathOrOptions);
|
|
@@ -775,13 +918,19 @@ async function createAgentLlM(configPathOrOptions) {
|
|
|
775
918
|
if (llmSection == null) {
|
|
776
919
|
throw new Error(`No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`);
|
|
777
920
|
}
|
|
778
|
-
|
|
779
|
-
llmSection,
|
|
921
|
+
const resolvedSection = await resolveLlmSectionWithNpm(llmSection, {
|
|
780
922
|
installNpmIfMissing: options.installNpmIfMissing !== false,
|
|
781
923
|
cwd: process.cwd()
|
|
782
924
|
});
|
|
925
|
+
await ensureConnectivity(resolvedSection, {
|
|
926
|
+
checkConnectivity: options.checkConnectivity,
|
|
927
|
+
onConnectionStatus: options.onConnectionStatus,
|
|
928
|
+
connectivityTimeoutMs: options.connectivityTimeoutMs
|
|
929
|
+
});
|
|
930
|
+
return createChatModelFromLlmConfig({ llmSection: resolvedSection });
|
|
783
931
|
} catch (e) {
|
|
784
932
|
if (e instanceof Error && e.message.includes("No LLM config")) throw e;
|
|
933
|
+
if (e instanceof Error && e.message.includes("Cannot connect to CIS")) throw e;
|
|
785
934
|
throw normalizeAgentLlMError3(e, "agent-llm: createAgentLlM failed");
|
|
786
935
|
}
|
|
787
936
|
}
|
|
@@ -804,12 +953,17 @@ export {
|
|
|
804
953
|
loadLLMExtensions,
|
|
805
954
|
loadDiscoveredExtensions,
|
|
806
955
|
NPM_PROTOCOL_PREFIX,
|
|
956
|
+
getLatestVersion,
|
|
957
|
+
getInstalledVersion,
|
|
807
958
|
parseNpmProviderSpec,
|
|
808
959
|
isNpmProviderSpec,
|
|
809
960
|
ensureNpmPackageInstalled,
|
|
810
961
|
resolveNpmProvider,
|
|
811
962
|
resolveLlmSectionWithNpm,
|
|
812
963
|
createChatModelFromLlmConfigWithNpm,
|
|
964
|
+
checkEndpointConnectivity,
|
|
965
|
+
CIS_UNREACHABLE_REMINDER,
|
|
966
|
+
buildUnreachableError,
|
|
813
967
|
createAgentLlM
|
|
814
968
|
};
|
|
815
|
-
//# sourceMappingURL=chunk-
|
|
969
|
+
//# sourceMappingURL=chunk-VHC4NEWF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/parser.ts","../src/config/loader.ts","../src/providers/openai.ts","../src/providers/index.ts","../src/registry/chat-model.ts","../src/langchain/adapter.ts","../src/extensions/loader.ts","../src/extensions/npm-protocol.ts","../src/connectivity/check.ts","../src/api/create-agent-llm.ts"],"sourcesContent":["/**\n * Parse agent.yaml llm section into normalized LLMConfig[] and default id.\n * Supports: flat (each model keyed by name), instances[], or single object.\n */\n\nimport type { LLMConfig } from \"../types.js\";\n\nconst DEFAULT_LLM_ID = \"default\";\n\nconst RESERVED_KEYS = new Set([\n \"default\",\n \"instances\",\n \"catalog\",\n \"provider\",\n \"model\",\n \"temperature\",\n \"apiKey\",\n \"baseURL\",\n \"base_url\",\n \"type\",\n \"id\",\n]);\n\n/**\n * Parse llm section: flat (each model keyed by name), default+instances, or single object.\n */\nexport function parseLlmSection(section: unknown): { defaultId: string; configs: LLMConfig[] } {\n if (section == null || typeof section !== \"object\") {\n return { defaultId: DEFAULT_LLM_ID, configs: [] };\n }\n\n if (Array.isArray(section)) {\n const configs = section\n .filter((i): i is Record<string, unknown> => i != null && typeof i === \"object\")\n .map((item, i) => normalizeLlmConfig({ ...item, id: item.id ?? item.name ?? String(i) }))\n .filter((c): c is LLMConfig => c != null);\n const defaultId = configs.length > 0 ? configs[0]!.id : DEFAULT_LLM_ID;\n return { defaultId, configs };\n }\n\n const s = section as Record<string, unknown>;\n\n const flatEntries = Object.entries(s).filter(\n ([k, v]) => !RESERVED_KEYS.has(k) && v != null && typeof v === \"object\" && !Array.isArray(v)\n );\n if (flatEntries.length > 0) {\n const configs: LLMConfig[] = [];\n for (const [id, entry] of flatEntries) {\n const c = entryToLlmConfig(id, entry as Record<string, unknown>);\n if (c) configs.push(c);\n }\n const defaultId =\n typeof s.default === \"string\" && s.default && flatEntries.some(([k]) => k === s.default)\n ? s.default\n : configs.length > 0\n ? configs[0]!.id\n : DEFAULT_LLM_ID;\n return { defaultId, configs };\n }\n\n if (Array.isArray(s.instances)) {\n const configs = (s.instances as unknown[])\n .filter((i): i is Record<string, unknown> => i != null && typeof i === \"object\")\n .map((i) => normalizeLlmConfig(i))\n .filter((c): c is LLMConfig => c != null);\n const defaultId =\n typeof s.default === \"string\" && s.default\n ? s.default\n : configs.length > 0\n ? configs[0]!.id\n : DEFAULT_LLM_ID;\n return { defaultId, configs };\n }\n\n if (typeof s.provider === \"string\" || typeof s.model === \"string\" || typeof (s as { name?: string }).name === \"string\") {\n const one = singleObjectToLlmConfig(s);\n return { defaultId: one.id, configs: [one] };\n }\n\n return { defaultId: DEFAULT_LLM_ID, configs: [] };\n}\n\nconst EXTENSION_OPTION_KEYS = [\"featureKey\", \"tenant\", \"authToken\", \"verifySSL\", \"bypassAuth\", \"host\", \"resolveHost\", \"timeoutMs\", \"options\"];\n\nfunction entryToLlmConfig(id: string, entry: Record<string, unknown>): LLMConfig | null {\n const opts = entry.options as Record<string, unknown> | undefined;\n const baseURL =\n typeof entry.base_url === \"string\"\n ? entry.base_url\n : typeof entry.baseURL === \"string\"\n ? entry.baseURL\n : undefined;\n const model = typeof entry.name === \"string\" ? entry.name : typeof entry.model === \"string\" ? entry.model : undefined;\n const provider = typeof entry.provider === \"string\" && entry.provider ? entry.provider : \"openai\";\n const config: LLMConfig = {\n id,\n type: \"chat\",\n provider,\n model,\n temperature: typeof opts?.temperature === \"number\" ? opts.temperature : typeof entry.temperature === \"number\" ? entry.temperature : undefined,\n apiKey: typeof opts?.apiKey === \"string\" ? opts.apiKey : typeof entry.apiKey === \"string\" ? entry.apiKey : undefined,\n baseURL,\n };\n if (typeof entry.type === \"string\" && entry.type === \"image\") config.type = \"image\";\n if (opts && typeof opts === \"object\") (config as Record<string, unknown>).options = opts;\n for (const k of EXTENSION_OPTION_KEYS) {\n if (entry[k] !== undefined) (config as Record<string, unknown>)[k] = entry[k];\n else if (opts && opts[k] !== undefined) (config as Record<string, unknown>)[k] = opts[k];\n }\n return config;\n}\n\nfunction singleObjectToLlmConfig(s: Record<string, unknown>): LLMConfig {\n const one: LLMConfig = {\n id: DEFAULT_LLM_ID,\n type: \"chat\",\n provider: typeof s.provider === \"string\" ? s.provider : \"openai\",\n model: typeof s.model === \"string\" ? s.model : (typeof (s as { name?: string }).name === \"string\" ? (s as { name: string }).name : undefined),\n temperature: typeof s.temperature === \"number\" ? s.temperature : undefined,\n apiKey: typeof s.apiKey === \"string\" ? s.apiKey : undefined,\n baseURL:\n typeof s.baseURL === \"string\" ? s.baseURL : typeof s.base_url === \"string\" ? s.base_url : undefined,\n };\n Object.keys(s).forEach((k) => {\n if (![\"id\", \"type\", \"provider\", \"model\", \"name\", \"temperature\", \"apiKey\", \"baseURL\", \"base_url\", \"default\", \"instances\"].includes(k)) {\n (one as Record<string, unknown>)[k] = s[k];\n }\n });\n return one;\n}\n\nfunction normalizeLlmConfig(o: Record<string, unknown>): LLMConfig | null {\n const id = typeof o.id === \"string\" && o.id ? o.id : DEFAULT_LLM_ID;\n const type = o.type === \"image\" ? \"image\" : \"chat\";\n const provider = typeof o.provider === \"string\" && o.provider ? o.provider : \"openai\";\n const opts = o.options as Record<string, unknown> | undefined;\n const config: LLMConfig = {\n id,\n type,\n provider,\n model: typeof o.model === \"string\" ? o.model : (typeof o.name === \"string\" ? o.name : undefined),\n temperature:\n typeof o.temperature === \"number\"\n ? o.temperature\n : typeof opts?.temperature === \"number\"\n ? opts.temperature\n : undefined,\n apiKey:\n typeof o.apiKey === \"string\"\n ? o.apiKey\n : typeof opts?.apiKey === \"string\"\n ? opts.apiKey\n : undefined,\n baseURL: typeof o.baseURL === \"string\" ? o.baseURL : (typeof o.base_url === \"string\" ? o.base_url : undefined),\n };\n Object.keys(o).forEach((k) => {\n if (![\"id\", \"type\", \"provider\", \"model\", \"name\", \"temperature\", \"apiKey\", \"baseURL\", \"base_url\"].includes(k)) {\n (config as Record<string, unknown>)[k] = o[k];\n }\n });\n return config;\n}\n","/**\n * Load and parse LLM config from YAML (e.g. llm.yaml).\n * Supports ${VAR} substitution from process.env.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\n\nexport interface LoadLlmConfigOptions {\n /** Replace ${VAR} with process.env.VAR. Default true. */\n substituteEnv?: boolean;\n}\n\n/**\n * Recursively replace ${VAR} in strings with process.env.VAR.\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\n/**\n * Parse YAML string and return the llm section (top-level key \"llm\").\n * Returns undefined if content has no llm key.\n */\nexport function parseLlmYaml(\n content: string,\n options: LoadLlmConfigOptions = {}\n): unknown {\n const { substituteEnv: doSub = true } = options;\n const parsed = parseYaml(content) as { llm?: unknown };\n const llm = parsed?.llm;\n if (llm == null) return undefined;\n return doSub ? substituteEnv(llm) : llm;\n}\n\n/**\n * Load LLM config from a YAML file (e.g. llm.yaml in current directory).\n * Returns the llm section for use with createChatModelFromLlmConfig or parseLlmSection.\n * Returns null if file does not exist or has no llm key.\n * Throws with clear message if file exists but read or parse fails.\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 if (!existsSync(filePath)) return null;\n let raw: string;\n try {\n raw = readFileSync(filePath, \"utf8\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: failed to read config file ${filePath}: ${msg}`, { cause: e });\n }\n try {\n const llm = parseLlmYaml(raw, options);\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 * OpenAI-compatible format: chat (/v1/chat/completions) and image.\n * Supports baseURL for Azure, local proxy, and other compatible endpoints.\n */\n\nimport OpenAI from \"openai\";\nimport type {\n LLMConfig,\n ChatMessage,\n ChatResult,\n ImageResult,\n ILLMClient,\n ChatWithToolsMessage,\n ChatWithToolsResult,\n ToolDefinition,\n ChatStreamChunk,\n ChatWithToolsStreamChunk,\n} from \"../types.js\";\n\nfunction getApiKey(config: LLMConfig): string {\n const key = config.apiKey ?? process.env.OPENAI_API_KEY ?? \"\";\n if (!key) throw new Error(\"OpenAI-compatible apiKey required (config.apiKey or OPENAI_API_KEY)\");\n return key;\n}\n\nfunction createOpenAIClientOptions(config: LLMConfig): { apiKey: string; baseURL?: string } {\n const opts: { apiKey: string; baseURL?: string } = { apiKey: getApiKey(config) };\n if (typeof config.baseURL === \"string\" && config.baseURL) opts.baseURL = config.baseURL;\n return opts;\n}\n\nfunction serializeMessage(\n m: ChatWithToolsMessage\n): OpenAI.Chat.Completions.ChatCompletionMessageParam {\n if (m.role === \"tool\")\n return { role: \"tool\", content: m.content, tool_call_id: m.tool_call_id };\n if (m.role === \"assistant\" && \"tool_calls\" in m && m.tool_calls?.length) {\n return {\n role: \"assistant\",\n content: m.content ?? null,\n tool_calls: m.tool_calls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.function.name, arguments: tc.function.arguments },\n })),\n };\n }\n return { role: m.role, content: (m as ChatMessage).content };\n}\n\nexport function createOpenAIChatClient(config: LLMConfig): ILLMClient {\n const client = new OpenAI(createOpenAIClientOptions(config));\n const model = config.model ?? process.env.OPENAI_MODEL ?? \"gpt-4o-mini\";\n const temperature = config.temperature ?? 0;\n\n return {\n id: config.id,\n type: \"chat\",\n async chat(messages: ChatMessage[]): Promise<ChatResult> {\n const resp = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n });\n const content = resp.choices[0]?.message?.content ?? \"\";\n const usage = resp.usage\n ? { promptTokens: resp.usage.prompt_tokens, completionTokens: resp.usage.completion_tokens }\n : undefined;\n return { content, usage };\n },\n async *chatStream(messages: ChatMessage[]): AsyncGenerator<ChatStreamChunk, void, unknown> {\n const stream = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n stream: true,\n });\n\n let usage: { promptTokens?: number; completionTokens?: number } | undefined;\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n const content = delta?.content ?? \"\";\n const finishReason = chunk.choices[0]?.finish_reason;\n\n // Capture usage from the final chunk if available\n if (chunk.usage) {\n usage = {\n promptTokens: chunk.usage.prompt_tokens,\n completionTokens: chunk.usage.completion_tokens,\n };\n }\n\n yield {\n content,\n done: finishReason !== null && finishReason !== undefined,\n usage,\n };\n }\n },\n async chatWithTools(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n _options?: { timeoutMs?: number }\n ): Promise<ChatWithToolsResult> {\n const resp = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map(serializeMessage),\n tools: tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.function.name,\n description: t.function.description,\n parameters: (t.function.parameters ?? undefined) as Record<string, unknown> | undefined,\n },\n })),\n });\n const msg = resp.choices[0]?.message;\n const usage = resp.usage\n ? { promptTokens: resp.usage.prompt_tokens, completionTokens: resp.usage.completion_tokens }\n : undefined;\n return {\n message: {\n role: \"assistant\",\n content: msg?.content ?? null,\n tool_calls: msg?.tool_calls?.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n },\n })),\n },\n usage,\n };\n },\n async *chatWithToolsStream(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n _options?: { timeoutMs?: number }\n ): AsyncGenerator<ChatWithToolsStreamChunk, void, unknown> {\n const stream = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map(serializeMessage),\n tools: tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.function.name,\n description: t.function.description,\n parameters: (t.function.parameters ?? undefined) as Record<string, unknown> | undefined,\n },\n })),\n stream: true,\n stream_options: { include_usage: true },\n });\n\n let usage: { promptTokens?: number; completionTokens?: number } | undefined;\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n const finishReason = chunk.choices[0]?.finish_reason;\n\n // Capture usage from the final chunk if available\n if (chunk.usage) {\n usage = {\n promptTokens: chunk.usage.prompt_tokens,\n completionTokens: chunk.usage.completion_tokens,\n };\n }\n\n const toolCalls = delta?.tool_calls?.map((tc) => ({\n index: tc.index,\n id: tc.id,\n type: tc.type as \"function\" | undefined,\n function: tc.function\n ? {\n name: tc.function.name,\n arguments: tc.function.arguments,\n }\n : undefined,\n }));\n\n yield {\n delta: {\n role: delta?.role as \"assistant\" | undefined,\n content: delta?.content ?? null,\n tool_calls: toolCalls,\n },\n done: finishReason !== null && finishReason !== undefined,\n usage,\n };\n }\n },\n };\n}\n\nexport function createOpenAIImageClient(config: LLMConfig): ILLMClient {\n const client = new OpenAI(createOpenAIClientOptions(config));\n const model = (config.model as string) ?? \"dall-e-3\";\n\n return {\n id: config.id,\n type: \"image\",\n async chat(): Promise<ChatResult> {\n throw new Error(\"OpenAI image model does not support chat; use generateImage()\");\n },\n async generateImage(options: { prompt: string; size?: string; n?: number }): Promise<ImageResult> {\n const resp = await client.images.generate({\n model,\n prompt: options.prompt,\n size: (options.size as \"1024x1024\" | \"1792x1024\" | \"1024x1792\") ?? \"1024x1024\",\n n: options.n ?? 1,\n response_format: \"url\",\n });\n const url = resp.data?.[0]?.url ?? undefined;\n return { url };\n },\n };\n}\n\nexport function createOpenAIClient(config: LLMConfig): ILLMClient {\n if (config.type === \"image\") return createOpenAIImageClient(config);\n return createOpenAIChatClient(config);\n}\n","/**\n * Supports OpenAI-compatible and extension providers.\n */\n\nimport type { LLMConfig, ILLMClient } from \"../types.js\";\nimport { createOpenAIClient } from \"./openai.js\";\n\nconst OPENAI_COMPATIBLE = \"openai-compatible\";\n\nfunction createOpenAICompat(config: LLMConfig): ILLMClient {\n return createOpenAIClient(config);\n}\n\nconst PROVIDERS: Record<string, (config: LLMConfig) => ILLMClient> = {\n openai: createOpenAICompat,\n [OPENAI_COMPATIBLE]: createOpenAICompat,\n};\n\nexport function createClient(config: LLMConfig): ILLMClient {\n const p = (config.provider ?? \"\").toLowerCase();\n const fn = PROVIDERS[p];\n if (!fn) {\n const supported = [...new Set([...Object.keys(PROVIDERS), \"extension providers\"])].sort().join(\", \");\n throw new Error(\n `Unsupported LLM provider: ${config.provider}. Supported: ${supported}.`\n );\n }\n return fn(config);\n}\n\nexport function registerProvider(name: string, factory: (config: LLMConfig) => ILLMClient): void {\n PROVIDERS[name.toLowerCase()] = factory;\n}\n","/**\n * Registry for LangChain ChatModel by provider name.\n * Extensions register via registerChatModelProvider; llmAdapter uses getChatModelFactory.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { LLMConfig } from \"../types.js\";\n\nexport type ChatModelFactory = (config: LLMConfig) => BaseChatModel;\n\nconst CHAT_MODEL_FACTORIES = new Map<string, ChatModelFactory>();\n\n/**\n * Register a ChatModel factory for a provider name.\n * Called by extensions (e.g. wallee-llm) on load.\n */\nexport function registerChatModelProvider(providerName: string, factory: ChatModelFactory): void {\n CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);\n}\n\n/**\n * Get the ChatModel factory for a provider name, if registered.\n */\nexport function getChatModelFactory(providerName: string): ChatModelFactory | undefined {\n return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());\n}\n","/**\n * Build LangChain ChatModel from agent.yaml llm section.\n * Supports single object, default + instances, and flat keyed configs.\n * When provider is registered by an extension, uses that extension's ChatModel;\n * otherwise uses ChatOpenAI.\n */\n\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { parseLlmSection } from \"../config/parser.js\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\n\nconst DEFAULT_MODEL = \"gpt-4o-mini\";\n\nexport interface CreateChatModelFromLlmConfigOptions {\n /** agent.yaml llm section (raw or parsed); compatible with AgentConfigLlmSection / AgentConfigLlm */\n llmSection?: unknown;\n /** Override model from env */\n modelEnv?: string;\n /** Override API key from env */\n apiKeyEnv?: string;\n}\n\nfunction normalizeAgentLlMError(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 ChatModel when available; otherwise ChatOpenAI.\n */\nexport function createChatModelFromLlmConfig(\n options: CreateChatModelFromLlmConfigOptions\n): BaseChatModel {\n const { llmSection, modelEnv, apiKeyEnv } = options;\n let defaultId: string;\n let configs: ReturnType<typeof parseLlmSection>[\"configs\"];\n try {\n const parsed = parseLlmSection(llmSection ?? null);\n defaultId = parsed.defaultId;\n configs = parsed.configs;\n } catch (e) {\n throw normalizeAgentLlMError(e, \"agent-llm: failed to parse llm section\");\n }\n const defaultConfig = configs.find((c) => c.id === defaultId) ?? configs[0];\n\n if (!defaultConfig) {\n const model =\n modelEnv ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n const apiKey = apiKeyEnv ?? process.env.OPENAI_API_KEY;\n try {\n return new ChatOpenAI({\n model,\n temperature: 0,\n ...(apiKey ? { apiKey } : {}),\n });\n } catch (e) {\n throw normalizeAgentLlMError(e, \"agent-llm: failed to create default ChatOpenAI\");\n }\n }\n\n const provider = (defaultConfig as { provider?: string }).provider ?? \"openai\";\n const chatModelFactory = getChatModelFactory(provider);\n if (chatModelFactory) {\n const config = {\n ...defaultConfig,\n model: modelEnv ?? defaultConfig.model,\n temperature:\n typeof defaultConfig.temperature === \"number\"\n ? defaultConfig.temperature\n : 0,\n };\n try {\n return chatModelFactory(config);\n } catch (e) {\n throw normalizeAgentLlMError(e, `agent-llm: failed to create ChatModel for provider \"${provider}\"`);\n }\n }\n\n const model =\n modelEnv ??\n defaultConfig?.model ??\n process.env.OPENAI_MODEL ??\n DEFAULT_MODEL;\n\n let apiKey =\n apiKeyEnv ?? defaultConfig?.apiKey ?? process.env.OPENAI_API_KEY;\n let baseURL = defaultConfig?.baseURL;\n // OpenAI client appends path (e.g. /chat/completions) to baseURL; Ollama and OpenAI-compatible APIs expect /v1/chat/completions.\n if (baseURL && !baseURL.replace(/\\/$/, \"\").endsWith(\"/v1\")) {\n baseURL = baseURL.replace(/\\/$/, \"\") + \"/v1\";\n }\n // OpenAI client throws if apiKey is undefined; Ollama and many compatible endpoints accept a dummy.\n if (baseURL && apiKey === undefined) {\n apiKey = \"ollama\";\n }\n\n const temperature =\n typeof defaultConfig?.temperature === \"number\" ? defaultConfig.temperature : 0;\n\n const constructorOptions: ConstructorParameters<typeof ChatOpenAI>[0] = {\n model,\n temperature,\n ...(apiKey ? { apiKey } : {}),\n ...(baseURL ? { configuration: { baseURL } } : {}),\n };\n\n try {\n return new ChatOpenAI(constructorOptions);\n } catch (e) {\n throw normalizeAgentLlMError(e, \"agent-llm: failed to create ChatOpenAI from config\");\n }\n}\n","/**\n * Load LLM extensions by npm package name or by dynamic discovery.\n * Extensions implement ILLMExtension (getLLMExtension()). Framework does registration so extension need not call register.\n */\n\nimport { readdirSync, readFileSync, existsSync } from \"node:fs\";\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 { registerProvider } from \"../providers/index.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 hasFactories = typeof e.createClient === \"function\" && typeof e.createChatModel === \"function\";\n return hasRegister || hasFactories;\n}\n\nfunction registerExtension(ext: ILLMExtension): void {\n if (typeof ext.createClient === \"function\" && typeof ext.createChatModel === \"function\") {\n registerProvider(ext.providerName, ext.createClient);\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\n/**\n * Resolve llm.type to a list of npm package names to load.\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\n/**\n * Scan node_modules (optionally under cwd) for packages that declare agent-llm provider.\n * A package is included if package.json has \"agentLlmProvider\": true or keywords includes \"agent-llm-provider\".\n * @param cwd Directory containing node_modules; default process.cwd()\n * @returns List of package names that can be passed to loadLLMExtensions()\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.agentLlmProvider === 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\n/**\n * Load a module from a package directory (e.g. cwd/node_modules/packageName).\n * Reads package.json \"main\" and imports that file.\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\nexport interface LoadLLMExtensionsOptions {\n /** If set, try loading each package from cwd/node_modules/<package> first (so npx @easynet/agent-llm from a project dir finds local provider). */\n cwd?: string;\n}\n\n/**\n * Load LLM extensions by npm package name.\n * Prefers ILLMExtension (getLLMExtension() or default export); falls back to registerLLMExtension().\n * When options.cwd is set, tries loading from cwd/node_modules/<package> first so running from a provider project (e.g. wallee-llm) uses the local package.\n * Safe to call multiple times; each package is loaded at most once.\n * @param extensionPackages npm package names; when omitted, loads none\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 // Try loading from cwd/node_modules first, or from cwd itself when cwd is the provider project (e.g. running from wallee-llm repo)\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 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 // extension not installed or load failed — continue with other packages (fault tolerance)\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\n/**\n * Discover provider packages in node_modules and load them.\n * Equivalent to loadLLMExtensions(discoverLLMExtensions(cwd)).\n * @param cwd Directory containing node_modules; default process.cwd()\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 model provider.\n * Format: npm:<package-name> or npm:<package-name>@<version> or npm:<package-name>#<provider-name> or npm:<package-name>@<version>#<provider-name>\n * When installNpmIfMissing is true, the framework will run npm install <package>[@version] if the package is not found.\n * We never use \"latest\" for installs: when version is omitted or \"latest\", we resolve the actual latest version from the registry and use that version number.\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { loadLLMExtensions } from \"./loader.js\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\nimport { createChatModelFromLlmConfig } from \"../langchain/adapter.js\";\nimport type { CreateChatModelFromLlmConfigOptions } from \"../langchain/adapter.js\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\n\nexport const NPM_PROTOCOL_PREFIX = \"npm:\";\n\n/** Version tag we never pass to npm install; we resolve it to a concrete version from the registry. */\nconst VERSION_LATEST = \"latest\";\n\n/**\n * Fetch the latest version of an npm package from the registry.\n * Uses `npm view <package> version` so the result matches what npm install would use.\n */\nexport async function getLatestVersion(\n packageName: string,\n options: { cwd?: string } = {}\n): Promise<string> {\n const cwd = options.cwd ?? process.cwd();\n try {\n const out = execFileSync(\"npm\", [\"view\", packageName, \"version\"], {\n cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const version = (out ?? \"\").trim();\n if (!version) throw new Error(\"Empty version from npm view\");\n return version;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: failed to get latest version for \"${packageName}\": ${msg}`, { cause: e });\n }\n}\n\n/**\n * Get the currently installed version of a package (from node_modules), or null if not found.\n */\nexport function getInstalledVersion(packageName: string, options: { cwd?: string } = {}): string | null {\n const cwd = options.cwd ?? process.cwd();\n const require = createRequire(import.meta.url);\n try {\n const p = require.resolve(`${packageName}/package.json`, { paths: [cwd] });\n const j = JSON.parse(readFileSync(p, \"utf-8\")) as { version?: string };\n return typeof j.version === \"string\" ? j.version : null;\n } catch {\n return null;\n }\n}\n\n/** Parse npm: spec into package name, optional version, and optional #provider fragment. */\nexport function parseNpmProviderSpec(spec: string): { packageName: string; version?: string; provider?: string } | null {\n if (typeof spec !== \"string\" || !spec.startsWith(NPM_PROTOCOL_PREFIX)) return null;\n const rest = spec.slice(NPM_PROTOCOL_PREFIX.length);\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx >= 0 ? rest.slice(0, hashIdx).trim() : rest.trim();\n const fragmentProvider = hashIdx >= 0 ? rest.slice(hashIdx + 1).trim() : null;\n // Extract version: last @ not part of scoped package (e.g. pkg@0.1.0 or @scope/pkg@1.0.0)\n const versionMatch = beforeHash.match(/@([^/]+)$/);\n const packageName = versionMatch ? beforeHash.slice(0, -versionMatch[0].length).trim() : beforeHash;\n const version = versionMatch ? versionMatch[1] : undefined;\n if (!packageName) return null;\n return { packageName, version, provider: fragmentProvider ?? undefined };\n}\n\nexport interface EnsureNpmPackageInstalledOptions {\n /** Version to install (e.g. 0.1.0). If omitted or \"latest\", we resolve the actual latest version from the registry and use that (we never pass \"latest\" to npm install). */\n version?: string;\n /** Working directory for npm install. Default: process.cwd() */\n cwd?: string;\n}\n\n/**\n * Check if a provider spec uses the npm: protocol.\n */\nexport function isNpmProviderSpec(spec: unknown): spec is string {\n return typeof spec === \"string\" && spec.startsWith(NPM_PROTOCOL_PREFIX);\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 * Resolve version for install: when undefined or \"latest\", fetch latest from registry; otherwise use as-is.\n * We never use \"latest\" for npm install — only concrete version numbers.\n */\nasync function resolveInstallVersion(\n packageName: string,\n version: string | undefined,\n cwd: string\n): Promise<string | undefined> {\n if (version === undefined || version === \"\" || version === VERSION_LATEST) {\n return getLatestVersion(packageName, { cwd });\n }\n return version;\n}\n\n/**\n * Ensure an npm package is installed: if it cannot be resolved, run npm install <packageName>[@version] from cwd.\n * When version is omitted or \"latest\", we resolve the actual latest version from the registry and install/upgrade to that (never use \"latest\" tag).\n * Call this before loading a provider package when the config uses npm:<package-name>[@version].\n */\nexport async function ensureNpmPackageInstalled(\n packageName: string,\n options: EnsureNpmPackageInstalledOptions = {}\n): Promise<void> {\n if (typeof packageName !== \"string\" || packageName.trim().length === 0) {\n throw new Error(\"agent-llm: ensureNpmPackageInstalled requires a non-empty package name\");\n }\n const cwd = options.cwd ?? process.cwd();\n const requestedVersion = options.version;\n const resolvedVersion = await resolveInstallVersion(packageName, requestedVersion, cwd);\n\n try {\n await import(/* @vite-ignore */ packageName);\n // When user asked for \"latest\" or no version, ensure we're on the latest (upgrade if installed is not latest).\n const askedForLatest =\n requestedVersion === undefined || requestedVersion === \"\" || requestedVersion === VERSION_LATEST;\n if (askedForLatest && resolvedVersion !== undefined) {\n const installed = getInstalledVersion(packageName, { cwd });\n if (installed !== null && installed !== resolvedVersion) {\n const installSpec = `${packageName}@${resolvedVersion}`;\n try {\n execFileSync(\"npm\", [\"install\", installSpec], {\n cwd,\n stdio: \"inherit\",\n encoding: \"utf-8\",\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: npm install failed for ${installSpec}: ${msg}`, { cause: e });\n }\n }\n }\n return;\n } catch (err) {\n if (!isModuleNotFoundError(err)) throw err;\n }\n\n // Package not found: install with resolved version (or package name only if no version requested and we didn't resolve)\n const installSpec = resolvedVersion ? `${packageName}@${resolvedVersion}` : packageName;\n try {\n execFileSync(\"npm\", [\"install\", installSpec], {\n cwd,\n stdio: \"inherit\",\n encoding: \"utf-8\",\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: npm install failed for ${installSpec}: ${msg}`, { cause: e });\n }\n}\n\nexport interface ResolveNpmProviderOptions {\n /** If true (default), run npm install <package> when the package is not found. */\n installNpmIfMissing?: boolean;\n /** Working directory for npm install. Default: process.cwd() */\n cwd?: string;\n}\n\n/**\n * Resolve an npm provider spec to the concrete provider name.\n * - npm:<package> → load package, use its default provider\n * - npm:<package>@<version> → load package@version, use its default provider\n * - npm:<package>#<provider> → load package, use provider from fragment\n * - npm:<package>@<version>#<provider> → load package@version, use provider from fragment\n * When installNpmIfMissing is true, installs the package (with optional version) if not found.\n * Returns the provider name to use, or null if spec is not npm: protocol.\n */\nfunction normalizeAgentLlMError(e: unknown, context: string): Error {\n if (e instanceof Error) {\n return new Error(`${context}: ${e.message}`, { cause: e });\n }\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\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 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 normalizeAgentLlMError(installErr, `agent-llm: failed to install or load npm provider \"${packageName}\"`);\n }\n } else {\n throw normalizeAgentLlMError(err, `agent-llm: failed to load npm provider \"${packageName}\"`);\n }\n }\n\n // If we need a specific provider (fragment) but loadLLMExtensions didn't register it (e.g. package was missing and didn't throw), try installing and load again\n if (fragmentProvider && installNpmIfMissing && !getChatModelFactory(fragmentProvider)) {\n try {\n await ensureNpmPackageInstalled(packageName, { version, cwd });\n await load();\n } catch (installErr) {\n throw normalizeAgentLlMError(installErr, `agent-llm: failed to install or load npm provider \"${packageName}\" (provider \"${fragmentProvider}\" not registered)`);\n }\n if (!getChatModelFactory(fragmentProvider)) {\n throw new Error(`agent-llm: 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 (\n typeof (m as { getDefaultProviderName?: () => string }).getDefaultProviderName === \"function\"\n ) {\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\n/**\n * Recursively resolve all provider values that use the npm: protocol in a clone of the llm section.\n * When installNpmIfMissing is true, installs any npm: package that is not found.\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 normalizeAgentLlMError(e, `agent-llm: 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 normalizeAgentLlMError(e, `agent-llm: failed to resolve provider \"${String(v)}\"`);\n }\n continue;\n }\n try {\n out[k] = await resolveLlmSectionWithNpm(v, options);\n } catch (e) {\n throw normalizeAgentLlMError(e, `agent-llm: failed to resolve llm section key \"${k}\"`);\n }\n }\n return out;\n }\n return llmSection;\n}\n\nexport interface CreateChatModelFromLlmConfigWithNpmOptions\n extends CreateChatModelFromLlmConfigOptions,\n ResolveNpmProviderOptions {}\n\n/**\n * Create a LangChain ChatModel from llm section, resolving any provider values that use the npm: protocol.\n * Use when config has provider: \"npm:<package>\" or \"npm:<package>#<provider>\".\n * When installNpmIfMissing is true (default), the framework will run npm install <package> if the package is not found.\n */\nexport async function createChatModelFromLlmConfigWithNpm(\n options: CreateChatModelFromLlmConfigWithNpmOptions\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 normalizeAgentLlMError(e, \"agent-llm: createChatModelFromLlmConfigWithNpm failed\");\n }\n}\n","/**\n * Check connectivity to OpenAI-compatible / CIS endpoints.\n * Used at initialization to detect VPN/network issues and show real-time status.\n */\n\nimport type { CheckConnectivityResult, ConnectionStatus } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 8000;\n\n/**\n * Normalize base URL for a health probe: ensure it has a path we can GET.\n * Many OpenAI-compatible APIs expose GET /v1/models (may require auth) or respond at base.\n */\nfunction probeUrl(baseURL: string): string {\n const base = baseURL.replace(/\\/+$/, \"\");\n if (base.endsWith(\"/v1\")) return `${base}/models`;\n return base.includes(\"/v1\") ? `${base}/models` : `${base}/v1/models`;\n}\n\n/**\n * Check whether an endpoint is reachable (any HTTP response from the server).\n * Network errors, timeouts, or connection refused are treated as unreachable.\n */\nexport async function checkEndpointConnectivity(\n baseURL: string,\n options?: { timeoutMs?: number }\n): Promise<CheckConnectivityResult> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const url = probeUrl(baseURL);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n });\n clearTimeout(timeoutId);\n // Any response means the server is reachable (even 401/403 = VPN/network OK)\n return {\n reachable: true,\n message: res.ok ? \"OK\" : `HTTP ${res.status}`,\n statusCode: res.status,\n };\n } catch (err) {\n clearTimeout(timeoutId);\n const message =\n err instanceof Error ? err.message : String(err);\n const isTimeout =\n err instanceof Error && err.name === \"AbortError\";\n return {\n reachable: false,\n message: isTimeout\n ? \"Connection timed out\"\n : message || \"Connection failed\",\n };\n }\n}\n\n/** Default reminder when CIS (or internal LLM) is unreachable */\nexport const CIS_UNREACHABLE_REMINDER =\n \"Please ensure you are connected to Secure VPN and try again.\";\n\n/**\n * Build an error message for unreachable CIS/LLM endpoint.\n */\nexport function buildUnreachableError(\n endpointId: string,\n baseURL: string,\n detail?: string\n): string {\n const parts = [\n `Cannot connect to CIS (endpoint: ${endpointId}, base URL: ${baseURL}).`,\n detail && ` ${detail}`,\n ` ${CIS_UNREACHABLE_REMINDER}`,\n ];\n return parts.filter(Boolean).join(\"\").trim();\n}\n\nexport type { ConnectionStatus };\n","/**\n * Return a LangChain-formatted LLM from config (llm.yaml in current directory).\n * Use this LLM with LangChain's createAgent (e.g. createToolCallingAgent + AgentExecutor).\n */\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { createChatModelFromLlmConfig } from \"../langchain/adapter.js\";\nimport {\n createChatModelFromLlmConfigWithNpm,\n resolveLlmSectionWithNpm,\n} from \"../extensions/npm-protocol.js\";\nimport { loadLlmConfig } from \"../config/loader.js\";\nimport { parseLlmSection } from \"../config/parser.js\";\nimport type { LLMConfig } from \"../types.js\";\nimport {\n checkEndpointConnectivity,\n buildUnreachableError,\n} from \"../connectivity/check.js\";\nimport type { ConnectionStatus } from \"../connectivity/types.js\";\n\nexport interface CreateAgentLlMOptions {\n /** Path to YAML config file. If omitted, uses llm.yaml in the current directory (cwd). */\n configPath?: string;\n /** If true (default), run npm install when provider is npm:<package> and package is not found. */\n installNpmIfMissing?: boolean;\n /**\n * If true (default when any endpoint has baseURL), check connectivity to CIS/LLM endpoints before use.\n * When unreachable, throws with a reminder to connect to Secure VPN.\n */\n checkConnectivity?: boolean;\n /**\n * Callback for real-time connection status (e.g. \"checking\", \"reachable\", \"unreachable\").\n * Use this to display live status in the UI.\n */\n onConnectionStatus?: (status: ConnectionStatus) => void;\n /** Timeout in ms for each connectivity check. Default 8000. */\n connectivityTimeoutMs?: number;\n}\n\nfunction resolveDefaultConfigPath(): string {\n const cwd = process.cwd();\n return join(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 normalizeCreateOptions(\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 normalizeAgentLlMError(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 * Internal: create LLM from config without resolving npm: providers (sync).\n */\nfunction createAgentLlMInternal(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): ReturnType<typeof createChatModelFromLlmConfig> {\n try {\n const options = normalizeOptions(configPathOrOptions);\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n if (llmSection == null) {\n throw new Error(`No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`);\n }\n return createChatModelFromLlmConfig({ llmSection });\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"No LLM config\")) throw e;\n throw normalizeAgentLlMError(e, \"agent-llm: createAgentLlM failed\");\n }\n}\n\n/**\n * Run connectivity checks for all configs that have a baseURL.\n * Reports real-time status via onConnectionStatus and throws if any endpoint is unreachable.\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): c is LLMConfig & { baseURL: string } =>\n typeof c.baseURL === \"string\" && c.baseURL.length > 0\n );\n } catch {\n return;\n }\n const shouldCheck =\n options.checkConnectivity !== false && configs.length > 0;\n if (!shouldCheck) return;\n\n const report = (status: ConnectionStatus) => {\n options.onConnectionStatus?.(status);\n };\n\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 CIS connection...\",\n });\n\n const result = await checkEndpointConnectivity(baseURL, { timeoutMs });\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(\n buildUnreachableError(id, baseURL, result.message)\n );\n }\n }\n}\n\n/**\n * Create a LangChain-formatted LLM from config. Resolves npm: providers and optionally installs packages.\n * Checks connectivity to CIS/LLM endpoints by default and reports real-time status via onConnectionStatus.\n * - createAgentLlM() — uses llm.yaml in the current directory\n * - createAgentLlM(\"path/to/llm.yaml\") — use specific config file\n * - createAgentLlM({ configPath: \"...\", onConnectionStatus: (s) => console.log(s) }) — options object\n */\nexport async function createAgentLlM(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): Promise<ReturnType<typeof createChatModelFromLlmConfig>> {\n try {\n const options = normalizeCreateOptions(configPathOrOptions);\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n if (llmSection == null) {\n throw new Error(`No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`);\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 CIS\")) throw e;\n throw normalizeAgentLlMError(e, \"agent-llm: createAgentLlM failed\");\n }\n}\n"],"mappings":"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","names":["model","apiKey","readFileSync","existsSync","existsSync","readFileSync","name","readFileSync","require","readFileSync","installSpec","normalizeAgentLlMError","join","join","normalizeAgentLlMError","normalizeAgentLlMError"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check connectivity to OpenAI-compatible / CIS endpoints.
|
|
3
|
+
* Used at initialization to detect VPN/network issues and show real-time status.
|
|
4
|
+
*/
|
|
5
|
+
import type { CheckConnectivityResult, ConnectionStatus } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Check whether an endpoint is reachable (any HTTP response from the server).
|
|
8
|
+
* Network errors, timeouts, or connection refused are treated as unreachable.
|
|
9
|
+
*/
|
|
10
|
+
export declare function checkEndpointConnectivity(baseURL: string, options?: {
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}): Promise<CheckConnectivityResult>;
|
|
13
|
+
/** Default reminder when CIS (or internal LLM) is unreachable */
|
|
14
|
+
export declare const CIS_UNREACHABLE_REMINDER = "Please ensure you are connected to Secure VPN and try again.";
|
|
15
|
+
/**
|
|
16
|
+
* Build an error message for unreachable CIS/LLM endpoint.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildUnreachableError(endpointId: string, baseURL: string, detail?: string): string;
|
|
19
|
+
export type { ConnectionStatus };
|
|
20
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/connectivity/check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAc5E;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CAiClC;AAED,iEAAiE;AACjE,eAAO,MAAM,wBAAwB,iEAC2B,CAAC;AAEjE;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAOR;AAED,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connectivity checks for CIS / LLM endpoints (e.g. before use when behind VPN).
|
|
3
|
+
*/
|
|
4
|
+
export { checkEndpointConnectivity, buildUnreachableError, CIS_UNREACHABLE_REMINDER, } from "./check.js";
|
|
5
|
+
export type { ConnectionStatus, ConnectionPhase, CheckConnectivityResult } from "./types.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectivity/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection status for CIS / LLM endpoint connectivity checks.
|
|
3
|
+
* Used for real-time status display during initialization.
|
|
4
|
+
*/
|
|
5
|
+
export type ConnectionPhase = "checking" | "reachable" | "unreachable";
|
|
6
|
+
export interface ConnectionStatus {
|
|
7
|
+
/** Current phase of the connectivity check */
|
|
8
|
+
phase: ConnectionPhase;
|
|
9
|
+
/** LLM endpoint id (e.g. "strong", "default") */
|
|
10
|
+
endpointId?: string;
|
|
11
|
+
/** Endpoint base URL being checked */
|
|
12
|
+
baseURL?: string;
|
|
13
|
+
/** Human-readable message (e.g. error reason or success) */
|
|
14
|
+
message?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface CheckConnectivityResult {
|
|
17
|
+
/** Whether the endpoint responded (any HTTP response counts as reachable) */
|
|
18
|
+
reachable: boolean;
|
|
19
|
+
/** Optional message (e.g. "Connection refused" or "OK") */
|
|
20
|
+
message?: string;
|
|
21
|
+
/** HTTP status code if a response was received */
|
|
22
|
+
statusCode?: number;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/connectivity/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,KAAK,EAAE,eAAe,CAAC;IACvB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,SAAS,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { loadLLMExtensions, resolveLLMExtensionPackages, discoverLLMExtensions, loadDiscoveredExtensions, } from "./loader.js";
|
|
5
5
|
export type { LoadLLMExtensionsOptions } from "./loader.js";
|
|
6
|
-
export { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec, ensureNpmPackageInstalled, resolveNpmProvider, resolveLlmSectionWithNpm, createChatModelFromLlmConfigWithNpm, } from "./npm-protocol.js";
|
|
6
|
+
export { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec, getLatestVersion, getInstalledVersion, ensureNpmPackageInstalled, resolveNpmProvider, resolveLlmSectionWithNpm, createChatModelFromLlmConfigWithNpm, } from "./npm-protocol.js";
|
|
7
7
|
export type { EnsureNpmPackageInstalledOptions, ResolveNpmProviderOptions, ResolveLlmSectionWithNpmOptions, CreateChatModelFromLlmConfigWithNpmOptions, } from "./npm-protocol.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,mCAAmC,GACpC,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,gCAAgC,EAChC,yBAAyB,EACzB,+BAA+B,EAC/B,0CAA0C,GAC3C,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,mCAAmC,GACpC,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,gCAAgC,EAChC,yBAAyB,EACzB,+BAA+B,EAC/B,0CAA0C,GAC3C,MAAM,mBAAmB,CAAC"}
|
|
@@ -2,10 +2,24 @@
|
|
|
2
2
|
* npm: protocol in provider — specify an npm package name (and optional version) in config's model provider.
|
|
3
3
|
* Format: npm:<package-name> or npm:<package-name>@<version> or npm:<package-name>#<provider-name> or npm:<package-name>@<version>#<provider-name>
|
|
4
4
|
* When installNpmIfMissing is true, the framework will run npm install <package>[@version] if the package is not found.
|
|
5
|
+
* We never use "latest" for installs: when version is omitted or "latest", we resolve the actual latest version from the registry and use that version number.
|
|
5
6
|
*/
|
|
6
7
|
import type { CreateChatModelFromLlmConfigOptions } from "../langchain/adapter.js";
|
|
7
8
|
import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
8
9
|
export declare const NPM_PROTOCOL_PREFIX = "npm:";
|
|
10
|
+
/**
|
|
11
|
+
* Fetch the latest version of an npm package from the registry.
|
|
12
|
+
* Uses `npm view <package> version` so the result matches what npm install would use.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getLatestVersion(packageName: string, options?: {
|
|
15
|
+
cwd?: string;
|
|
16
|
+
}): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Get the currently installed version of a package (from node_modules), or null if not found.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getInstalledVersion(packageName: string, options?: {
|
|
21
|
+
cwd?: string;
|
|
22
|
+
}): string | null;
|
|
9
23
|
/** Parse npm: spec into package name, optional version, and optional #provider fragment. */
|
|
10
24
|
export declare function parseNpmProviderSpec(spec: string): {
|
|
11
25
|
packageName: string;
|
|
@@ -13,7 +27,7 @@ export declare function parseNpmProviderSpec(spec: string): {
|
|
|
13
27
|
provider?: string;
|
|
14
28
|
} | null;
|
|
15
29
|
export interface EnsureNpmPackageInstalledOptions {
|
|
16
|
-
/** Version to install (e.g. 0.1.0
|
|
30
|
+
/** Version to install (e.g. 0.1.0). If omitted or "latest", we resolve the actual latest version from the registry and use that (we never pass "latest" to npm install). */
|
|
17
31
|
version?: string;
|
|
18
32
|
/** Working directory for npm install. Default: process.cwd() */
|
|
19
33
|
cwd?: string;
|
|
@@ -24,6 +38,7 @@ export interface EnsureNpmPackageInstalledOptions {
|
|
|
24
38
|
export declare function isNpmProviderSpec(spec: unknown): spec is string;
|
|
25
39
|
/**
|
|
26
40
|
* Ensure an npm package is installed: if it cannot be resolved, run npm install <packageName>[@version] from cwd.
|
|
41
|
+
* When version is omitted or "latest", we resolve the actual latest version from the registry and install/upgrade to that (never use "latest" tag).
|
|
27
42
|
* Call this before loading a provider package when the config uses npm:<package-name>[@version].
|
|
28
43
|
*/
|
|
29
44
|
export declare function ensureNpmPackageInstalled(packageName: string, options?: EnsureNpmPackageInstalledOptions): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-protocol.d.ts","sourceRoot":"","sources":["../../src/extensions/npm-protocol.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"npm-protocol.d.ts","sourceRoot":"","sources":["../../src/extensions/npm-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAEjF,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAK1C;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B,OAAO,CAAC,MAAM,CAAC,CAejB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,GAAG,IAAI,CAUtG;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAYtH;AAED,MAAM,WAAW,gCAAgC;IAC/C,4KAA4K;IAC5K,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAE/D;AA6BD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED,MAAM,WAAW,yBAAyB;IACxC,kFAAkF;IAClF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAkBD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwDxB;AAED,MAAM,WAAW,+BAAgC,SAAQ,yBAAyB;CAAG;AAErF;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,MAAM,WAAW,0CACf,SAAQ,mCAAmC,EACzC,yBAAyB;CAAG;AAEhC;;;;GAIG;AACH,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,0CAA0C,GAClD,OAAO,CAAC,aAAa,CAAC,CAcxB"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,11 +13,13 @@ export { createClient, registerProvider } from "./providers/index.js";
|
|
|
13
13
|
export { createOpenAIClient, createOpenAIChatClient, createOpenAIImageClient } from "./providers/openai.js";
|
|
14
14
|
export { createChatModelFromLlmConfig } from "./langchain/adapter.js";
|
|
15
15
|
export type { CreateChatModelFromLlmConfigOptions } from "./langchain/adapter.js";
|
|
16
|
-
export { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec, ensureNpmPackageInstalled, resolveNpmProvider, resolveLlmSectionWithNpm, createChatModelFromLlmConfigWithNpm, } from "./extensions/npm-protocol.js";
|
|
16
|
+
export { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec, getLatestVersion, getInstalledVersion, ensureNpmPackageInstalled, resolveNpmProvider, resolveLlmSectionWithNpm, createChatModelFromLlmConfigWithNpm, } from "./extensions/npm-protocol.js";
|
|
17
17
|
export type { EnsureNpmPackageInstalledOptions, ResolveNpmProviderOptions, ResolveLlmSectionWithNpmOptions, CreateChatModelFromLlmConfigWithNpmOptions, } from "./extensions/npm-protocol.js";
|
|
18
18
|
export { loadLLMExtensions, resolveLLMExtensionPackages, discoverLLMExtensions, loadDiscoveredExtensions } from "./extensions/loader.js";
|
|
19
19
|
export { createAgentLlM } from "./api/create-agent-llm.js";
|
|
20
20
|
export type { CreateAgentLlMOptions } from "./api/create-agent-llm.js";
|
|
21
|
+
export { checkEndpointConnectivity, buildUnreachableError, CIS_UNREACHABLE_REMINDER, } from "./connectivity/check.js";
|
|
22
|
+
export type { ConnectionStatus, ConnectionPhase, CheckConnectivityResult, } from "./connectivity/types.js";
|
|
21
23
|
export type { LLMType, LLMConfig, AgentConfigLlmSection, ChatMessage, ChatResult, ChatStreamChunk, ImageResult, ToolDefinition, ChatWithToolsMessage, ChatWithToolsResult, ChatWithToolsStreamChunk, ILLMClient, ILLMRegistry, ILLMExtension, } from "./types.js";
|
|
22
24
|
export { AGENT_LLM_PROVIDER_FIELD } from "./types.js";
|
|
23
25
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG1F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAG5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,YAAY,EAAE,mCAAmC,EAAE,MAAM,wBAAwB,CAAC;AAGlF,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,mCAAmC,GACpC,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,gCAAgC,EAChC,yBAAyB,EACzB,+BAA+B,EAC/B,0CAA0C,GAC3C,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGzI,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,YAAY,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,eAAe,EACf,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,UAAU,EACV,YAAY,EACZ,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;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG1F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAG5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,YAAY,EAAE,mCAAmC,EAAE,MAAM,wBAAwB,CAAC;AAGlF,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,mCAAmC,GACpC,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,gCAAgC,EAChC,yBAAyB,EACzB,+BAA+B,EAC/B,0CAA0C,GAC3C,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGzI,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,eAAe,EACf,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
|
+
CIS_UNREACHABLE_REMINDER,
|
|
2
3
|
NPM_PROTOCOL_PREFIX,
|
|
4
|
+
buildUnreachableError,
|
|
5
|
+
checkEndpointConnectivity,
|
|
3
6
|
createAgentLlM,
|
|
4
7
|
createChatModelFromLlmConfig,
|
|
5
8
|
createChatModelFromLlmConfigWithNpm,
|
|
@@ -10,6 +13,8 @@ import {
|
|
|
10
13
|
discoverLLMExtensions,
|
|
11
14
|
ensureNpmPackageInstalled,
|
|
12
15
|
getChatModelFactory,
|
|
16
|
+
getInstalledVersion,
|
|
17
|
+
getLatestVersion,
|
|
13
18
|
isNpmProviderSpec,
|
|
14
19
|
loadDiscoveredExtensions,
|
|
15
20
|
loadLLMExtensions,
|
|
@@ -23,7 +28,7 @@ import {
|
|
|
23
28
|
resolveLlmSectionWithNpm,
|
|
24
29
|
resolveNpmProvider,
|
|
25
30
|
substituteEnv
|
|
26
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-VHC4NEWF.js";
|
|
27
32
|
|
|
28
33
|
// src/registry/client.ts
|
|
29
34
|
function createLLMRegistry(options) {
|
|
@@ -55,7 +60,10 @@ function createLLMRegistry(options) {
|
|
|
55
60
|
var AGENT_LLM_PROVIDER_FIELD = "agentLlmProvider";
|
|
56
61
|
export {
|
|
57
62
|
AGENT_LLM_PROVIDER_FIELD,
|
|
63
|
+
CIS_UNREACHABLE_REMINDER,
|
|
58
64
|
NPM_PROTOCOL_PREFIX,
|
|
65
|
+
buildUnreachableError,
|
|
66
|
+
checkEndpointConnectivity,
|
|
59
67
|
createAgentLlM,
|
|
60
68
|
createChatModelFromLlmConfig,
|
|
61
69
|
createChatModelFromLlmConfigWithNpm,
|
|
@@ -67,6 +75,8 @@ export {
|
|
|
67
75
|
discoverLLMExtensions,
|
|
68
76
|
ensureNpmPackageInstalled,
|
|
69
77
|
getChatModelFactory,
|
|
78
|
+
getInstalledVersion,
|
|
79
|
+
getLatestVersion,
|
|
70
80
|
isNpmProviderSpec,
|
|
71
81
|
loadDiscoveredExtensions,
|
|
72
82
|
loadLLMExtensions,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry/client.ts","../src/types.ts"],"sourcesContent":["/**\n * Create LLM registry from agent.yaml llm section.\n */\n\nimport { parseLlmSection } from \"../config/parser.js\";\nimport { createClient } from \"../providers/index.js\";\nimport type { AgentConfigLlmSection, ILLMClient, ILLMRegistry } from \"../types.js\";\n\nexport interface CreateLLMRegistryOptions {\n /** Parsed llm section (e.g. from loadAgentConfig's config.llm) */\n llmSection: AgentConfigLlmSection | null | undefined;\n}\n\n/**\n * Create LLM registry from agent config llm section; supports multiple providers/models, each LLM has id and type.\n */\nexport function createLLMRegistry(options: CreateLLMRegistryOptions): ILLMRegistry {\n const { defaultId, configs } = parseLlmSection(options.llmSection);\n const map = new Map<string, ILLMClient>();\n\n for (const config of configs) {\n try {\n const client = createClient(config);\n map.set(config.id, client);\n } catch (err) {\n console.warn(`[agent-llm] Skip LLM \"${config.id}\": ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {\n get(id: string): ILLMClient | undefined {\n return map.get(id);\n },\n defaultId(): string | undefined {\n if (map.has(defaultId)) return defaultId;\n return map.size > 0 ? [...map.keys()][0] : undefined;\n },\n ids(): string[] {\n return [...map.keys()];\n },\n };\n}\n","/**\n * Agent LLM: OpenAI-compatible format only (/v1/chat/completions etc.).\n * Multi-instance: each LLM has id and type; optional baseURL for other compatible endpoints.\n */\n\n/** LLM type: chat = conversation, image = image generation (OpenAI-compatible format) */\nexport type LLMType = \"chat\" | \"image\";\n\n/** Single LLM config: id, type, model; OpenAI-compatible API only */\nexport interface LLMConfig {\n /** Unique id for fetching the instance from the registry */\n id: string;\n /** chat | image */\n type: LLMType;\n /** Must be openai or openai-compatible; only this format is supported */\n provider: string;\n /** Model name, e.g. gpt-4o-mini, dall-e-3 */\n model?: string;\n /** Temperature etc.; commonly used for chat */\n temperature?: number;\n /** API key; can also be set via env */\n apiKey?: string;\n /** OpenAI-compatible endpoint baseURL (e.g. Azure, local proxy, other /v1-compatible vendors) */\n baseURL?: string;\n /** Other options (passed through) */\n [key: string]: unknown;\n}\n\n/** agent.yaml llm section: flat (each model keyed by name), default+instances, or single object */\nexport interface AgentConfigLlmSection {\n /** Default model name (id) to use */\n default?: string;\n /** npm package name or array for dynamic load; e.g. \"wallee-llm\" or [\"wallee-llm\"] */\n type?: string | string[];\n /** Array of LLM configs */\n instances?: LLMConfig[];\n /** Single-object form: provider, model etc., parsed as id=default chat */\n provider?: string;\n model?: string;\n name?: string;\n temperature?: number;\n apiKey?: string;\n baseURL?: string;\n base_url?: string;\n /** Flat: strong/medium/fast etc. name → config (provider, base_url, name, options) */\n [key: string]: unknown;\n}\n\n/** Single chat message */\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\n/** Minimal chat result */\nexport interface ChatResult {\n content: string;\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/** Stream chunk for chat responses */\nexport interface ChatStreamChunk {\n content: string;\n done: boolean;\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/** OpenAI-compatible tool definition (function) */\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters?: object;\n };\n}\n\n/** Message with tool calls (assistant may include tool_calls; tool = tool result) */\nexport type ChatWithToolsMessage =\n | ChatMessage\n | { role: \"tool\"; content: string; tool_call_id: string }\n | {\n role: \"assistant\";\n content?: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n };\n\n/** Chat result with tool calls */\nexport interface ChatWithToolsResult {\n message: {\n role: \"assistant\";\n content?: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n };\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/** Stream chunk for chat with tools responses */\nexport interface ChatWithToolsStreamChunk {\n delta: {\n role?: \"assistant\";\n content?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: \"function\";\n function?: { name?: string; arguments?: string };\n }>;\n };\n done: boolean;\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/** Image generation result */\nexport interface ImageResult {\n url?: string;\n b64?: string;\n}\n\n/**\n * Minimal interface for a single LLM instance.\n * type=chat provides chat; type=image provides generateImage.\n * chat type may optionally provide chatWithTools for ReAct/Agent tool calling.\n */\nexport interface ILLMClient {\n readonly id: string;\n readonly type: LLMType;\n /** Chat (available when type=chat) */\n chat(messages: ChatMessage[]): Promise<ChatResult>;\n /**\n * Chat with streaming (optional when type=chat).\n * Returns an async generator that yields chunks as they arrive.\n */\n chatStream?(messages: ChatMessage[]): AsyncGenerator<ChatStreamChunk, void, unknown>;\n /**\n * Chat with tools (optional when type=chat; for ReAct/Agent).\n * If not implemented, caller may poll with chat or use another client.\n */\n chatWithTools?(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n options?: { timeoutMs?: number }\n ): Promise<ChatWithToolsResult>;\n /**\n * Chat with tools and streaming (optional when type=chat).\n * Returns an async generator that yields chunks as they arrive.\n */\n chatWithToolsStream?(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n options?: { timeoutMs?: number }\n ): AsyncGenerator<ChatWithToolsStreamChunk, void, unknown>;\n /** Image generation (when type=image); otherwise may throw or be ignored */\n generateImage?(options: { prompt: string; size?: string; n?: number }): Promise<ImageResult>;\n}\n\n/**\n * LLM registry created from llm section: get instance by id.\n */\nexport interface ILLMRegistry {\n get(id: string): ILLMClient | undefined;\n defaultId(): string | undefined;\n ids(): string[];\n}\n\n/**\n * Generic interface for an LLM provider extension (npm package).\n * Implement getLLMExtension() returning this; framework will register the provider when loading.\n * Prefer createClient + createChatModel so the framework does registration (extension need not call register).\n */\nexport interface ILLMExtension {\n /** Provider name (e.g. \"openai\" or extension-specific name). Framework registers under this name. */\n readonly providerName: string;\n /** ILLMClient factory. If present with createChatModel, framework calls registerProvider(providerName, createClient). */\n readonly createClient?: (config: LLMConfig) => ILLMClient;\n /** LangChain ChatModel factory. If present with createClient, framework calls registerChatModelProvider(providerName, createChatModel). */\n readonly createChatModel?: (config: LLMConfig) => unknown;\n /** Legacy: if extension provides register(), framework calls it. Prefer createClient + createChatModel so framework registers. */\n register?(): void;\n}\n\n/** package.json field: when true, the package is an agent-llm provider (for discovery). */\nexport const AGENT_LLM_PROVIDER_FIELD = \"agentLlmProvider\";\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/registry/client.ts","../src/types.ts"],"sourcesContent":["/**\n * Create LLM registry from agent.yaml llm section.\n */\n\nimport { parseLlmSection } from \"../config/parser.js\";\nimport { createClient } from \"../providers/index.js\";\nimport type { AgentConfigLlmSection, ILLMClient, ILLMRegistry } from \"../types.js\";\n\nexport interface CreateLLMRegistryOptions {\n /** Parsed llm section (e.g. from loadAgentConfig's config.llm) */\n llmSection: AgentConfigLlmSection | null | undefined;\n}\n\n/**\n * Create LLM registry from agent config llm section; supports multiple providers/models, each LLM has id and type.\n */\nexport function createLLMRegistry(options: CreateLLMRegistryOptions): ILLMRegistry {\n const { defaultId, configs } = parseLlmSection(options.llmSection);\n const map = new Map<string, ILLMClient>();\n\n for (const config of configs) {\n try {\n const client = createClient(config);\n map.set(config.id, client);\n } catch (err) {\n console.warn(`[agent-llm] Skip LLM \"${config.id}\": ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {\n get(id: string): ILLMClient | undefined {\n return map.get(id);\n },\n defaultId(): string | undefined {\n if (map.has(defaultId)) return defaultId;\n return map.size > 0 ? [...map.keys()][0] : undefined;\n },\n ids(): string[] {\n return [...map.keys()];\n },\n };\n}\n","/**\n * Agent LLM: OpenAI-compatible format only (/v1/chat/completions etc.).\n * Multi-instance: each LLM has id and type; optional baseURL for other compatible endpoints.\n */\n\n/** LLM type: chat = conversation, image = image generation (OpenAI-compatible format) */\nexport type LLMType = \"chat\" | \"image\";\n\n/** Single LLM config: id, type, model; OpenAI-compatible API only */\nexport interface LLMConfig {\n /** Unique id for fetching the instance from the registry */\n id: string;\n /** chat | image */\n type: LLMType;\n /** Must be openai or openai-compatible; only this format is supported */\n provider: string;\n /** Model name, e.g. gpt-4o-mini, dall-e-3 */\n model?: string;\n /** Temperature etc.; commonly used for chat */\n temperature?: number;\n /** API key; can also be set via env */\n apiKey?: string;\n /** OpenAI-compatible endpoint baseURL (e.g. Azure, local proxy, other /v1-compatible vendors) */\n baseURL?: string;\n /** Other options (passed through) */\n [key: string]: unknown;\n}\n\n/** agent.yaml llm section: flat (each model keyed by name), default+instances, or single object */\nexport interface AgentConfigLlmSection {\n /** Default model name (id) to use */\n default?: string;\n /** npm package name or array for dynamic load; e.g. \"wallee-llm\" or [\"wallee-llm\"] */\n type?: string | string[];\n /** Array of LLM configs */\n instances?: LLMConfig[];\n /** Single-object form: provider, model etc., parsed as id=default chat */\n provider?: string;\n model?: string;\n name?: string;\n temperature?: number;\n apiKey?: string;\n baseURL?: string;\n base_url?: string;\n /** Flat: strong/medium/fast etc. name → config (provider, base_url, name, options) */\n [key: string]: unknown;\n}\n\n/** Single chat message */\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\n/** Minimal chat result */\nexport interface ChatResult {\n content: string;\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/** Stream chunk for chat responses */\nexport interface ChatStreamChunk {\n content: string;\n done: boolean;\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/** OpenAI-compatible tool definition (function) */\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters?: object;\n };\n}\n\n/** Message with tool calls (assistant may include tool_calls; tool = tool result) */\nexport type ChatWithToolsMessage =\n | ChatMessage\n | { role: \"tool\"; content: string; tool_call_id: string }\n | {\n role: \"assistant\";\n content?: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n };\n\n/** Chat result with tool calls */\nexport interface ChatWithToolsResult {\n message: {\n role: \"assistant\";\n content?: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n };\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/** Stream chunk for chat with tools responses */\nexport interface ChatWithToolsStreamChunk {\n delta: {\n role?: \"assistant\";\n content?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: \"function\";\n function?: { name?: string; arguments?: string };\n }>;\n };\n done: boolean;\n usage?: { promptTokens?: number; completionTokens?: number };\n}\n\n/** Image generation result */\nexport interface ImageResult {\n url?: string;\n b64?: string;\n}\n\n/**\n * Minimal interface for a single LLM instance.\n * type=chat provides chat; type=image provides generateImage.\n * chat type may optionally provide chatWithTools for ReAct/Agent tool calling.\n */\nexport interface ILLMClient {\n readonly id: string;\n readonly type: LLMType;\n /** Chat (available when type=chat) */\n chat(messages: ChatMessage[]): Promise<ChatResult>;\n /**\n * Chat with streaming (optional when type=chat).\n * Returns an async generator that yields chunks as they arrive.\n */\n chatStream?(messages: ChatMessage[]): AsyncGenerator<ChatStreamChunk, void, unknown>;\n /**\n * Chat with tools (optional when type=chat; for ReAct/Agent).\n * If not implemented, caller may poll with chat or use another client.\n */\n chatWithTools?(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n options?: { timeoutMs?: number }\n ): Promise<ChatWithToolsResult>;\n /**\n * Chat with tools and streaming (optional when type=chat).\n * Returns an async generator that yields chunks as they arrive.\n */\n chatWithToolsStream?(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n options?: { timeoutMs?: number }\n ): AsyncGenerator<ChatWithToolsStreamChunk, void, unknown>;\n /** Image generation (when type=image); otherwise may throw or be ignored */\n generateImage?(options: { prompt: string; size?: string; n?: number }): Promise<ImageResult>;\n}\n\n/**\n * LLM registry created from llm section: get instance by id.\n */\nexport interface ILLMRegistry {\n get(id: string): ILLMClient | undefined;\n defaultId(): string | undefined;\n ids(): string[];\n}\n\n/**\n * Generic interface for an LLM provider extension (npm package).\n * Implement getLLMExtension() returning this; framework will register the provider when loading.\n * Prefer createClient + createChatModel so the framework does registration (extension need not call register).\n */\nexport interface ILLMExtension {\n /** Provider name (e.g. \"openai\" or extension-specific name). Framework registers under this name. */\n readonly providerName: string;\n /** ILLMClient factory. If present with createChatModel, framework calls registerProvider(providerName, createClient). */\n readonly createClient?: (config: LLMConfig) => ILLMClient;\n /** LangChain ChatModel factory. If present with createClient, framework calls registerChatModelProvider(providerName, createChatModel). */\n readonly createChatModel?: (config: LLMConfig) => unknown;\n /** Legacy: if extension provides register(), framework calls it. Prefer createClient + createChatModel so framework registers. */\n register?(): void;\n}\n\n/** package.json field: when true, the package is an agent-llm provider (for discovery). */\nexport const AGENT_LLM_PROVIDER_FIELD = \"agentLlmProvider\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBO,SAAS,kBAAkB,SAAiD;AACjF,QAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB,QAAQ,UAAU;AACjE,QAAM,MAAM,oBAAI,IAAwB;AAExC,aAAW,UAAU,SAAS;AAC5B,QAAI;AACF,YAAM,SAAS,aAAa,MAAM;AAClC,UAAI,IAAI,OAAO,IAAI,MAAM;AAAA,IAC3B,SAAS,KAAK;AACZ,cAAQ,KAAK,yBAAyB,OAAO,EAAE,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,IACzG;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,IAAoC;AACtC,aAAO,IAAI,IAAI,EAAE;AAAA,IACnB;AAAA,IACA,YAAgC;AAC9B,UAAI,IAAI,IAAI,SAAS,EAAG,QAAO;AAC/B,aAAO,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI;AAAA,IAC7C;AAAA,IACA,MAAgB;AACd,aAAO,CAAC,GAAG,IAAI,KAAK,CAAC;AAAA,IACvB;AAAA,EACF;AACF;;;ACqJO,IAAM,2BAA2B;","names":[]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/parser.ts","../src/config/loader.ts","../src/providers/openai.ts","../src/providers/index.ts","../src/registry/chat-model.ts","../src/langchain/adapter.ts","../src/extensions/loader.ts","../src/extensions/npm-protocol.ts","../src/api/create-agent-llm.ts"],"sourcesContent":["/**\n * Parse agent.yaml llm section into normalized LLMConfig[] and default id.\n * Supports: flat (each model keyed by name), instances[], or single object.\n */\n\nimport type { LLMConfig } from \"../types.js\";\n\nconst DEFAULT_LLM_ID = \"default\";\n\nconst RESERVED_KEYS = new Set([\n \"default\",\n \"instances\",\n \"catalog\",\n \"provider\",\n \"model\",\n \"temperature\",\n \"apiKey\",\n \"baseURL\",\n \"base_url\",\n \"type\",\n \"id\",\n]);\n\n/**\n * Parse llm section: flat (each model keyed by name), default+instances, or single object.\n */\nexport function parseLlmSection(section: unknown): { defaultId: string; configs: LLMConfig[] } {\n if (section == null || typeof section !== \"object\") {\n return { defaultId: DEFAULT_LLM_ID, configs: [] };\n }\n\n if (Array.isArray(section)) {\n const configs = section\n .filter((i): i is Record<string, unknown> => i != null && typeof i === \"object\")\n .map((item, i) => normalizeLlmConfig({ ...item, id: item.id ?? item.name ?? String(i) }))\n .filter((c): c is LLMConfig => c != null);\n const defaultId = configs.length > 0 ? configs[0]!.id : DEFAULT_LLM_ID;\n return { defaultId, configs };\n }\n\n const s = section as Record<string, unknown>;\n\n const flatEntries = Object.entries(s).filter(\n ([k, v]) => !RESERVED_KEYS.has(k) && v != null && typeof v === \"object\" && !Array.isArray(v)\n );\n if (flatEntries.length > 0) {\n const configs: LLMConfig[] = [];\n for (const [id, entry] of flatEntries) {\n const c = entryToLlmConfig(id, entry as Record<string, unknown>);\n if (c) configs.push(c);\n }\n const defaultId =\n typeof s.default === \"string\" && s.default && flatEntries.some(([k]) => k === s.default)\n ? s.default\n : configs.length > 0\n ? configs[0]!.id\n : DEFAULT_LLM_ID;\n return { defaultId, configs };\n }\n\n if (Array.isArray(s.instances)) {\n const configs = (s.instances as unknown[])\n .filter((i): i is Record<string, unknown> => i != null && typeof i === \"object\")\n .map((i) => normalizeLlmConfig(i))\n .filter((c): c is LLMConfig => c != null);\n const defaultId =\n typeof s.default === \"string\" && s.default\n ? s.default\n : configs.length > 0\n ? configs[0]!.id\n : DEFAULT_LLM_ID;\n return { defaultId, configs };\n }\n\n if (typeof s.provider === \"string\" || typeof s.model === \"string\" || typeof (s as { name?: string }).name === \"string\") {\n const one = singleObjectToLlmConfig(s);\n return { defaultId: one.id, configs: [one] };\n }\n\n return { defaultId: DEFAULT_LLM_ID, configs: [] };\n}\n\nconst EXTENSION_OPTION_KEYS = [\"featureKey\", \"tenant\", \"authToken\", \"verifySSL\", \"bypassAuth\", \"host\", \"resolveHost\", \"timeoutMs\", \"options\"];\n\nfunction entryToLlmConfig(id: string, entry: Record<string, unknown>): LLMConfig | null {\n const opts = entry.options as Record<string, unknown> | undefined;\n const baseURL =\n typeof entry.base_url === \"string\"\n ? entry.base_url\n : typeof entry.baseURL === \"string\"\n ? entry.baseURL\n : undefined;\n const model = typeof entry.name === \"string\" ? entry.name : typeof entry.model === \"string\" ? entry.model : undefined;\n const provider = typeof entry.provider === \"string\" && entry.provider ? entry.provider : \"openai\";\n const config: LLMConfig = {\n id,\n type: \"chat\",\n provider,\n model,\n temperature: typeof opts?.temperature === \"number\" ? opts.temperature : typeof entry.temperature === \"number\" ? entry.temperature : undefined,\n apiKey: typeof opts?.apiKey === \"string\" ? opts.apiKey : typeof entry.apiKey === \"string\" ? entry.apiKey : undefined,\n baseURL,\n };\n if (typeof entry.type === \"string\" && entry.type === \"image\") config.type = \"image\";\n if (opts && typeof opts === \"object\") (config as Record<string, unknown>).options = opts;\n for (const k of EXTENSION_OPTION_KEYS) {\n if (entry[k] !== undefined) (config as Record<string, unknown>)[k] = entry[k];\n else if (opts && opts[k] !== undefined) (config as Record<string, unknown>)[k] = opts[k];\n }\n return config;\n}\n\nfunction singleObjectToLlmConfig(s: Record<string, unknown>): LLMConfig {\n const one: LLMConfig = {\n id: DEFAULT_LLM_ID,\n type: \"chat\",\n provider: typeof s.provider === \"string\" ? s.provider : \"openai\",\n model: typeof s.model === \"string\" ? s.model : (typeof (s as { name?: string }).name === \"string\" ? (s as { name: string }).name : undefined),\n temperature: typeof s.temperature === \"number\" ? s.temperature : undefined,\n apiKey: typeof s.apiKey === \"string\" ? s.apiKey : undefined,\n baseURL:\n typeof s.baseURL === \"string\" ? s.baseURL : typeof s.base_url === \"string\" ? s.base_url : undefined,\n };\n Object.keys(s).forEach((k) => {\n if (![\"id\", \"type\", \"provider\", \"model\", \"name\", \"temperature\", \"apiKey\", \"baseURL\", \"base_url\", \"default\", \"instances\"].includes(k)) {\n (one as Record<string, unknown>)[k] = s[k];\n }\n });\n return one;\n}\n\nfunction normalizeLlmConfig(o: Record<string, unknown>): LLMConfig | null {\n const id = typeof o.id === \"string\" && o.id ? o.id : DEFAULT_LLM_ID;\n const type = o.type === \"image\" ? \"image\" : \"chat\";\n const provider = typeof o.provider === \"string\" && o.provider ? o.provider : \"openai\";\n const opts = o.options as Record<string, unknown> | undefined;\n const config: LLMConfig = {\n id,\n type,\n provider,\n model: typeof o.model === \"string\" ? o.model : (typeof o.name === \"string\" ? o.name : undefined),\n temperature:\n typeof o.temperature === \"number\"\n ? o.temperature\n : typeof opts?.temperature === \"number\"\n ? opts.temperature\n : undefined,\n apiKey:\n typeof o.apiKey === \"string\"\n ? o.apiKey\n : typeof opts?.apiKey === \"string\"\n ? opts.apiKey\n : undefined,\n baseURL: typeof o.baseURL === \"string\" ? o.baseURL : (typeof o.base_url === \"string\" ? o.base_url : undefined),\n };\n Object.keys(o).forEach((k) => {\n if (![\"id\", \"type\", \"provider\", \"model\", \"name\", \"temperature\", \"apiKey\", \"baseURL\", \"base_url\"].includes(k)) {\n (config as Record<string, unknown>)[k] = o[k];\n }\n });\n return config;\n}\n","/**\n * Load and parse LLM config from YAML (e.g. llm.yaml).\n * Supports ${VAR} substitution from process.env.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\n\nexport interface LoadLlmConfigOptions {\n /** Replace ${VAR} with process.env.VAR. Default true. */\n substituteEnv?: boolean;\n}\n\n/**\n * Recursively replace ${VAR} in strings with process.env.VAR.\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\n/**\n * Parse YAML string and return the llm section (top-level key \"llm\").\n * Returns undefined if content has no llm key.\n */\nexport function parseLlmYaml(\n content: string,\n options: LoadLlmConfigOptions = {}\n): unknown {\n const { substituteEnv: doSub = true } = options;\n const parsed = parseYaml(content) as { llm?: unknown };\n const llm = parsed?.llm;\n if (llm == null) return undefined;\n return doSub ? substituteEnv(llm) : llm;\n}\n\n/**\n * Load LLM config from a YAML file (e.g. llm.yaml in current directory).\n * Returns the llm section for use with createChatModelFromLlmConfig or parseLlmSection.\n * Returns null if file does not exist or has no llm key.\n * Throws with clear message if file exists but read or parse fails.\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 if (!existsSync(filePath)) return null;\n let raw: string;\n try {\n raw = readFileSync(filePath, \"utf8\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: failed to read config file ${filePath}: ${msg}`, { cause: e });\n }\n try {\n const llm = parseLlmYaml(raw, options);\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 * OpenAI-compatible format: chat (/v1/chat/completions) and image.\n * Supports baseURL for Azure, local proxy, and other compatible endpoints.\n */\n\nimport OpenAI from \"openai\";\nimport type {\n LLMConfig,\n ChatMessage,\n ChatResult,\n ImageResult,\n ILLMClient,\n ChatWithToolsMessage,\n ChatWithToolsResult,\n ToolDefinition,\n ChatStreamChunk,\n ChatWithToolsStreamChunk,\n} from \"../types.js\";\n\nfunction getApiKey(config: LLMConfig): string {\n const key = config.apiKey ?? process.env.OPENAI_API_KEY ?? \"\";\n if (!key) throw new Error(\"OpenAI-compatible apiKey required (config.apiKey or OPENAI_API_KEY)\");\n return key;\n}\n\nfunction createOpenAIClientOptions(config: LLMConfig): { apiKey: string; baseURL?: string } {\n const opts: { apiKey: string; baseURL?: string } = { apiKey: getApiKey(config) };\n if (typeof config.baseURL === \"string\" && config.baseURL) opts.baseURL = config.baseURL;\n return opts;\n}\n\nfunction serializeMessage(\n m: ChatWithToolsMessage\n): OpenAI.Chat.Completions.ChatCompletionMessageParam {\n if (m.role === \"tool\")\n return { role: \"tool\", content: m.content, tool_call_id: m.tool_call_id };\n if (m.role === \"assistant\" && \"tool_calls\" in m && m.tool_calls?.length) {\n return {\n role: \"assistant\",\n content: m.content ?? null,\n tool_calls: m.tool_calls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.function.name, arguments: tc.function.arguments },\n })),\n };\n }\n return { role: m.role, content: (m as ChatMessage).content };\n}\n\nexport function createOpenAIChatClient(config: LLMConfig): ILLMClient {\n const client = new OpenAI(createOpenAIClientOptions(config));\n const model = config.model ?? process.env.OPENAI_MODEL ?? \"gpt-4o-mini\";\n const temperature = config.temperature ?? 0;\n\n return {\n id: config.id,\n type: \"chat\",\n async chat(messages: ChatMessage[]): Promise<ChatResult> {\n const resp = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n });\n const content = resp.choices[0]?.message?.content ?? \"\";\n const usage = resp.usage\n ? { promptTokens: resp.usage.prompt_tokens, completionTokens: resp.usage.completion_tokens }\n : undefined;\n return { content, usage };\n },\n async *chatStream(messages: ChatMessage[]): AsyncGenerator<ChatStreamChunk, void, unknown> {\n const stream = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n stream: true,\n });\n\n let usage: { promptTokens?: number; completionTokens?: number } | undefined;\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n const content = delta?.content ?? \"\";\n const finishReason = chunk.choices[0]?.finish_reason;\n\n // Capture usage from the final chunk if available\n if (chunk.usage) {\n usage = {\n promptTokens: chunk.usage.prompt_tokens,\n completionTokens: chunk.usage.completion_tokens,\n };\n }\n\n yield {\n content,\n done: finishReason !== null && finishReason !== undefined,\n usage,\n };\n }\n },\n async chatWithTools(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n _options?: { timeoutMs?: number }\n ): Promise<ChatWithToolsResult> {\n const resp = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map(serializeMessage),\n tools: tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.function.name,\n description: t.function.description,\n parameters: (t.function.parameters ?? undefined) as Record<string, unknown> | undefined,\n },\n })),\n });\n const msg = resp.choices[0]?.message;\n const usage = resp.usage\n ? { promptTokens: resp.usage.prompt_tokens, completionTokens: resp.usage.completion_tokens }\n : undefined;\n return {\n message: {\n role: \"assistant\",\n content: msg?.content ?? null,\n tool_calls: msg?.tool_calls?.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n },\n })),\n },\n usage,\n };\n },\n async *chatWithToolsStream(\n messages: ChatWithToolsMessage[],\n tools: ToolDefinition[],\n _options?: { timeoutMs?: number }\n ): AsyncGenerator<ChatWithToolsStreamChunk, void, unknown> {\n const stream = await client.chat.completions.create({\n model,\n temperature,\n messages: messages.map(serializeMessage),\n tools: tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.function.name,\n description: t.function.description,\n parameters: (t.function.parameters ?? undefined) as Record<string, unknown> | undefined,\n },\n })),\n stream: true,\n stream_options: { include_usage: true },\n });\n\n let usage: { promptTokens?: number; completionTokens?: number } | undefined;\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n const finishReason = chunk.choices[0]?.finish_reason;\n\n // Capture usage from the final chunk if available\n if (chunk.usage) {\n usage = {\n promptTokens: chunk.usage.prompt_tokens,\n completionTokens: chunk.usage.completion_tokens,\n };\n }\n\n const toolCalls = delta?.tool_calls?.map((tc) => ({\n index: tc.index,\n id: tc.id,\n type: tc.type as \"function\" | undefined,\n function: tc.function\n ? {\n name: tc.function.name,\n arguments: tc.function.arguments,\n }\n : undefined,\n }));\n\n yield {\n delta: {\n role: delta?.role as \"assistant\" | undefined,\n content: delta?.content ?? null,\n tool_calls: toolCalls,\n },\n done: finishReason !== null && finishReason !== undefined,\n usage,\n };\n }\n },\n };\n}\n\nexport function createOpenAIImageClient(config: LLMConfig): ILLMClient {\n const client = new OpenAI(createOpenAIClientOptions(config));\n const model = (config.model as string) ?? \"dall-e-3\";\n\n return {\n id: config.id,\n type: \"image\",\n async chat(): Promise<ChatResult> {\n throw new Error(\"OpenAI image model does not support chat; use generateImage()\");\n },\n async generateImage(options: { prompt: string; size?: string; n?: number }): Promise<ImageResult> {\n const resp = await client.images.generate({\n model,\n prompt: options.prompt,\n size: (options.size as \"1024x1024\" | \"1792x1024\" | \"1024x1792\") ?? \"1024x1024\",\n n: options.n ?? 1,\n response_format: \"url\",\n });\n const url = resp.data?.[0]?.url ?? undefined;\n return { url };\n },\n };\n}\n\nexport function createOpenAIClient(config: LLMConfig): ILLMClient {\n if (config.type === \"image\") return createOpenAIImageClient(config);\n return createOpenAIChatClient(config);\n}\n","/**\n * Supports OpenAI-compatible and extension providers.\n */\n\nimport type { LLMConfig, ILLMClient } from \"../types.js\";\nimport { createOpenAIClient } from \"./openai.js\";\n\nconst OPENAI_COMPATIBLE = \"openai-compatible\";\n\nfunction createOpenAICompat(config: LLMConfig): ILLMClient {\n return createOpenAIClient(config);\n}\n\nconst PROVIDERS: Record<string, (config: LLMConfig) => ILLMClient> = {\n openai: createOpenAICompat,\n [OPENAI_COMPATIBLE]: createOpenAICompat,\n};\n\nexport function createClient(config: LLMConfig): ILLMClient {\n const p = (config.provider ?? \"\").toLowerCase();\n const fn = PROVIDERS[p];\n if (!fn) {\n const supported = [...new Set([...Object.keys(PROVIDERS), \"extension providers\"])].sort().join(\", \");\n throw new Error(\n `Unsupported LLM provider: ${config.provider}. Supported: ${supported}.`\n );\n }\n return fn(config);\n}\n\nexport function registerProvider(name: string, factory: (config: LLMConfig) => ILLMClient): void {\n PROVIDERS[name.toLowerCase()] = factory;\n}\n","/**\n * Registry for LangChain ChatModel by provider name.\n * Extensions register via registerChatModelProvider; llmAdapter uses getChatModelFactory.\n */\n\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport type { LLMConfig } from \"../types.js\";\n\nexport type ChatModelFactory = (config: LLMConfig) => BaseChatModel;\n\nconst CHAT_MODEL_FACTORIES = new Map<string, ChatModelFactory>();\n\n/**\n * Register a ChatModel factory for a provider name.\n * Called by extensions (e.g. wallee-llm) on load.\n */\nexport function registerChatModelProvider(providerName: string, factory: ChatModelFactory): void {\n CHAT_MODEL_FACTORIES.set(providerName.toLowerCase(), factory);\n}\n\n/**\n * Get the ChatModel factory for a provider name, if registered.\n */\nexport function getChatModelFactory(providerName: string): ChatModelFactory | undefined {\n return CHAT_MODEL_FACTORIES.get(providerName.toLowerCase());\n}\n","/**\n * Build LangChain ChatModel from agent.yaml llm section.\n * Supports single object, default + instances, and flat keyed configs.\n * When provider is registered by an extension, uses that extension's ChatModel;\n * otherwise uses ChatOpenAI.\n */\n\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { parseLlmSection } from \"../config/parser.js\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\n\nconst DEFAULT_MODEL = \"gpt-4o-mini\";\n\nexport interface CreateChatModelFromLlmConfigOptions {\n /** agent.yaml llm section (raw or parsed); compatible with AgentConfigLlmSection / AgentConfigLlm */\n llmSection?: unknown;\n /** Override model from env */\n modelEnv?: string;\n /** Override API key from env */\n apiKeyEnv?: string;\n}\n\nfunction normalizeAgentLlMError(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 ChatModel when available; otherwise ChatOpenAI.\n */\nexport function createChatModelFromLlmConfig(\n options: CreateChatModelFromLlmConfigOptions\n): BaseChatModel {\n const { llmSection, modelEnv, apiKeyEnv } = options;\n let defaultId: string;\n let configs: ReturnType<typeof parseLlmSection>[\"configs\"];\n try {\n const parsed = parseLlmSection(llmSection ?? null);\n defaultId = parsed.defaultId;\n configs = parsed.configs;\n } catch (e) {\n throw normalizeAgentLlMError(e, \"agent-llm: failed to parse llm section\");\n }\n const defaultConfig = configs.find((c) => c.id === defaultId) ?? configs[0];\n\n if (!defaultConfig) {\n const model =\n modelEnv ?? process.env.OPENAI_MODEL ?? DEFAULT_MODEL;\n const apiKey = apiKeyEnv ?? process.env.OPENAI_API_KEY;\n try {\n return new ChatOpenAI({\n model,\n temperature: 0,\n ...(apiKey ? { apiKey } : {}),\n });\n } catch (e) {\n throw normalizeAgentLlMError(e, \"agent-llm: failed to create default ChatOpenAI\");\n }\n }\n\n const provider = (defaultConfig as { provider?: string }).provider ?? \"openai\";\n const chatModelFactory = getChatModelFactory(provider);\n if (chatModelFactory) {\n const config = {\n ...defaultConfig,\n model: modelEnv ?? defaultConfig.model,\n temperature:\n typeof defaultConfig.temperature === \"number\"\n ? defaultConfig.temperature\n : 0,\n };\n try {\n return chatModelFactory(config);\n } catch (e) {\n throw normalizeAgentLlMError(e, `agent-llm: failed to create ChatModel for provider \"${provider}\"`);\n }\n }\n\n const model =\n modelEnv ??\n defaultConfig?.model ??\n process.env.OPENAI_MODEL ??\n DEFAULT_MODEL;\n\n let apiKey =\n apiKeyEnv ?? defaultConfig?.apiKey ?? process.env.OPENAI_API_KEY;\n let baseURL = defaultConfig?.baseURL;\n // OpenAI client appends path (e.g. /chat/completions) to baseURL; Ollama and OpenAI-compatible APIs expect /v1/chat/completions.\n if (baseURL && !baseURL.replace(/\\/$/, \"\").endsWith(\"/v1\")) {\n baseURL = baseURL.replace(/\\/$/, \"\") + \"/v1\";\n }\n // OpenAI client throws if apiKey is undefined; Ollama and many compatible endpoints accept a dummy.\n if (baseURL && apiKey === undefined) {\n apiKey = \"ollama\";\n }\n\n const temperature =\n typeof defaultConfig?.temperature === \"number\" ? defaultConfig.temperature : 0;\n\n const constructorOptions: ConstructorParameters<typeof ChatOpenAI>[0] = {\n model,\n temperature,\n ...(apiKey ? { apiKey } : {}),\n ...(baseURL ? { configuration: { baseURL } } : {}),\n };\n\n try {\n return new ChatOpenAI(constructorOptions);\n } catch (e) {\n throw normalizeAgentLlMError(e, \"agent-llm: failed to create ChatOpenAI from config\");\n }\n}\n","/**\n * Load LLM extensions by npm package name or by dynamic discovery.\n * Extensions implement ILLMExtension (getLLMExtension()). Framework does registration so extension need not call register.\n */\n\nimport { readdirSync, readFileSync, existsSync } from \"node:fs\";\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 { registerProvider } from \"../providers/index.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 hasFactories = typeof e.createClient === \"function\" && typeof e.createChatModel === \"function\";\n return hasRegister || hasFactories;\n}\n\nfunction registerExtension(ext: ILLMExtension): void {\n if (typeof ext.createClient === \"function\" && typeof ext.createChatModel === \"function\") {\n registerProvider(ext.providerName, ext.createClient);\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\n/**\n * Resolve llm.type to a list of npm package names to load.\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\n/**\n * Scan node_modules (optionally under cwd) for packages that declare agent-llm provider.\n * A package is included if package.json has \"agentLlmProvider\": true or keywords includes \"agent-llm-provider\".\n * @param cwd Directory containing node_modules; default process.cwd()\n * @returns List of package names that can be passed to loadLLMExtensions()\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.agentLlmProvider === 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\n/**\n * Load a module from a package directory (e.g. cwd/node_modules/packageName).\n * Reads package.json \"main\" and imports that file.\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\nexport interface LoadLLMExtensionsOptions {\n /** If set, try loading each package from cwd/node_modules/<package> first (so npx @easynet/agent-llm from a project dir finds local provider). */\n cwd?: string;\n}\n\n/**\n * Load LLM extensions by npm package name.\n * Prefers ILLMExtension (getLLMExtension() or default export); falls back to registerLLMExtension().\n * When options.cwd is set, tries loading from cwd/node_modules/<package> first so running from a provider project (e.g. wallee-llm) uses the local package.\n * Safe to call multiple times; each package is loaded at most once.\n * @param extensionPackages npm package names; when omitted, loads none\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 // Try loading from cwd/node_modules first, or from cwd itself when cwd is the provider project (e.g. running from wallee-llm repo)\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 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 // extension not installed or load failed — continue with other packages (fault tolerance)\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\n/**\n * Discover provider packages in node_modules and load them.\n * Equivalent to loadLLMExtensions(discoverLLMExtensions(cwd)).\n * @param cwd Directory containing node_modules; default process.cwd()\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 model provider.\n * Format: npm:<package-name> or npm:<package-name>@<version> or npm:<package-name>#<provider-name> or npm:<package-name>@<version>#<provider-name>\n * When installNpmIfMissing is true, the framework will run npm install <package>[@version] if the package is not found.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { loadLLMExtensions } from \"./loader.js\";\nimport { getChatModelFactory } from \"../registry/chat-model.js\";\nimport { createChatModelFromLlmConfig } from \"../langchain/adapter.js\";\nimport type { CreateChatModelFromLlmConfigOptions } from \"../langchain/adapter.js\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\n\nexport const NPM_PROTOCOL_PREFIX = \"npm:\";\n\n/** Parse npm: spec into package name, optional version, and optional #provider fragment. */\nexport function parseNpmProviderSpec(spec: string): { packageName: string; version?: string; provider?: string } | null {\n if (typeof spec !== \"string\" || !spec.startsWith(NPM_PROTOCOL_PREFIX)) return null;\n const rest = spec.slice(NPM_PROTOCOL_PREFIX.length);\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx >= 0 ? rest.slice(0, hashIdx).trim() : rest.trim();\n const fragmentProvider = hashIdx >= 0 ? rest.slice(hashIdx + 1).trim() : null;\n // Extract version: last @ not part of scoped package (e.g. pkg@0.1.0 or @scope/pkg@1.0.0)\n const versionMatch = beforeHash.match(/@([^/]+)$/);\n const packageName = versionMatch ? beforeHash.slice(0, -versionMatch[0].length).trim() : beforeHash;\n const version = versionMatch ? versionMatch[1] : undefined;\n if (!packageName) return null;\n return { packageName, version, provider: fragmentProvider ?? undefined };\n}\n\nexport interface EnsureNpmPackageInstalledOptions {\n /** Version to install (e.g. 0.1.0, latest). If set, runs npm install <package>@<version>. */\n version?: string;\n /** Working directory for npm install. Default: process.cwd() */\n cwd?: string;\n}\n\n/**\n * Check if a provider spec uses the npm: protocol.\n */\nexport function isNpmProviderSpec(spec: unknown): spec is string {\n return typeof spec === \"string\" && spec.startsWith(NPM_PROTOCOL_PREFIX);\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 );\n}\n\n/**\n * Ensure an npm package is installed: if it cannot be resolved, run npm install <packageName>[@version] from cwd.\n * Call this before loading a provider package when the config uses npm:<package-name>[@version].\n */\nexport async function ensureNpmPackageInstalled(\n packageName: string,\n options: EnsureNpmPackageInstalledOptions = {}\n): Promise<void> {\n if (typeof packageName !== \"string\" || packageName.trim().length === 0) {\n throw new Error(\"agent-llm: ensureNpmPackageInstalled requires a non-empty package name\");\n }\n const cwd = options.cwd ?? process.cwd();\n const version = options.version;\n try {\n await import(/* @vite-ignore */ packageName);\n return;\n } catch (err) {\n if (!isModuleNotFoundError(err)) throw err;\n }\n const installSpec = version ? `${packageName}@${version}` : packageName;\n try {\n execSync(`npm install ${installSpec}`, {\n cwd,\n stdio: \"inherit\",\n encoding: \"utf-8\",\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`agent-llm: npm install failed for ${installSpec}: ${msg}`, { cause: e });\n }\n}\n\nexport interface ResolveNpmProviderOptions {\n /** If true (default), run npm install <package> when the package is not found. */\n installNpmIfMissing?: boolean;\n /** Working directory for npm install. Default: process.cwd() */\n cwd?: string;\n}\n\n/**\n * Resolve an npm provider spec to the concrete provider name.\n * - npm:<package> → load package, use its default provider\n * - npm:<package>@<version> → load package@version, use its default provider\n * - npm:<package>#<provider> → load package, use provider from fragment\n * - npm:<package>@<version>#<provider> → load package@version, use provider from fragment\n * When installNpmIfMissing is true, installs the package (with optional version) if not found.\n * Returns the provider name to use, or null if spec is not npm: protocol.\n */\nfunction normalizeAgentLlMError(e: unknown, context: string): Error {\n if (e instanceof Error) {\n return new Error(`${context}: ${e.message}`, { cause: e });\n }\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\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 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 normalizeAgentLlMError(installErr, `agent-llm: failed to install or load npm provider \"${packageName}\"`);\n }\n } else {\n throw normalizeAgentLlMError(err, `agent-llm: failed to load npm provider \"${packageName}\"`);\n }\n }\n\n // If we need a specific provider (fragment) but loadLLMExtensions didn't register it (e.g. package was missing and didn't throw), try installing and load again\n if (fragmentProvider && installNpmIfMissing && !getChatModelFactory(fragmentProvider)) {\n try {\n await ensureNpmPackageInstalled(packageName, { version, cwd });\n await load();\n } catch (installErr) {\n throw normalizeAgentLlMError(installErr, `agent-llm: failed to install or load npm provider \"${packageName}\" (provider \"${fragmentProvider}\" not registered)`);\n }\n if (!getChatModelFactory(fragmentProvider)) {\n throw new Error(`agent-llm: 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 (\n typeof (m as { getDefaultProviderName?: () => string }).getDefaultProviderName === \"function\"\n ) {\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\n/**\n * Recursively resolve all provider values that use the npm: protocol in a clone of the llm section.\n * When installNpmIfMissing is true, installs any npm: package that is not found.\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 normalizeAgentLlMError(e, `agent-llm: 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 normalizeAgentLlMError(e, `agent-llm: failed to resolve provider \"${String(v)}\"`);\n }\n continue;\n }\n try {\n out[k] = await resolveLlmSectionWithNpm(v, options);\n } catch (e) {\n throw normalizeAgentLlMError(e, `agent-llm: failed to resolve llm section key \"${k}\"`);\n }\n }\n return out;\n }\n return llmSection;\n}\n\nexport interface CreateChatModelFromLlmConfigWithNpmOptions\n extends CreateChatModelFromLlmConfigOptions,\n ResolveNpmProviderOptions {}\n\n/**\n * Create a LangChain ChatModel from llm section, resolving any provider values that use the npm: protocol.\n * Use when config has provider: \"npm:<package>\" or \"npm:<package>#<provider>\".\n * When installNpmIfMissing is true (default), the framework will run npm install <package> if the package is not found.\n */\nexport async function createChatModelFromLlmConfigWithNpm(\n options: CreateChatModelFromLlmConfigWithNpmOptions\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 normalizeAgentLlMError(e, \"agent-llm: createChatModelFromLlmConfigWithNpm failed\");\n }\n}\n","/**\n * Return a LangChain-formatted LLM from config (llm.yaml in current directory).\n * Use this LLM with LangChain's createAgent (e.g. createToolCallingAgent + AgentExecutor).\n */\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { createChatModelFromLlmConfig } from \"../langchain/adapter.js\";\nimport { createChatModelFromLlmConfigWithNpm } from \"../extensions/npm-protocol.js\";\nimport { loadLlmConfig } from \"../config/loader.js\";\n\nexport interface CreateAgentLlMOptions {\n /** Path to YAML config file. If omitted, uses llm.yaml in the current directory (cwd). */\n configPath?: string;\n /** If true (default), run npm install when provider is npm:<package> and package is not found. */\n installNpmIfMissing?: boolean;\n}\n\nfunction resolveDefaultConfigPath(): string {\n const cwd = process.cwd();\n return join(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 normalizeCreateOptions(\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 normalizeAgentLlMError(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 * Internal: create LLM from config without resolving npm: providers (sync).\n */\nfunction createAgentLlMInternal(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): ReturnType<typeof createChatModelFromLlmConfig> {\n try {\n const options = normalizeOptions(configPathOrOptions);\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n if (llmSection == null) {\n throw new Error(`No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`);\n }\n return createChatModelFromLlmConfig({ llmSection });\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"No LLM config\")) throw e;\n throw normalizeAgentLlMError(e, \"agent-llm: createAgentLlM failed\");\n }\n}\n\n/**\n * Create a LangChain-formatted LLM from config. Resolves npm: providers and optionally installs packages.\n * - createAgentLlM() — uses llm.yaml in the current directory\n * - createAgentLlM(\"path/to/llm.yaml\") — use specific config file\n * - createAgentLlM({ configPath: \"...\", installNpmIfMissing: true }) — options object\n */\nexport async function createAgentLlM(\n configPathOrOptions?: string | CreateAgentLlMOptions\n): Promise<ReturnType<typeof createChatModelFromLlmConfig>> {\n try {\n const options = normalizeCreateOptions(configPathOrOptions);\n const configPath = options.configPath ?? resolveDefaultConfigPath();\n const llmSection = loadLlmConfig(configPath);\n if (llmSection == null) {\n throw new Error(`No LLM config at ${configPath}. Add llm.yaml in the current directory, or pass configPath.`);\n }\n return await createChatModelFromLlmConfigWithNpm({\n llmSection,\n installNpmIfMissing: options.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"No LLM config\")) throw e;\n throw normalizeAgentLlMError(e, \"agent-llm: createAgentLlM failed\");\n }\n}\n"],"mappings":"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","names":["model","apiKey","readFileSync","existsSync","existsSync","readFileSync","name","normalizeAgentLlMError","join","join","normalizeAgentLlMError","normalizeAgentLlMError"]}
|