@easynet/agent-llm 1.0.15 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/api/create-agent-llm.d.ts +4 -18
  2. package/dist/api/create-agent-llm.d.ts.map +1 -1
  3. package/dist/api/get-default-llm-config.d.ts +16 -0
  4. package/dist/api/get-default-llm-config.d.ts.map +1 -0
  5. package/dist/{chunk-AZDHRCIM.js → chunk-H4UQIDGT.js} +171 -338
  6. package/dist/chunk-H4UQIDGT.js.map +1 -0
  7. package/dist/cli/index.d.ts +0 -7
  8. package/dist/cli/index.d.ts.map +1 -1
  9. package/dist/cli/index.js +7 -12
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/cli/utils.d.ts +12 -0
  12. package/dist/cli/utils.d.ts.map +1 -0
  13. package/dist/config/index.d.ts +1 -3
  14. package/dist/config/index.d.ts.map +1 -1
  15. package/dist/config/loader.d.ts +0 -14
  16. package/dist/config/loader.d.ts.map +1 -1
  17. package/dist/config/parser.d.ts +0 -3
  18. package/dist/config/parser.d.ts.map +1 -1
  19. package/dist/config/yaml.d.ts +9 -0
  20. package/dist/config/yaml.d.ts.map +1 -0
  21. package/dist/connectivity/check.d.ts +0 -23
  22. package/dist/connectivity/check.d.ts.map +1 -1
  23. package/dist/connectivity/index.d.ts +2 -4
  24. package/dist/connectivity/index.d.ts.map +1 -1
  25. package/dist/connectivity/types.d.ts +0 -11
  26. package/dist/connectivity/types.d.ts.map +1 -1
  27. package/dist/extensions/index.d.ts +3 -3
  28. package/dist/extensions/index.d.ts.map +1 -1
  29. package/dist/extensions/loader.d.ts +1 -17
  30. package/dist/extensions/loader.d.ts.map +1 -1
  31. package/dist/extensions/npm-protocol.d.ts +7 -33
  32. package/dist/extensions/npm-protocol.d.ts.map +1 -1
  33. package/dist/index.d.ts +18 -13
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +56 -38
  36. package/dist/index.js.map +1 -1
  37. package/dist/langchain/index.d.ts +13 -3
  38. package/dist/langchain/index.d.ts.map +1 -1
  39. package/dist/langchain/openai-compatible.d.ts +21 -0
  40. package/dist/langchain/openai-compatible.d.ts.map +1 -0
  41. package/dist/registry/chat-model.d.ts +1 -8
  42. package/dist/registry/chat-model.d.ts.map +1 -1
  43. package/dist/registry/index.d.ts +0 -5
  44. package/dist/registry/index.d.ts.map +1 -1
  45. package/dist/types.d.ts +12 -166
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/utils/deep-merge.d.ts +5 -0
  48. package/dist/utils/deep-merge.d.ts.map +1 -0
  49. package/package.json +11 -9
  50. package/dist/chunk-AZDHRCIM.js.map +0 -1
  51. package/dist/langchain/adapter.d.ts +0 -21
  52. package/dist/langchain/adapter.d.ts.map +0 -1
  53. package/dist/providers/index.d.ts +0 -7
  54. package/dist/providers/index.d.ts.map +0 -1
  55. package/dist/providers/openai.d.ts +0 -9
  56. package/dist/providers/openai.d.ts.map +0 -1
  57. package/dist/registry/client.d.ts +0 -13
  58. package/dist/registry/client.d.ts.map +0 -1
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"npm-protocol.d.ts","sourceRoot":"","sources":["../../src/extensions/npm-protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAIjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAG1C,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,GAAG,IAAI,CAUtG;AAED,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,CAWtH;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAE/D;AAiCD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,MAAM,WAAW,yBAAyB;IACxC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAOD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsDxB;AAED,MAAM,WAAW,+BAAgC,SAAQ,yBAAyB;CAAG;AAErF,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,MAAM,WAAW,6BACf,SAAQ,sBAAsB,EAC5B,yBAAyB;CAAG;AAEhC,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,aAAa,CAAC,CAcxB"}
package/dist/index.d.ts CHANGED
@@ -1,25 +1,30 @@
1
1
  /**
2
- * @easynet/agent-llm: multi-provider, multi-model LLM with id and type.
3
- * Consumes agent.yaml llm section; provides simple chat/image API.
4
- * Extensions register via registerProvider/registerChatModelProvider; call loadLLMExtensions() before using them.
2
+ * @easynet/agent-llm: Simple LangChain ChatModel from llm.yaml.
3
+ * Multi-provider support via extensions; default is ChatOpenAI from @langchain/openai.
5
4
  */
