@aigne/core 1.15.0 → 1.17.0

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 (194) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +9 -7
  3. package/README.zh.md +9 -7
  4. package/lib/cjs/agents/agent.d.ts +168 -29
  5. package/lib/cjs/agents/agent.js +152 -56
  6. package/lib/cjs/agents/ai-agent.d.ts +7 -7
  7. package/lib/cjs/agents/ai-agent.js +19 -15
  8. package/lib/{esm/models → cjs/agents}/chat-model.d.ts +29 -19
  9. package/lib/cjs/{models → agents}/chat-model.js +56 -15
  10. package/lib/cjs/agents/guide-rail-agent.d.ts +62 -0
  11. package/lib/cjs/agents/guide-rail-agent.js +14 -0
  12. package/lib/cjs/agents/mcp-agent.d.ts +3 -4
  13. package/lib/cjs/agents/mcp-agent.js +11 -11
  14. package/lib/cjs/agents/team-agent.d.ts +7 -8
  15. package/lib/cjs/agents/team-agent.js +10 -10
  16. package/lib/cjs/agents/user-agent.d.ts +4 -4
  17. package/lib/cjs/agents/user-agent.js +10 -10
  18. package/lib/cjs/aigne/aigne.d.ts +13 -11
  19. package/lib/cjs/aigne/aigne.js +7 -6
  20. package/lib/cjs/aigne/context.d.ts +19 -8
  21. package/lib/cjs/aigne/context.js +27 -7
  22. package/lib/cjs/index.d.ts +2 -1
  23. package/lib/cjs/index.js +2 -1
  24. package/lib/cjs/loader/agent-yaml.d.ts +2 -2
  25. package/lib/cjs/loader/index.d.ts +18 -11
  26. package/lib/cjs/loader/index.js +8 -27
  27. package/lib/cjs/memory/default-memory/default-memory-storage/index.d.ts +30 -0
  28. package/lib/cjs/memory/default-memory/default-memory-storage/index.js +69 -0
  29. package/lib/cjs/memory/default-memory/default-memory-storage/migrate.d.ts +7 -0
  30. package/lib/cjs/memory/default-memory/default-memory-storage/migrate.js +53 -0
  31. package/lib/cjs/memory/default-memory/default-memory-storage/migrations/20250523165801-init.d.ts +7 -0
  32. package/lib/cjs/memory/default-memory/default-memory-storage/migrations/20250523165801-init.js +33 -0
  33. package/lib/cjs/memory/default-memory/default-memory-storage/models/memory.d.ts +10 -0
  34. package/lib/cjs/memory/default-memory/default-memory-storage/models/memory.js +32 -0
  35. package/lib/cjs/memory/default-memory/index.d.ts +10 -0
  36. package/lib/cjs/memory/{default-memory.js → default-memory/index.js} +16 -25
  37. package/lib/cjs/memory/default-memory/storage.d.ts +13 -0
  38. package/lib/cjs/memory/default-memory/storage.js +6 -0
  39. package/lib/cjs/memory/memory.d.ts +3 -2
  40. package/lib/cjs/memory/memory.js +1 -1
  41. package/lib/cjs/memory/retriever.d.ts +2 -2
  42. package/lib/cjs/prompt/prompt-builder.d.ts +10 -4
  43. package/lib/cjs/prompt/prompt-builder.js +4 -4
  44. package/lib/cjs/prompt/template.d.ts +3 -3
  45. package/lib/cjs/utils/json-schema.js +1 -1
  46. package/lib/cjs/utils/logger.d.ts +33 -8
  47. package/lib/cjs/utils/logger.js +63 -5
  48. package/lib/cjs/utils/model-utils.d.ts +1 -1
  49. package/lib/cjs/utils/stream-utils.d.ts +3 -1
  50. package/lib/cjs/utils/stream-utils.js +31 -1
  51. package/lib/cjs/utils/type-utils.d.ts +7 -2
  52. package/lib/dts/agents/agent.d.ts +168 -29
  53. package/lib/dts/agents/ai-agent.d.ts +7 -7
  54. package/lib/{cjs/models → dts/agents}/chat-model.d.ts +29 -19
  55. package/lib/dts/agents/guide-rail-agent.d.ts +62 -0
  56. package/lib/dts/agents/mcp-agent.d.ts +3 -4
  57. package/lib/dts/agents/team-agent.d.ts +7 -8
  58. package/lib/dts/agents/user-agent.d.ts +4 -4
  59. package/lib/dts/aigne/aigne.d.ts +13 -11
  60. package/lib/dts/aigne/context.d.ts +19 -8
  61. package/lib/dts/index.d.ts +2 -1
  62. package/lib/dts/loader/agent-yaml.d.ts +2 -2
  63. package/lib/dts/loader/index.d.ts +18 -11
  64. package/lib/dts/memory/default-memory/default-memory-storage/index.d.ts +30 -0
  65. package/lib/dts/memory/default-memory/default-memory-storage/migrate.d.ts +7 -0
  66. package/lib/dts/memory/default-memory/default-memory-storage/migrations/20250523165801-init.d.ts +7 -0
  67. package/lib/dts/memory/default-memory/default-memory-storage/models/memory.d.ts +10 -0
  68. package/lib/dts/memory/default-memory/index.d.ts +10 -0
  69. package/lib/dts/memory/default-memory/storage.d.ts +13 -0
  70. package/lib/dts/memory/memory.d.ts +3 -2
  71. package/lib/dts/memory/retriever.d.ts +2 -2
  72. package/lib/dts/prompt/prompt-builder.d.ts +10 -4
  73. package/lib/dts/prompt/template.d.ts +3 -3
  74. package/lib/dts/utils/logger.d.ts +33 -8
  75. package/lib/dts/utils/model-utils.d.ts +1 -1
  76. package/lib/dts/utils/stream-utils.d.ts +3 -1
  77. package/lib/dts/utils/type-utils.d.ts +7 -2
  78. package/lib/esm/agents/agent.d.ts +168 -29
  79. package/lib/esm/agents/agent.js +152 -56
  80. package/lib/esm/agents/ai-agent.d.ts +7 -7
  81. package/lib/esm/agents/ai-agent.js +18 -14
  82. package/lib/{dts/models → esm/agents}/chat-model.d.ts +29 -19
  83. package/lib/esm/{models → agents}/chat-model.js +56 -15
  84. package/lib/esm/agents/guide-rail-agent.d.ts +62 -0
  85. package/lib/esm/agents/guide-rail-agent.js +11 -0
  86. package/lib/esm/agents/mcp-agent.d.ts +3 -4
  87. package/lib/esm/agents/mcp-agent.js +11 -11
  88. package/lib/esm/agents/team-agent.d.ts +7 -8
  89. package/lib/esm/agents/team-agent.js +10 -10
  90. package/lib/esm/agents/user-agent.d.ts +4 -4
  91. package/lib/esm/agents/user-agent.js +10 -10
  92. package/lib/esm/aigne/aigne.d.ts +13 -11
  93. package/lib/esm/aigne/aigne.js +7 -6
  94. package/lib/esm/aigne/context.d.ts +19 -8
  95. package/lib/esm/aigne/context.js +28 -8
  96. package/lib/esm/index.d.ts +2 -1
  97. package/lib/esm/index.js +2 -1
  98. package/lib/esm/loader/agent-yaml.d.ts +2 -2
  99. package/lib/esm/loader/index.d.ts +18 -11
  100. package/lib/esm/loader/index.js +8 -27
  101. package/lib/esm/memory/default-memory/default-memory-storage/index.d.ts +30 -0
  102. package/lib/esm/memory/default-memory/default-memory-storage/index.js +64 -0
  103. package/lib/esm/memory/default-memory/default-memory-storage/migrate.d.ts +7 -0
  104. package/lib/esm/memory/default-memory/default-memory-storage/migrate.js +16 -0
  105. package/lib/esm/memory/default-memory/default-memory-storage/migrations/20250523165801-init.d.ts +7 -0
  106. package/lib/esm/memory/default-memory/default-memory-storage/migrations/20250523165801-init.js +28 -0
  107. package/lib/esm/memory/default-memory/default-memory-storage/models/memory.d.ts +10 -0
  108. package/lib/esm/memory/default-memory/default-memory-storage/models/memory.js +29 -0
  109. package/lib/esm/memory/default-memory/index.d.ts +10 -0
  110. package/lib/esm/memory/{default-memory.js → default-memory/index.js} +15 -24
  111. package/lib/esm/memory/default-memory/storage.d.ts +13 -0
  112. package/lib/esm/memory/default-memory/storage.js +2 -0
  113. package/lib/esm/memory/memory.d.ts +3 -2
  114. package/lib/esm/memory/memory.js +2 -2
  115. package/lib/esm/memory/retriever.d.ts +2 -2
  116. package/lib/esm/prompt/prompt-builder.d.ts +10 -4
  117. package/lib/esm/prompt/prompt-builder.js +4 -4
  118. package/lib/esm/prompt/template.d.ts +3 -3
  119. package/lib/esm/utils/json-schema.js +1 -1
  120. package/lib/esm/utils/logger.d.ts +33 -8
  121. package/lib/esm/utils/logger.js +61 -4
  122. package/lib/esm/utils/model-utils.d.ts +1 -1
  123. package/lib/esm/utils/stream-utils.d.ts +3 -1
  124. package/lib/esm/utils/stream-utils.js +29 -1
  125. package/lib/esm/utils/type-utils.d.ts +7 -2
  126. package/package.json +4 -20
  127. package/lib/cjs/client/client.d.ts +0 -97
  128. package/lib/cjs/client/client.js +0 -87
  129. package/lib/cjs/client/index.d.ts +0 -1
  130. package/lib/cjs/client/index.js +0 -17
  131. package/lib/cjs/memory/default-memory.d.ts +0 -16
  132. package/lib/cjs/models/bedrock-chat-model.d.ts +0 -79
  133. package/lib/cjs/models/bedrock-chat-model.js +0 -303
  134. package/lib/cjs/models/claude-chat-model.d.ts +0 -114
  135. package/lib/cjs/models/claude-chat-model.js +0 -317
  136. package/lib/cjs/models/deepseek-chat-model.d.ts +0 -23
  137. package/lib/cjs/models/deepseek-chat-model.js +0 -35
  138. package/lib/cjs/models/gemini-chat-model.d.ts +0 -23
  139. package/lib/cjs/models/gemini-chat-model.js +0 -35
  140. package/lib/cjs/models/ollama-chat-model.d.ts +0 -22
  141. package/lib/cjs/models/ollama-chat-model.js +0 -34
  142. package/lib/cjs/models/open-router-chat-model.d.ts +0 -22
  143. package/lib/cjs/models/open-router-chat-model.js +0 -34
  144. package/lib/cjs/models/openai-chat-model.d.ts +0 -166
  145. package/lib/cjs/models/openai-chat-model.js +0 -415
  146. package/lib/cjs/models/xai-chat-model.d.ts +0 -21
  147. package/lib/cjs/models/xai-chat-model.js +0 -33
  148. package/lib/cjs/server/error.d.ts +0 -15
  149. package/lib/cjs/server/error.js +0 -22
  150. package/lib/cjs/server/index.d.ts +0 -2
  151. package/lib/cjs/server/index.js +0 -18
  152. package/lib/cjs/server/server.d.ts +0 -135
  153. package/lib/cjs/server/server.js +0 -187
  154. package/lib/dts/client/client.d.ts +0 -97
  155. package/lib/dts/client/index.d.ts +0 -1
  156. package/lib/dts/memory/default-memory.d.ts +0 -16
  157. package/lib/dts/models/bedrock-chat-model.d.ts +0 -79
  158. package/lib/dts/models/claude-chat-model.d.ts +0 -114
  159. package/lib/dts/models/deepseek-chat-model.d.ts +0 -23
  160. package/lib/dts/models/gemini-chat-model.d.ts +0 -23
  161. package/lib/dts/models/ollama-chat-model.d.ts +0 -22
  162. package/lib/dts/models/open-router-chat-model.d.ts +0 -22
  163. package/lib/dts/models/openai-chat-model.d.ts +0 -166
  164. package/lib/dts/models/xai-chat-model.d.ts +0 -21
  165. package/lib/dts/server/error.d.ts +0 -15
  166. package/lib/dts/server/index.d.ts +0 -2
  167. package/lib/dts/server/server.d.ts +0 -135
  168. package/lib/esm/client/client.d.ts +0 -97
  169. package/lib/esm/client/client.js +0 -83
  170. package/lib/esm/client/index.d.ts +0 -1
  171. package/lib/esm/client/index.js +0 -1
  172. package/lib/esm/memory/default-memory.d.ts +0 -16
  173. package/lib/esm/models/bedrock-chat-model.d.ts +0 -79
  174. package/lib/esm/models/bedrock-chat-model.js +0 -298
  175. package/lib/esm/models/claude-chat-model.d.ts +0 -114
  176. package/lib/esm/models/claude-chat-model.js +0 -310
  177. package/lib/esm/models/deepseek-chat-model.d.ts +0 -23
  178. package/lib/esm/models/deepseek-chat-model.js +0 -31
  179. package/lib/esm/models/gemini-chat-model.d.ts +0 -23
  180. package/lib/esm/models/gemini-chat-model.js +0 -31
  181. package/lib/esm/models/ollama-chat-model.d.ts +0 -22
  182. package/lib/esm/models/ollama-chat-model.js +0 -30
  183. package/lib/esm/models/open-router-chat-model.d.ts +0 -22
  184. package/lib/esm/models/open-router-chat-model.js +0 -30
  185. package/lib/esm/models/openai-chat-model.d.ts +0 -166
  186. package/lib/esm/models/openai-chat-model.js +0 -405
  187. package/lib/esm/models/xai-chat-model.d.ts +0 -21
  188. package/lib/esm/models/xai-chat-model.js +0 -29
  189. package/lib/esm/server/error.d.ts +0 -15
  190. package/lib/esm/server/error.js +0 -18
  191. package/lib/esm/server/index.d.ts +0 -2
  192. package/lib/esm/server/index.js +0 -2
  193. package/lib/esm/server/server.d.ts +0 -135
  194. package/lib/esm/server/server.js +0 -180