6
5
  export { parseLlmSection } from "./config/parser.js";
7
6
  export { loadLlmConfig, parseLlmYaml, substituteEnv } from "./config/loader.js";
7
+ export { loadYamlConfig } from "./config/yaml.js";
8
8
  export type { LoadLlmConfigOptions } from "./config/loader.js";
9
- export { createLLMRegistry } from "./registry/client.js";
10
- export type { CreateLLMRegistryOptions } from "./registry/client.js";
9
+ export { deepMerge } from "./utils/deep-merge.js";
10
+ export { createChatOpenAI } from "./langchain/openai-compatible.js";
11
+ export type { CreateChatOpenAIOptions } from "./langchain/openai-compatible.js";
12
+ export { createChatModelFromLlmConfig } from "./langchain/index.js";
13
+ export type { CreateChatModelOptions } from "./langchain/index.js";
11
14
  export { registerChatModelProvider, getChatModelFactory } from "./registry/chat-model.js";
12
- export { createClient, registerProvider } from "./providers/index.js";
13
- export { createOpenAIClient, createOpenAIChatClient, createOpenAIImageClient } from "./providers/openai.js";
14
- export { createChatModelFromLlmConfig } from "./langchain/adapter.js";
15
- export type { CreateChatModelFromLlmConfigOptions } from "./langchain/adapter.js";
16
- export { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec, getLatestVersion, getInstalledVersion, ensureNpmPackageInstalled, resolveNpmProvider, resolveLlmSectionWithNpm, createChatModelFromLlmConfigWithNpm, } from "./extensions/npm-protocol.js";
17
- export type { EnsureNpmPackageInstalledOptions, ResolveNpmProviderOptions, ResolveLlmSectionWithNpmOptions, CreateChatModelFromLlmConfigWithNpmOptions, } from "./extensions/npm-protocol.js";
18
- export { loadLLMExtensions, resolveLLMExtensionPackages, discoverLLMExtensions, loadDiscoveredExtensions } from "./extensions/loader.js";
15
+ export type { ChatModelFactory } from "./registry/chat-model.js";
16
+ export { NPM_PROTOCOL_PREFIX, parseNpmProviderSpec, isNpmProviderSpec, getLatestVersion, getInstalledVersion, ensureNpmPackageInstalled, resolveNpmProvider, resolveLlmSectionWithNpm, createChatModelWithNpm, } from "./extensions/npm-protocol.js";
17
+ export type { EnsureNpmPackageInstalledOptions, ResolveNpmProviderOptions, ResolveLlmSectionWithNpmOptions, CreateChatModelWithNpmOptions, } from "./extensions/npm-protocol.js";
18
+ export { loadLLMExtensions, resolveLLMExtensionPackages, discoverLLMExtensions, loadDiscoveredExtensions, } from "./extensions/loader.js";
19
+ export type { LoadLLMExtensionsOptions } from "./extensions/loader.js";
19
20
  export { createAgentLlM } from "./api/create-agent-llm.js";
20
21
  export type { CreateAgentLlMOptions } from "./api/create-agent-llm.js";
22
+ export { getDefaultLlmConfig } from "./api/get-default-llm-config.js";
23
+ export type { GetDefaultLlmConfigOptions } from "./api/get-default-llm-config.js";
24
+ export { messageContentToString, exitWithError } from "./cli/utils.js";
21
25
  export { checkEndpointConnectivity, buildUnreachableError, CIS_UNREACHABLE_REMINDER, } from "./connectivity/check.js";
26
+ export type { EndpointConnectivityOptions } from "./connectivity/check.js";
22
27
  export type { ConnectionStatus, ConnectionPhase, CheckConnectivityResult, } from "./connectivity/types.js";
23
- export type { LLMType, LLMConfig, AgentConfigLlmSection, ChatMessage, ChatResult, ChatStreamChunk, ImageResult, ToolDefinition, ChatWithToolsMessage, ChatWithToolsResult, ChatWithToolsStreamChunk, ILLMClient, ILLMRegistry, ILLMExtension, } from "./types.js";
28
+ export type { LLMType, LLMConfig, AgentConfigLlmSection, ILLMExtension, } from "./types.js";
24
29
  export { AGENT_LLM_PROVIDER_FIELD } from "./types.js";
25
30
  //# sourceMappingURL=index.d.ts.map
@@ -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,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,gCAAgC,EAChC,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,YAAY,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAGlF,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,17 +1,16 @@
1
1
  import {
2
+ AGENT_LLM_PROVIDER_FIELD,
2
3
  CIS_UNREACHABLE_REMINDER,
3
4
  NPM_PROTOCOL_PREFIX,
4
5
  buildUnreachableError,
5
6
  checkEndpointConnectivity,
6
7
  createAgentLlM,
7
8
  createChatModelFromLlmConfig,
8
- createChatModelFromLlmConfigWithNpm,
9
- createClient,
10
- createOpenAIChatClient,
11
- createOpenAIClient,
12
- createOpenAIImageClient,
9
+ createChatModelWithNpm,
10
+ createChatOpenAI,
13
11
  discoverLLMExtensions,
14
12
  ensureNpmPackageInstalled,
13
+ exitWithError,
15
14
  getChatModelFactory,
16
15
  getInstalledVersion,
17
16
  getLatestVersion,
@@ -19,45 +18,64 @@ import {
19
18
  loadDiscoveredExtensions,
20
19
  loadLLMExtensions,
21
20
  loadLlmConfig,
21
+ messageContentToString,
22
22
  parseLlmSection,
23
23
  parseLlmYaml,
24
24
  parseNpmProviderSpec,
25
25
  registerChatModelProvider,
26
- registerProvider,
27
26
  resolveLLMExtensionPackages,
28
27
  resolveLlmSectionWithNpm,
29
28
  resolveNpmProvider,
30
29
  substituteEnv
31
- } from "./chunk-AZDHRCIM.js";
30
+ } from "./chunk-H4UQIDGT.js";
32
31
 