@@ -1,7 +1,7 @@
1
1
  import EventEmitter from "node:events";
2
2
  import { Agent, type AgentInvokeOptions, type AgentProcessAsyncGenerator, type AgentResponse, type AgentResponseStream, type Message } from "../agents/agent.js";
3
+ import type { ChatModel } from "../agents/chat-model.js";
3
4
  import { UserAgent } from "../agents/user-agent.js";
4
- import type { ChatModel } from "../models/chat-model.js";
5
5
  import { type OmitPropertiesFromArrayFirstElement } from "../utils/type-utils.js";
6
6
  import type { Args, Listener, TypedEventEmitter } from "../utils/typed-event-emtter.js";
7
7
  import { type MessagePayload, MessageQueue, type MessageQueueListener, type Unsubscribe } from "./message-queue.js";
@@ -38,19 +38,27 @@ export type ContextEmitEventMap = {
38
38
  /**
39
39
  * @hidden
40
40
  */
41
- export interface InvokeOptions extends AgentInvokeOptions {
41
+ export interface InvokeOptions<U extends UserContext = UserContext> extends Partial<Omit<AgentInvokeOptions<U>, "context">> {
42
42
  returnActiveAgent?: boolean;
43
43
  disableTransfer?: boolean;
44
+ sourceAgent?: Agent;
45
+ userContext?: U;
44
46
  }
45
47
  /**
46
48
  * @hidden
47
49
  */
48
- export interface Context extends TypedEventEmitter<ContextEventMap, ContextEmitEventMap> {
50
+ export interface UserContext extends Record<string, unknown> {
51
+ }
52
+ /**
53
+ * @hidden
54
+ */
55
+ export interface Context<U extends UserContext = UserContext> extends TypedEventEmitter<ContextEventMap, ContextEmitEventMap> {
49
56
  model?: ChatModel;
50
57
  skills?: Agent[];
51
58
  usage: ContextUsage;
52
59
  limits?: ContextLimits;
53
60
  status?: "normal" | "timeout";
61
+ userContext: U;
54
62
  /**
55
63
  * Create a user agent to consistently invoke an agent
56
64
  * @param agent Agent to invoke
@@ -91,7 +99,7 @@ export interface Context extends TypedEventEmitter<ContextEventMap, ContextEmitE
91
99
  * @param topic topic name, or an array of topic names
92
100
  * @param payload message to publish
93
101
  */
94
- publish(topic: string | string[], payload: Omit<MessagePayload, "context"> | Message | string): void;
102
+ publish(topic: string | string[], payload: Omit<MessagePayload, "context"> | Message | string, options?: InvokeOptions): void;
95
103
  subscribe(topic: string | string[], listener?: undefined): Promise<MessagePayload>;
96
104
  subscribe(topic: string | string[], listener: MessageQueueListener): Unsubscribe;
97
105
  subscribe(topic: string | string[], listener?: MessageQueueListener): Unsubscribe | Promise<MessagePayload>;
@@ -113,15 +121,17 @@ export interface Context extends TypedEventEmitter<ContextEventMap, ContextEmitE
113
121
  * @hidden
114
122
  */
115
123
  export declare class AIGNEContext implements Context {
116
- constructor(parent?: ConstructorParameters<typeof AIGNEContextInternal>[0]);
124
+ constructor(...[parent, ...args]: ConstructorParameters<typeof AIGNEContextShared>);
117
125
  parentId?: string;
118
126
  id: string;
119
- readonly internal: AIGNEContextInternal;
127
+ readonly internal: AIGNEContextShared;
120
128
  get model(): ChatModel | undefined;
121
129
  get skills(): Agent<Message, Message>[] | undefined;
122
130
  get limits(): ContextLimits | undefined;
123
131
  get status(): "normal" | "timeout";
124
132
  get usage(): ContextUsage;
133
+ get userContext(): Context["userContext"];
134
+ set userContext(userContext: Context["userContext"]);
125
135
  newContext({ reset }?: {
126
136
  reset?: boolean;
127
137
  }): AIGNEContext;
@@ -134,17 +144,18 @@ export declare class AIGNEContext implements Context {
134
144
  once<K extends keyof ContextEventMap>(eventName: K, listener: Listener<K, ContextEventMap>): this;
135
145
  off<K extends keyof ContextEventMap>(eventName: K, listener: Listener<K, ContextEventMap>): this;
136
146
  }
137
- declare class AIGNEContextInternal {
147
+ declare class AIGNEContextShared {
138
148
  private readonly parent?;
139
149
  constructor(parent?: (Pick<Context, "model" | "skills" | "limits"> & {
140
150
  messageQueue?: MessageQueue;
141
- }) | undefined);
151
+ }) | undefined, overrides?: Partial<Context>);
142
152
  readonly messageQueue: MessageQueue;
143
153
  readonly events: EventEmitter<ContextEventMap>;
144
154
  get model(): ChatModel | undefined;
145
155
  get skills(): Agent<Message, Message>[] | undefined;
146
156
  get limits(): ContextLimits | undefined;
147
157
  usage: ContextUsage;
158
+ userContext: Context["userContext"];
148
159
  private abortController;
149
160
  private timer?;
150
161
  private initTimeout;
@@ -2,7 +2,7 @@ import EventEmitter from "node:events";
2
2
  import { v7 } from "uuid";
3
3
  import { z } from "zod";
4
4
  import { Agent, } from "../agents/agent.js";
5
- import { isTransferAgentOutput, transferAgentOutputKey } from "../agents/types.js";
5
+ import { isTransferAgentOutput, transferAgentOutputKey, } from "../agents/types.js";
6
6
  import { UserAgent } from "../agents/user-agent.js";
7
7
  import { createMessage } from "../prompt/prompt-builder.js";
8
8
  import { agentResponseStreamToObject, asyncGeneratorToReadableStream, onAgentResponseStreamEnd, } from "../utils/stream-utils.js";
@@ -13,13 +13,13 @@ import { newEmptyContextUsage } from "./usage.js";
13
13
  * @hidden
14
14
  */
15
15
  export class AIGNEContext {
16
- constructor(parent) {
16
+ constructor(...[parent, ...args]) {
17
17
  if (parent instanceof AIGNEContext) {
18
18
  this.parentId = parent.id;
19
19
  this.internal = parent.internal;
20
20
  }
21
21
  else {
22
- this.internal = new AIGNEContextInternal(parent);
22
+ this.internal = new AIGNEContextShared(parent, ...args);
23
23
  }
24
24
  }
25
25
  parentId;
@@ -40,9 +40,15 @@ export class AIGNEContext {
40
40
  get usage() {
41
41
  return this.internal.usage;
42
42
  }
43
+ get userContext() {
44
+ return this.internal.userContext;
45
+ }
46
+ set userContext(userContext) {
47
+ this.internal.userContext = userContext;
48
+ }
43
49
  newContext({ reset } = {}) {
44
50
  if (reset)
45
- return new AIGNEContext(this.internal);
51
+ return new AIGNEContext(this, { userContext: {} });
46
52
  return new AIGNEContext(this);
47
53
  }
48
54
  invoke = ((agent, message, options) => {
@@ -51,6 +57,8 @@ export class AIGNEContext {
51
57
  message,
52
58
  options,
53
59
  });
60
+ if (options?.userContext)
61
+ Object.assign(this.userContext, options.userContext);
54
62
  if (isNil(message)) {
55
63
  return UserAgent.from({
56
64
  context: this,
@@ -90,7 +98,9 @@ export class AIGNEContext {
90
98
  return stream;
91
99
  });
92
100
  });
93
- publish = ((topic, payload) => {
101
+ publish = ((topic, payload, options) => {
102
+ if (options?.userContext)
103
+ Object.assign(this.userContext, options.userContext);
94
104
  return this.internal.messageQueue.publish(topic, {
95
105
  ...toMessagePayload(payload),
96
106
  context: this,
@@ -125,11 +135,12 @@ export class AIGNEContext {
125
135
  return this;
126
136
  }
127
137
  }
128
- class AIGNEContextInternal {
138
+ class AIGNEContextShared {
129
139
  parent;
130
- constructor(parent) {
140
+ constructor(parent, overrides) {
131
141
  this.parent = parent;
132
142
  this.messageQueue = this.parent?.messageQueue ?? new MessageQueue();
143
+ this.userContext = overrides?.userContext ?? {};
133
144
  }
134
145
  messageQueue;
135
146
  events = new EventEmitter();
@@ -143,6 +154,7 @@ class AIGNEContextInternal {
143
154
  return this.parent?.limits;
144
155
  }
145
156
  usage = newEmptyContextUsage();
157
+ userContext;
146
158
  abortController = new AbortController();
147
159
  timer;
148
160
  initTimeout() {
@@ -167,7 +179,15 @@ class AIGNEContextInternal {
167
179
  let output;
168
180
  for (;;) {
169
181
  const result = {};
170
- const stream = await activeAgent.invoke(input, context, { streaming: true });
182
+ if (options?.sourceAgent && activeAgent !== options.sourceAgent) {
183
+ options.sourceAgent.hooks.onHandoff?.({
184
+ context,
185
+ source: options.sourceAgent,
186
+ target: activeAgent,
187
+ input,
188
+ });
189
+ }
190
+ const stream = await activeAgent.invoke(input, { ...options, context, streaming: true });
171
191
  for await (const value of stream) {
172
192
  if (value.delta.text) {
173
193
  yield { delta: { text: value.delta.text } };
@@ -1,10 +1,11 @@
1
1
  export * from "./agents/agent.js";
2
2
  export * from "./agents/ai-agent.js";
3
+ export * from "./agents/chat-model.js";
4
+ export * from "./agents/guide-rail-agent.js";
3
5
  export * from "./agents/mcp-agent.js";
4
6
  export * from "./agents/team-agent.js";
5
7
  export * from "./agents/types.js";
6
8
  export * from "./agents/user-agent.js";
7
9
  export * from "./aigne/index.js";
8
- export * from "./models/chat-model.js";
9
10
  export * from "./prompt/prompt-builder.js";
10
11
  export * from "./prompt/template.js";
package/lib/esm/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  export * from "./agents/agent.js";
2
2
  export * from "./agents/ai-agent.js";
3
+ export * from "./agents/chat-model.js";
4
+ export * from "./agents/guide-rail-agent.js";
3
5
  export * from "./agents/mcp-agent.js";
4
6
  export * from "./agents/team-agent.js";
5
7
  export * from "./agents/types.js";
6
8
  export * from "./agents/user-agent.js";
7
9
  export * from "./aigne/index.js";
8
- export * from "./models/chat-model.js";
9
10
  export * from "./prompt/prompt-builder.js";
10
11
  export * from "./prompt/template.js";
@@ -14,16 +14,16 @@ export declare function loadAgentFromYamlFile(path: string): Promise<{
14
14
  }, {
15
15
  [x: string]: any;
16
16
  }> | undefined;
17
- toolChoice?: AIAgentToolChoice | undefined;
18
17
  outputSchema?: ZodObject<Record<string, ZodType<any, z.ZodTypeDef, any>>, z.UnknownKeysParam, z.ZodTypeAny, {
19
18
  [x: string]: any;
20
19
  }, {
21
20
  [x: string]: any;
22
21
  }> | undefined;
23
22
  outputKey?: string | undefined;
23
+ toolChoice?: AIAgentToolChoice | undefined;
24
24
  } | {
25
25
  type: "mcp";
26
26
  url?: string | undefined;
27
- command?: string | undefined;
28
27
  args?: string[] | undefined;
28
+ command?: string | undefined;
29
29
  }>;
@@ -1,7 +1,14 @@
1
+ import type { Camelize } from "camelize-ts";
1
2
  import { z } from "zod";
2
3
  import { type Agent } from "../agents/agent.js";
3
- import type { ChatModel, ChatModelOptions } from "../models/chat-model.js";
4
+ import type { ChatModel, ChatModelOptions } from "../agents/chat-model.js";
4
5
  export interface LoadOptions {
6
+ models: {
7
+ new (parameters: {
8
+ model?: string;
9
+ modelOptions?: ChatModelOptions;
10
+ }): ChatModel;
11
+ }[];
5
12
  path: string;
6
13
  }
7
14
  export declare function load(options: LoadOptions): Promise<{
@@ -15,12 +22,12 @@ export declare function load(options: LoadOptions): Promise<{
15
22
  temperature?: number | null | undefined;
16
23
  provider?: string | null | undefined;
17
24
  top_p?: number | null | undefined;
18
- frequent_penalty?: number | null | undefined;
25
+ frequency_penalty?: number | null | undefined;
19
26
  presence_penalty?: number | null | undefined;
20
27
  } | null | undefined;
21
28
  }>;
22
29
  export declare function loadAgent(path: string): Promise<Agent>;
23
- export declare function loadModel(model?: z.infer<typeof aigneFileSchema>["chat_model"], modelOptions?: ChatModelOptions): Promise<ChatModel | undefined>;
30
+ export declare function loadModel(models: LoadOptions["models"], model?: Camelize<z.infer<typeof aigneFileSchema>["chat_model"]>, modelOptions?: ChatModelOptions): Promise<ChatModel | undefined>;
24
31
  declare const aigneFileSchema: z.ZodObject<{
25
32
  name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
26
33
  description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -29,35 +36,35 @@ declare const aigneFileSchema: z.ZodObject<{
29
36
  name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
37
  temperature: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
31
38
  top_p: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
32
- frequent_penalty: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
39
+ frequency_penalty: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
33
40
  presence_penalty: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
34
41
  }, "strip", z.ZodTypeAny, {
35
42
  name?: string | null | undefined;
36
43
  temperature?: number | null | undefined;
37
44
  provider?: string | null | undefined;
38
45
  top_p?: number | null | undefined;
39
- frequent_penalty?: number | null | undefined;
46
+ frequency_penalty?: number | null | undefined;
40
47
  presence_penalty?: number | null | undefined;
41
48
  }, {
42
49
  name?: string | null | undefined;
43
50
  temperature?: number | null | undefined;
44
51
  provider?: string | null | undefined;
45
52
  top_p?: number | null | undefined;
46
- frequent_penalty?: number | null | undefined;
53
+ frequency_penalty?: number | null | undefined;
47
54
  presence_penalty?: number | null | undefined;
48
55
  }>]>>>, {
49
56
  name?: string | null | undefined;
50
57
  temperature?: number | null | undefined;
51
58
  provider?: string | null | undefined;
52
59
  top_p?: number | null | undefined;
53
- frequent_penalty?: number | null | undefined;
60
+ frequency_penalty?: number | null | undefined;
54
61
  presence_penalty?: number | null | undefined;
55
62
  } | null | undefined, string | {
56
63
  name?: string | null | undefined;
57
64
  temperature?: number | null | undefined;
58
65
  provider?: string | null | undefined;
59
66
  top_p?: number | null | undefined;
60
- frequent_penalty?: number | null | undefined;
67
+ frequency_penalty?: number | null | undefined;
61
68
  presence_penalty?: number | null | undefined;
62
69
  } | null | undefined>;
63
70
  agents: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
@@ -71,7 +78,7 @@ declare const aigneFileSchema: z.ZodObject<{
71
78
  temperature?: number | null | undefined;
72
79
  provider?: string | null | undefined;
73
80
  top_p?: number | null | undefined;
74
- frequent_penalty?: number | null | undefined;
81
+ frequency_penalty?: number | null | undefined;
75
82
  presence_penalty?: number | null | undefined;
76
83
  } | null | undefined;
77
84
  agents?: string[] | null | undefined;
@@ -84,7 +91,7 @@ declare const aigneFileSchema: z.ZodObject<{
84
91
  temperature?: number | null | undefined;
85
92
  provider?: string | null | undefined;
86
93
  top_p?: number | null | undefined;
87
- frequent_penalty?: number | null | undefined;
94
+ frequency_penalty?: number | null | undefined;
88
95
  presence_penalty?: number | null | undefined;
89
96
  } | null | undefined;
90
97
  agents?: string[] | null | undefined;
@@ -98,7 +105,7 @@ export declare function loadAIGNEFile(path: string): Promise<{
98
105
  temperature?: number | null | undefined;
99
106
  provider?: string | null | undefined;
100
107
  top_p?: number | null | undefined;
101
- frequent_penalty?: number | null | undefined;
108
+ frequency_penalty?: number | null | undefined;
102
109
  presence_penalty?: number | null | undefined;
103
110
  } | null | undefined;
104
111
  agents?: string[] | null | undefined;
@@ -5,14 +5,6 @@ import { z } from "zod";
5
5
  import { FunctionAgent } from "../agents/agent.js";
6
6
  import { AIAgent } from "../agents/ai-agent.js";
7
7
  import { MCPAgent } from "../agents/mcp-agent.js";
8
- import { BedrockChatModel } from "../models/bedrock-chat-model.js";
9
- import { ClaudeChatModel } from "../models/claude-chat-model.js";
10
- import { DeepSeekChatModel } from "../models/deepseek-chat-model.js";
11
- import { GeminiChatModel } from "../models/gemini-chat-model.js";
12
- import { OllamaChatModel } from "../models/ollama-chat-model.js";
13
- import { OpenRouterChatModel } from "../models/open-router-chat-model.js";
14
- import { OpenAIChatModel } from "../models/openai-chat-model.js";
15
- import { XAIChatModel } from "../models/xai-chat-model.js";
16
8
  import { tryOrThrow } from "../utils/type-utils.js";
17
9
  import { loadAgentFromJsFile } from "./agent-js.js";
18
10
  import { loadAgentFromYamlFile } from "./agent-yaml.js";
@@ -26,7 +18,7 @@ export async function load(options) {
26
18
  const skills = await Promise.all((aigne.skills ?? []).map((filename) => loadAgent(join(rootDir, filename))));
27
19
  return {
28
20
  ...aigne,
29
- model: await loadModel(aigne.chat_model),
21
+ model: await loadModel(options.models, aigne.chat_model),
30
22
  agents,
31
23
  skills,
32
24
  };
@@ -64,26 +56,15 @@ export async function loadAgent(path) {
64
56
  }
65
57
  const { MODEL_PROVIDER, MODEL_NAME } = process.env;
66
58
  const DEFAULT_MODEL_PROVIDER = "openai";
67
- const DEFAULT_MODEL_NAME = "gpt-4o-mini";
68
- export async function loadModel(model, modelOptions) {
59
+ export async function loadModel(models, model, modelOptions) {
69
60
  const params = {
70
- model: MODEL_NAME ?? model?.name ?? DEFAULT_MODEL_NAME,
61
+ model: MODEL_NAME ?? model?.name ?? undefined,
71
62
  temperature: model?.temperature ?? undefined,
72
- topP: model?.top_p ?? undefined,
73
- frequencyPenalty: model?.frequent_penalty ?? undefined,
74
- presencePenalty: model?.presence_penalty ?? undefined,
63
+ topP: model?.topP ?? undefined,
64
+ frequencyPenalty: model?.frequencyPenalty ?? undefined,
65
+ presencePenalty: model?.presencePenalty ?? undefined,
75
66
  };
76
- const availableModels = [
77
- OpenAIChatModel,
78
- ClaudeChatModel,
79
- XAIChatModel,
80
- GeminiChatModel,
81
- DeepSeekChatModel,
82
- OpenRouterChatModel,
83
- OllamaChatModel,
84
- BedrockChatModel,
85
- ];
86
- const M = availableModels.find((m) => m.name
67
+ const M = models.find((m) => m.name
87
68
  .toLowerCase()
88
69
  .includes((MODEL_PROVIDER ?? model?.provider ?? DEFAULT_MODEL_PROVIDER).toLowerCase()));
89
70
  if (!M)
@@ -101,7 +82,7 @@ const aigneFileSchema = z.object({
101
82
  name: z.string().nullish(),
102
83
  temperature: z.number().min(0).max(2).nullish(),
103
84
  top_p: z.number().min(0).nullish(),
104
- frequent_penalty: z.number().min(-2).max(2).nullish(),
85
+ frequency_penalty: z.number().min(-2).max(2).nullish(),
105
86
  presence_penalty: z.number().min(-2).max(2).nullish(),
106
87
  }),
107
88
  ])
@@ -0,0 +1,30 @@
1
+ import type { AgentInvokeOptions } from "../../../agents/agent.js";
2
+ import "sqlite3";
3
+ import { Sequelize } from "sequelize";
4
+ import type { Context } from "../../../aigne/context.js";
5
+ import type { PromiseOrValue } from "../../../utils/type-utils.js";
6
+ import type { Memory } from "../../memory.js";
7
+ import { MemoryStorage } from "../storage.js";
8
+ export interface DefaultMemoryStorageOptions {
9
+ path?: string;
10
+ getSessionId?: (context: Context) => PromiseOrValue<string>;
11
+ }
12
+ export declare class DefaultMemoryStorage extends MemoryStorage {
13
+ options?: DefaultMemoryStorageOptions | undefined;
14
+ memories: {
15
+ [groupId: string]: Memory[];
16
+ };
17
+ constructor(options?: DefaultMemoryStorageOptions | undefined);
18
+ private _models?;
19
+ private get models();
20
+ private convertMemory;
21
+ search(query: {
22
+ limit?: number;
23
+ }, { context }: AgentInvokeOptions): Promise<{
24
+ result: Memory[];
25
+ }>;
26
+ create(memory: Pick<Memory, "content">, { context }: AgentInvokeOptions): Promise<{
27
+ result: Memory;
28
+ }>;
29
+ }
30
+ export declare function initSequelize(path?: string): Sequelize;
@@ -0,0 +1,64 @@
1
+ import "sqlite3";
2
+ import { Sequelize } from "sequelize";
3
+ import { logger } from "../../../utils/logger.js";
4
+ import { MemoryStorage } from "../storage.js";
5
+ import { migrate } from "./migrate.js";
6
+ import { initMemoryModel } from "./models/memory.js";
7
+ const DEFAULT_MAX_MEMORY_COUNT = 10;
8
+ export class DefaultMemoryStorage extends MemoryStorage {
9
+ options;
10
+ memories = {};
11
+ constructor(options) {
12
+ super();
13
+ this.options = options;
14
+ }
15
+ _models;
16
+ get models() {
17
+ this._models ??= (async () => {
18
+ const sequelize = initSequelize(this.options?.path);
19
+ await migrate(sequelize);
20
+ return {
21
+ Memory: initMemoryModel(sequelize),
22
+ };
23
+ })();
24
+ return this._models;
25
+ }
26
+ convertMemory(m) {
27
+ return {
28
+ id: m.id,
29
+ sessionId: m.sessionId,
30
+ content: m.content,
31
+ createdAt: m.createdAt.toISOString(),
32
+ };
33
+ }
34
+ async search(query, { context }) {
35
+ const { limit = DEFAULT_MAX_MEMORY_COUNT } = query;
36
+ const sessionId = (await this.options?.getSessionId?.(context)) ?? null;
37
+ const { Memory } = await this.models;
38
+ const memories = await Memory.findAll({
39
+ where: { sessionId },
40
+ order: [["id", "DESC"]],
41
+ limit,
42
+ });
43
+ return {
44
+ result: memories.reverse().map(this.convertMemory),
45
+ };
46
+ }
47
+ async create(memory, { context }) {
48
+ const sessionId = (await this.options?.getSessionId?.(context)) ?? null;
49
+ const { Memory } = await this.models;
50
+ const m = await Memory.create({
51
+ ...memory,
52
+ sessionId,
53
+ });
54
+ return { result: this.convertMemory(m) };
55
+ }
56
+ }
57
+ export function initSequelize(path) {
58
+ const sequelize = new Sequelize({
59
+ logging: (sql) => logger.debug(sql),
60
+ storage: path,
61
+ dialect: "sqlite",
62
+ });
63
+ return sequelize;
64
+ }
@@ -0,0 +1,7 @@
1
+ import type { Sequelize } from "sequelize";
2
+ import { type MigrateDownOptions, type MigrateUpOptions } from "umzug";
3
+ export declare const migrate: (sequelize: Sequelize, { type, upOptions, downOptions, }?: {
4
+ type?: "up" | "down";
5
+ upOptions?: MigrateUpOptions;
6
+ downOptions?: MigrateDownOptions;
7
+ }) => Promise<void>;
@@ -0,0 +1,16 @@
1
+ import { SequelizeStorage, Umzug } from "umzug";
2
+ import * as init from "./migrations/20250523165801-init.js";
3
+ export const migrate = async (sequelize, { type = "up", upOptions, downOptions, } = {}) => {
4
+ const umzug = new Umzug({
5
+ migrations: [{ ...init, name: "20241224202701-init" }],
6
+ context: sequelize.getQueryInterface(),
7
+ storage: new SequelizeStorage({ sequelize }),
8
+ logger: console,
9
+ });
10
+ if (type === "down") {
11
+ await umzug.down(downOptions);
12
+ }
13
+ else {
14
+ await umzug.up(upOptions);
15
+ }
16
+ };
@@ -0,0 +1,7 @@
1
+ import { type QueryInterface } from "sequelize";
2
+ export declare const up: ({ context: queryInterface }: {
3
+ context: QueryInterface;
4
+ }) => Promise<void>;
5
+ export declare const down: ({ context: queryInterface }: {
6
+ context: QueryInterface;
7
+ }) => Promise<void>;
@@ -0,0 +1,28 @@
1
+ import { DataTypes } from "sequelize";
2
+ export const up = async ({ context: queryInterface }) => {
3
+ await queryInterface.createTable("Memories", {
4
+ id: {
5
+ type: DataTypes.STRING,
6
+ primaryKey: true,
7
+ allowNull: false,
8
+ },
9
+ createdAt: {
10
+ type: DataTypes.DATE,
11
+ allowNull: false,
12
+ },
13
+ updatedAt: {
14
+ type: DataTypes.DATE,
15
+ allowNull: false,
16
+ },
17
+ sessionId: {
18
+ type: DataTypes.STRING,
19
+ },
20
+ content: {
21
+ type: DataTypes.JSON,
22
+ allowNull: false,
23
+ },
24
+ });
25
+ };
26
+ export const down = async ({ context: queryInterface }) => {
27
+ await queryInterface.dropTable("Memories");
28
+ };
@@ -0,0 +1,10 @@
1
+ import { type CreationOptional, type InferAttributes, type InferCreationAttributes, Model } from "sequelize";
2
+ import type { ModelStatic, Sequelize } from "sequelize";
3
+ export interface Memory extends Model<InferAttributes<Memory>, InferCreationAttributes<Memory>> {
4
+ id: CreationOptional<string>;
5
+ createdAt: CreationOptional<Date>;
6
+ updatedAt: CreationOptional<Date>;
7
+ sessionId?: string | null;
8
+ content: unknown;
9
+ }
10
+ export declare function initMemoryModel(sequelize: Sequelize): ModelStatic<Memory>;
@@ -0,0 +1,29 @@
1
+ import { DataTypes, Model, } from "sequelize";
2
+ import { v7 } from "uuid";
3
+ const nextId = () => v7();
4
+ export function initMemoryModel(sequelize) {
5
+ return class Memory extends Model {
6
+ }.init({
7
+ id: {
8
+ type: DataTypes.STRING,
9
+ primaryKey: true,
10
+ allowNull: false,
11
+ defaultValue: nextId,
12
+ },
13
+ createdAt: {
14
+ type: DataTypes.DATE,
15
+ allowNull: false,
16
+ },
17
+ updatedAt: {
18
+ type: DataTypes.DATE,
19
+ allowNull: false,
20
+ },
21
+ sessionId: {
22
+ type: DataTypes.STRING,
23
+ },
24
+ content: {
25
+ type: DataTypes.JSON,
26
+ allowNull: false,
27
+ },
28
+ }, { sequelize });
29
+ }
@@ -0,0 +1,10 @@
1
+ import { MemoryAgent, type MemoryAgentOptions } from "../memory.js";
2
+ import { type DefaultMemoryStorageOptions } from "./default-memory-storage/index.js";
3
+ import { MemoryStorage } from "./storage.js";
4
+ export interface DefaultMemoryOptions extends Partial<MemoryAgentOptions> {
5
+ storage?: MemoryStorage | DefaultMemoryStorageOptions;
6
+ }
7
+ export declare class DefaultMemory extends MemoryAgent {
8
+ constructor(options?: DefaultMemoryOptions);
9
+ storage: MemoryStorage;
10
+ }