33
- // src/registry/client.ts
34
- function createLLMRegistry(options) {
35
- const { defaultId, configs } = parseLlmSection(options.llmSection);
36
- const map = /* @__PURE__ */ new Map();
37
- for (const config of configs) {
38
- try {
39
- const client = createClient(config);
40
- map.set(config.id, client);
41
- } catch (err) {
42
- console.warn(`[agent-llm] Skip LLM "${config.id}": ${err instanceof Error ? err.message : String(err)}`);
43
- }
32
+ // src/config/yaml.ts
33
+ import { readFileSync, existsSync } from "fs";
34
+ import { parse as parseYaml } from "yaml";
35
+ function loadYamlConfig(filePath) {
36
+ if (!existsSync(filePath)) return {};
37
+ try {
38
+ const content = readFileSync(filePath, "utf8");
39
+ const parsed = parseYaml(content);
40
+ return parsed || {};
41
+ } catch (e) {
42
+ const msg = e instanceof Error ? e.message : String(e);
43
+ throw new Error(`Failed to load YAML config from ${filePath}: ${msg}`, { cause: e });
44
44
  }
45
- return {
46
- get(id) {
47
- return map.get(id);
48
- },
49
- defaultId() {
50
- if (map.has(defaultId)) return defaultId;
51
- return map.size > 0 ? [...map.keys()][0] : void 0;
52
- },
53
- ids() {
54
- return [...map.keys()];
45
+ }
46
+
47
+ // src/utils/deep-merge.ts
48
+ function deepMerge(target, ...sources) {
49
+ for (const src of sources) {
50
+ if (!src || typeof src !== "object") continue;
51
+ for (const k of Object.keys(src)) {
52
+ const v = src[k];
53
+ if (v === void 0) continue;
54
+ const t = target[k];
55
+ if (v !== null && typeof v === "object" && !Array.isArray(v) && t !== null && typeof t === "object" && !Array.isArray(t)) {
56
+ deepMerge(t, v);
57
+ } else {
58
+ target[k] = v;
59
+ }
55
60
  }
56
- };
61
+ }
62
+ return target;
57
63
  }
58
64
 
59
- // src/types.ts
60
- var AGENT_LLM_PROVIDER_FIELD = "agentLlmProvider";
65
+ // src/api/get-default-llm-config.ts
66
+ import { join } from "path";
67
+ async function getDefaultLlmConfig(options = {}) {
68
+ const configPath = options.configPath ?? join(process.cwd(), "llm.yaml");
69
+ const llmSection = loadLlmConfig(configPath);
70
+ if (llmSection == null) return null;
71
+ const resolved = await resolveLlmSectionWithNpm(llmSection, {
72
+ installNpmIfMissing: options.installNpmIfMissing !== false,
73
+ cwd: process.cwd()
74
+ });
75
+ const { defaultId, configs } = parseLlmSection(resolved);
76
+ const defaultConfig = configs.find((c) => c.id === defaultId) ?? configs[0] ?? null;
77
+ return defaultConfig;
78
+ }
61
79
  export {
62
80
  AGENT_LLM_PROVIDER_FIELD,
63
81
  CIS_UNREACHABLE_REMINDER,
@@ -66,26 +84,26 @@ export {
66
84
  checkEndpointConnectivity,
67
85
  createAgentLlM,
68
86
  createChatModelFromLlmConfig,
69
- createChatModelFromLlmConfigWithNpm,
70
- createClient,
71
- createLLMRegistry,
72
- createOpenAIChatClient,
73
- createOpenAIClient,
74
- createOpenAIImageClient,
87
+ createChatModelWithNpm,
88
+ createChatOpenAI,
89
+ deepMerge,
75
90
  discoverLLMExtensions,
76
91
  ensureNpmPackageInstalled,
92
+ exitWithError,
77
93
  getChatModelFactory,
94
+ getDefaultLlmConfig,
78
95
  getInstalledVersion,
79
96
  getLatestVersion,
80
97
  isNpmProviderSpec,
81
98
  loadDiscoveredExtensions,
82
99
  loadLLMExtensions,
83
100
  loadLlmConfig,
101
+ loadYamlConfig,
102
+ messageContentToString,
84
103
  parseLlmSection,
85
104
  parseLlmYaml,
86
105
  parseNpmProviderSpec,
87
106
  registerChatModelProvider,
88
- registerProvider,
89
107
  resolveLLMExtensionPackages,
90
108
  resolveLlmSectionWithNpm,
91
109
  resolveNpmProvider,
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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":[]}
1
+ {"version":3,"sources":["../src/config/yaml.ts","../src/utils/deep-merge.ts","../src/api/get-default-llm-config.ts"],"sourcesContent":["/**\n * Generic YAML file loader utility.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\n\n/**\n * Load and parse a YAML file into a typed object.\n * Returns empty object if file doesn't exist.\n */\nexport function loadYamlConfig<T = Record<string, unknown>>(filePath: string): T {\n if (!existsSync(filePath)) return {} as T;\n\n try {\n const content = readFileSync(filePath, \"utf8\");\n const parsed = parseYaml(content);\n return (parsed || {}) as T;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to load YAML config from ${filePath}: ${msg}`, { cause: e });\n }\n}\n","/**\n * Deep merge: overwrite target with each source (only defined values). Nested objects merged recursively.\n */\n\nexport function deepMerge<T extends object>(target: T, ...sources: Partial<T>[]): T {\n for (const src of sources) {\n if (!src || typeof src !== \"object\") continue;\n for (const k of Object.keys(src) as (keyof T)[]) {\n const v = src[k];\n if (v === undefined) continue;\n const t = (target as Record<keyof T, unknown>)[k];\n if (\n v !== null &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n t !== null &&\n typeof t === \"object\" &&\n !Array.isArray(t)\n ) {\n deepMerge(t as object, v as object);\n } else {\n (target as Record<keyof T, unknown>)[k] = v;\n }\n }\n }\n return target;\n}\n","/**\n * Load llm.yaml, resolve npm providers, and return the default LLMConfig.\n * For use by CLIs (e.g. wallee-llm) that need config without creating a model.\n */\n\nimport { join } from \"node:path\";\nimport { loadLlmConfig } from \"../config/loader.js\";\nimport { parseLlmSection } from \"../config/parser.js\";\nimport { resolveLlmSectionWithNpm } from \"../extensions/npm-protocol.js\";\nimport type { LLMConfig } from \"../types.js\";\n\nexport interface GetDefaultLlmConfigOptions {\n /** Path to llm.yaml. Default: process.cwd() + \"/llm.yaml\" */\n configPath?: string;\n /** Install npm provider packages if missing. Default true. */\n installNpmIfMissing?: boolean;\n}\n\n/**\n * Returns the default LLM config from llm.yaml (after resolving npm: providers), or null if no config file.\n */\nexport async function getDefaultLlmConfig(\n options: GetDefaultLlmConfigOptions = {}\n): Promise<LLMConfig | null> {\n const configPath = options.configPath ?? join(process.cwd(), \"llm.yaml\");\n const llmSection = loadLlmConfig(configPath);\n if (llmSection == null) return null;\n\n const resolved = await resolveLlmSectionWithNpm(llmSection, {\n installNpmIfMissing: options.installNpmIfMissing !== false,\n cwd: process.cwd(),\n });\n\n const { defaultId, configs } = parseLlmSection(resolved);\n const defaultConfig = configs.find((c) => c.id === defaultId) ?? configs[0] ?? null;\n return defaultConfig;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAS,cAAc,kBAAkB;AACzC,SAAS,SAAS,iBAAiB;AAM5B,SAAS,eAA4C,UAAqB;AAC/E,MAAI,CAAC,WAAW,QAAQ,EAAG,QAAO,CAAC;AAEnC,MAAI;AACF,UAAM,UAAU,aAAa,UAAU,MAAM;AAC7C,UAAM,SAAS,UAAU,OAAO;AAChC,WAAQ,UAAU,CAAC;AAAA,EACrB,SAAS,GAAG;AACV,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,UAAM,IAAI,MAAM,mCAAmC,QAAQ,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,EACrF;AACF;;;AClBO,SAAS,UAA4B,WAAc,SAA0B;AAClF,aAAW,OAAO,SAAS;AACzB,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AACrC,eAAW,KAAK,OAAO,KAAK,GAAG,GAAkB;AAC/C,YAAM,IAAI,IAAI,CAAC;AACf,UAAI,MAAM,OAAW;AACrB,YAAM,IAAK,OAAoC,CAAC;AAChD,UACE,MAAM,QACN,OAAO,MAAM,YACb,CAAC,MAAM,QAAQ,CAAC,KAChB,MAAM,QACN,OAAO,MAAM,YACb,CAAC,MAAM,QAAQ,CAAC,GAChB;AACA,kBAAU,GAAa,CAAW;AAAA,MACpC,OAAO;AACL,QAAC,OAAoC,CAAC,IAAI;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ACrBA,SAAS,YAAY;AAgBrB,eAAsB,oBACpB,UAAsC,CAAC,GACZ;AAC3B,QAAM,aAAa,QAAQ,cAAc,KAAK,QAAQ,IAAI,GAAG,UAAU;AACvE,QAAM,aAAa,cAAc,UAAU;AAC3C,MAAI,cAAc,KAAM,QAAO;AAE/B,QAAM,WAAW,MAAM,yBAAyB,YAAY;AAAA,IAC1D,qBAAqB,QAAQ,wBAAwB;AAAA,IACrD,KAAK,QAAQ,IAAI;AAAA,EACnB,CAAC;AAED,QAAM,EAAE,WAAW,QAAQ,IAAI,gBAAgB,QAAQ;AACvD,QAAM,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,KAAK;AAC/E,SAAO;AACT;","names":[]}
@@ -1,6 +1,16 @@
1
1
  /**
2
- * LangChain module: adapter for creating LangChain ChatModels from config.
2
+ * Simple LangChain module: create ChatOpenAI from llm config.
3
+ * Extensions can register custom ChatModel factories via the registry.
3
4
  */
4
- export { createChatModelFromLlmConfig } from "./adapter.js";
5
- export type { CreateChatModelFromLlmConfigOptions } from "./adapter.js";
5
+ import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
6
+ export interface CreateChatModelOptions {
7
+ llmSection?: unknown;
8
+ modelEnv?: string;
9
+ apiKeyEnv?: string;
10
+ }
11
+ /**
12
+ * Create a LangChain ChatModel from agent config llm section.
13
+ * Uses extension-registered factory when available; otherwise creates ChatOpenAI.
14
+ */
15
+ export declare function createChatModelFromLlmConfig(options?: CreateChatModelOptions): BaseChatModel;
6
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/langchain/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,mCAAmC,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/langchain/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AASjF,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,sBAA2B,GACnC,aAAa,CA4Ef"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Create ChatOpenAI from config - works with any OpenAI-compatible provider.
3
+ * This is the ONLY place we create ChatOpenAI instances.
4
+ */
5
+ import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
6
+ import type { Agent } from "node:http";
7
+ export interface CreateChatOpenAIOptions {
8
+ baseURL?: string;
9
+ model: string;
10
+ temperature?: number;
11
+ apiKey?: string;
12
+ defaultHeaders?: Record<string, string>;
13
+ defaultQuery?: Record<string, string>;
14
+ httpAgent?: Agent;
15
+ }
16
+ /**
17
+ * Create ChatOpenAI from options.
18
+ * Works with OpenAI and any OpenAI-compatible endpoint (CIS, Ollama, etc.).
19
+ */
20
+ export declare function createChatOpenAI(options: CreateChatOpenAIOptions): BaseChatModel;
21
+ //# sourceMappingURL=openai-compatible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../src/langchain/openai-compatible.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,KAAK,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa,CA6BhF"}
@@ -1,17 +1,10 @@
1
1
  /**
2
2
  * Registry for LangChain ChatModel by provider name.
3
- * Extensions register via registerChatModelProvider; llmAdapter uses getChatModelFactory.
3
+ * Extensions register via registerChatModelProvider.
4
4
  */
5
5
  import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
6
6
  import type { LLMConfig } from "../types.js";
7
7
  export type ChatModelFactory = (config: LLMConfig) => BaseChatModel;
8
- /**
9
- * Register a ChatModel factory for a provider name.
10
- * Called by extensions (e.g. wallee-llm) on load.
11
- */
12
8
  export declare function registerChatModelProvider(providerName: string, factory: ChatModelFactory): void;
13
- /**
14
- * Get the ChatModel factory for a provider name, if registered.
15
- */
16
9
  export declare function getChatModelFactory(providerName: string): ChatModelFactory | undefined;
17
10
  //# sourceMappingURL=chat-model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-model.d.ts","sourceRoot":"","sources":["../../src/registry/chat-model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,aAAa,CAAC;AAIpE;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAE/F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEtF"}
1
+ {"version":3,"file":"chat-model.d.ts","sourceRoot":"","sources":["../../src/registry/chat-model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,aAAa,CAAC;AAIpE,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAE/F;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEtF"}
@@ -1,8 +1,3 @@
1
- /**
2
- * Registry module: manage LLM client and ChatModel registries.
3
- */
4
- export { createLLMRegistry } from "./client.js";
5
- export type { CreateLLMRegistryOptions } from "./client.js";
6
1
  export { registerChatModelProvider, getChatModelFactory } from "./chat-model.js";
7
2
  export type { ChatModelFactory } from "./chat-model.js";
8
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,37 +1,24 @@
1
1
  /**
2
- * Agent LLM: OpenAI-compatible format only (/v1/chat/completions etc.).
3
- * Multi-instance: each LLM has id and type; optional baseURL for other compatible endpoints.
2
+ * Agent LLM: OpenAI-compatible config.
3
+ * Returns LangChain BaseChatModel instances.
4
4
  */
5
- /** LLM type: chat = conversation, image = image generation (OpenAI-compatible format) */
5
+ import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
6
6
  export type LLMType = "chat" | "image";
7
- /** Single LLM config: id, type, model; OpenAI-compatible API only */
8
7
  export interface LLMConfig {
9
- /** Unique id for fetching the instance from the registry */
10
8
  id: string;
11
- /** chat | image */
12
9
  type: LLMType;
13
- /** Must be openai or openai-compatible; only this format is supported */
14
10
  provider: string;
15
- /** Model name, e.g. gpt-4o-mini, dall-e-3 */
16
11
  model?: string;
17
- /** Temperature etc.; commonly used for chat */
18
12
  temperature?: number;
19
- /** API key; can also be set via env */
20
13
  apiKey?: string;
21
- /** OpenAI-compatible endpoint baseURL (e.g. Azure, local proxy, other /v1-compatible vendors) */
22
14
  baseURL?: string;
23
- /** Other options (passed through) */
15
+ options?: Record<string, unknown>;
24
16
  [key: string]: unknown;
25
17
  }
26
- /** agent.yaml llm section: flat (each model keyed by name), default+instances, or single object */
27
18
  export interface AgentConfigLlmSection {
28
- /** Default model name (id) to use */
29
19
  default?: string;
30
- /** npm package name or array for dynamic load; e.g. "wallee-llm" or ["wallee-llm"] */
31
20
  type?: string | string[];
32
- /** Array of LLM configs */
33
21
  instances?: LLMConfig[];
34
- /** Single-object form: provider, model etc., parsed as id=default chat */
35
22
  provider?: string;
36
23
  model?: string;
37
24
  name?: string;
@@ -39,161 +26,20 @@ export interface AgentConfigLlmSection {
39
26
  apiKey?: string;
40
27
  baseURL?: string;
41
28
  base_url?: string;
42
- /** Flat: strong/medium/fast etc. name → config (provider, base_url, name, options) */
29
+ options?: Record<string, unknown>;
43
30
  [key: string]: unknown;
44
31
  }
45
- /** Single chat message */
46
- export interface ChatMessage {
47
- role: "system" | "user" | "assistant";
48
- content: string;
49
- }
50
- /** Minimal chat result */
51
- export interface ChatResult {
52
- content: string;
53
- usage?: {
54
- promptTokens?: number;
55
- completionTokens?: number;
56
- };
57
- }
58
- /** Stream chunk for chat responses */
59
- export interface ChatStreamChunk {
60
- content: string;
61
- done: boolean;
62
- usage?: {
63
- promptTokens?: number;
64
- completionTokens?: number;
65
- };
66
- }
67
- /** OpenAI-compatible tool definition (function) */
68
- export interface ToolDefinition {
69
- type: "function";
70
- function: {
71
- name: string;
72
- description?: string;
73
- parameters?: object;
74
- };
75
- }
76
- /** Message with tool calls (assistant may include tool_calls; tool = tool result) */
77
- export type ChatWithToolsMessage = ChatMessage | {
78
- role: "tool";
79
- content: string;
80
- tool_call_id: string;
81
- } | {
82
- role: "assistant";
83
- content?: string | null;
84
- tool_calls?: Array<{
85
- id: string;
86
- type: "function";
87
- function: {
88
- name: string;
89
- arguments: string;
90
- };
91
- }>;
92
- };
93
- /** Chat result with tool calls */
94
- export interface ChatWithToolsResult {
95
- message: {
96
- role: "assistant";
97
- content?: string | null;
98
- tool_calls?: Array<{
99
- id: string;
100
- type: "function";
101
- function: {
102
- name: string;
103
- arguments: string;
104
- };
105
- }>;
106
- };
107
- usage?: {
108
- promptTokens?: number;
109
- completionTokens?: number;
110
- };
111
- }
112
- /** Stream chunk for chat with tools responses */
113
- export interface ChatWithToolsStreamChunk {
114
- delta: {
115
- role?: "assistant";
116
- content?: string | null;
117
- tool_calls?: Array<{
118
- index: number;
119
- id?: string;
120
- type?: "function";
121
- function?: {
122
- name?: string;
123
- arguments?: string;
124
- };
125
- }>;
126
- };
127
- done: boolean;
128
- usage?: {
129
- promptTokens?: number;
130
- completionTokens?: number;
131
- };
132
- }
133
- /** Image generation result */
134
- export interface ImageResult {
135
- url?: string;
136
- b64?: string;
137
- }
138
- /**
139
- * Minimal interface for a single LLM instance.
140
- * type=chat provides chat; type=image provides generateImage.
141
- * chat type may optionally provide chatWithTools for ReAct/Agent tool calling.
142
- */
143
- export interface ILLMClient {
144
- readonly id: string;
145
- readonly type: LLMType;
146
- /** Chat (available when type=chat) */
147
- chat(messages: ChatMessage[]): Promise<ChatResult>;
148
- /**
149
- * Chat with streaming (optional when type=chat).
150
- * Returns an async generator that yields chunks as they arrive.
151
- */
152
- chatStream?(messages: ChatMessage[]): AsyncGenerator<ChatStreamChunk, void, unknown>;
153
- /**
154
- * Chat with tools (optional when type=chat; for ReAct/Agent).
155
- * If not implemented, caller may poll with chat or use another client.
156
- */
157
- chatWithTools?(messages: ChatWithToolsMessage[], tools: ToolDefinition[], options?: {
158
- timeoutMs?: number;
159
- }): Promise<ChatWithToolsResult>;
160
- /**
161
- * Chat with tools and streaming (optional when type=chat).
162
- * Returns an async generator that yields chunks as they arrive.
163
- */
164
- chatWithToolsStream?(messages: ChatWithToolsMessage[], tools: ToolDefinition[], options?: {
165
- timeoutMs?: number;
166
- }): AsyncGenerator<ChatWithToolsStreamChunk, void, unknown>;
167
- /** Image generation (when type=image); otherwise may throw or be ignored */
168
- generateImage?(options: {
169
- prompt: string;
170
- size?: string;
171
- n?: number;
172
- }): Promise<ImageResult>;
173
- }
174
- /**
175
- * LLM registry created from llm section: get instance by id.
176
- */
177
- export interface ILLMRegistry {
178
- get(id: string): ILLMClient | undefined;
179
- defaultId(): string | undefined;
180
- ids(): string[];
181
- }
32
+ /** package.json field: when true, the package is an agent-llm provider (for discovery). */
33
+ export declare const AGENT_LLM_PROVIDER_FIELD = "agentLlmProvider";
182
34
  /**
183
- * Generic interface for an LLM provider extension (npm package).
184
- * Implement getLLMExtension() returning this; framework will register the provider when loading.
185
- * Prefer createClient + createChatModel so the framework does registration (extension need not call register).
35
+ * Extension interface: register a ChatModel factory by provider name.
36
+ * Extensions implement getLLMExtension(); framework registers the factory when loading.
186
37
  */
187
38
  export interface ILLMExtension {
188
- /** Provider name (e.g. "openai" or extension-specific name). Framework registers under this name. */
189
39
  readonly providerName: string;
190
- /** ILLMClient factory. If present with createChatModel, framework calls registerProvider(providerName, createClient). */
191
- readonly createClient?: (config: LLMConfig) => ILLMClient;
192
- /** LangChain ChatModel factory. If present with createClient, framework calls registerChatModelProvider(providerName, createChatModel). */
193
- readonly createChatModel?: (config: LLMConfig) => unknown;
194
- /** Legacy: if extension provides register(), framework calls it. Prefer createClient + createChatModel so framework registers. */
40
+ /** ChatModel factory. Framework calls registerChatModelProvider(providerName, createChatModel). */
41
+ readonly createChatModel?: (config: LLMConfig) => BaseChatModel;
42
+ /** Legacy: if extension provides register(), framework calls it. */
195
43
  register?(): void;
196
44
  }
197
- /** package.json field: when true, the package is an agent-llm provider (for discovery). */
198
- export declare const AGENT_LLM_PROVIDER_FIELD = "agentLlmProvider";
199
45
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAEjF,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,2FAA2F;AAC3F,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,mGAAmG;IACnG,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,aAAa,CAAC;IAChE,oEAAoE;IACpE,QAAQ,CAAC,IAAI,IAAI,CAAC;CACnB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Deep merge: overwrite target with each source (only defined values). Nested objects merged recursively.
3
+ */
4
+ export declare function deepMerge<T extends object>(target: T, ...sources: Partial<T>[]): T;
5
+ //# sourceMappingURL=deep-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-merge.d.ts","sourceRoot":"","sources":["../../src/utils/deep-merge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAsBlF"}