@aigne/core 1.72.0-beta.2 → 1.72.0-beta.23

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 (175) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/lib/cjs/agents/agent.d.ts +42 -11
  3. package/lib/cjs/agents/agent.js +34 -8
  4. package/lib/cjs/agents/ai-agent.d.ts +63 -4
  5. package/lib/cjs/agents/ai-agent.js +154 -20
  6. package/lib/cjs/agents/chat-model.d.ts +157 -0
  7. package/lib/cjs/agents/chat-model.js +71 -6
  8. package/lib/cjs/agents/image-agent.d.ts +17 -1
  9. package/lib/cjs/agents/image-agent.js +16 -0
  10. package/lib/cjs/agents/image-model.d.ts +12 -2
  11. package/lib/cjs/agents/image-model.js +1 -1
  12. package/lib/cjs/agents/mcp-agent.d.ts +17 -0
  13. package/lib/cjs/agents/mcp-agent.js +18 -0
  14. package/lib/cjs/agents/model.d.ts +3 -3
  15. package/lib/cjs/agents/model.js +2 -2
  16. package/lib/cjs/agents/team-agent.d.ts +55 -0
  17. package/lib/cjs/agents/team-agent.js +31 -0
  18. package/lib/cjs/agents/transform-agent.d.ts +12 -0
  19. package/lib/cjs/agents/transform-agent.js +13 -0
  20. package/lib/cjs/agents/video-model.d.ts +10 -0
  21. package/lib/cjs/agents/video-model.js +1 -1
  22. package/lib/cjs/aigne/context.js +1 -3
  23. package/lib/cjs/aigne/usage.d.ts +4 -0
  24. package/lib/cjs/aigne/usage.js +6 -0
  25. package/lib/cjs/index.d.ts +1 -0
  26. package/lib/cjs/index.js +1 -0
  27. package/lib/cjs/loader/agent-yaml.d.ts +5 -63
  28. package/lib/cjs/loader/agent-yaml.js +4 -129
  29. package/lib/cjs/loader/agents.d.ts +4 -0
  30. package/lib/cjs/loader/agents.js +17 -0
  31. package/lib/cjs/loader/index.d.ts +16 -12
  32. package/lib/cjs/loader/index.js +20 -81
  33. package/lib/cjs/loader/schema.d.ts +21 -6
  34. package/lib/cjs/loader/schema.js +60 -1
  35. package/lib/cjs/memory/recorder.d.ts +4 -4
  36. package/lib/cjs/memory/retriever.d.ts +4 -4
  37. package/lib/cjs/prompt/agent-session.d.ts +163 -0
  38. package/lib/cjs/prompt/agent-session.js +1008 -0
  39. package/lib/cjs/prompt/compact/compactor.d.ts +7 -0
  40. package/lib/cjs/prompt/compact/compactor.js +52 -0
  41. package/lib/cjs/prompt/compact/session-memory-extractor.d.ts +7 -0
  42. package/lib/cjs/prompt/compact/session-memory-extractor.js +143 -0
  43. package/lib/cjs/prompt/compact/types.d.ts +336 -0
  44. package/lib/cjs/prompt/compact/types.js +53 -0
  45. package/lib/cjs/prompt/compact/user-memory-extractor.d.ts +7 -0
  46. package/lib/cjs/prompt/compact/user-memory-extractor.js +124 -0
  47. package/lib/cjs/prompt/context/afs/history.d.ts +5 -1
  48. package/lib/cjs/prompt/context/afs/history.js +3 -2
  49. package/lib/cjs/prompt/context/afs/index.js +8 -1
  50. package/lib/cjs/prompt/prompt-builder.d.ts +11 -9
  51. package/lib/cjs/prompt/prompt-builder.js +79 -120
  52. package/lib/cjs/prompt/skills/afs/agent-skill/agent-skill.d.ts +19 -0
  53. package/lib/cjs/prompt/skills/afs/agent-skill/agent-skill.js +69 -0
  54. package/lib/cjs/prompt/skills/afs/agent-skill/skill-loader.d.ts +12 -0
  55. package/lib/cjs/prompt/skills/afs/agent-skill/skill-loader.js +50 -0
  56. package/lib/cjs/prompt/skills/afs/delete.js +15 -3
  57. package/lib/cjs/prompt/skills/afs/edit.d.ts +6 -9
  58. package/lib/cjs/prompt/skills/afs/edit.js +85 -59
  59. package/lib/cjs/prompt/skills/afs/exec.js +17 -6
  60. package/lib/cjs/prompt/skills/afs/index.js +4 -1
  61. package/lib/cjs/prompt/skills/afs/list.d.ts +2 -0
  62. package/lib/cjs/prompt/skills/afs/list.js +35 -11
  63. package/lib/cjs/prompt/skills/afs/read.d.ts +9 -3
  64. package/lib/cjs/prompt/skills/afs/read.js +67 -15
  65. package/lib/cjs/prompt/skills/afs/rename.js +18 -4
  66. package/lib/cjs/prompt/skills/afs/search.js +21 -5
  67. package/lib/cjs/prompt/skills/afs/write.js +20 -6
  68. package/lib/cjs/prompt/template.d.ts +84 -9
  69. package/lib/cjs/prompt/template.js +46 -17
  70. package/lib/cjs/utils/mcp-utils.js +1 -1
  71. package/lib/cjs/utils/token-estimator.js +1 -1
  72. package/lib/dts/agents/agent.d.ts +42 -11
  73. package/lib/dts/agents/ai-agent.d.ts +63 -4
  74. package/lib/dts/agents/chat-model.d.ts +157 -0
  75. package/lib/dts/agents/image-agent.d.ts +17 -1
  76. package/lib/dts/agents/image-model.d.ts +12 -2
  77. package/lib/dts/agents/mcp-agent.d.ts +17 -0
  78. package/lib/dts/agents/model.d.ts +3 -3
  79. package/lib/dts/agents/team-agent.d.ts +55 -0
  80. package/lib/dts/agents/transform-agent.d.ts +12 -0
  81. package/lib/dts/agents/video-model.d.ts +10 -0
  82. package/lib/dts/aigne/context.d.ts +2 -2
  83. package/lib/dts/aigne/usage.d.ts +4 -0
  84. package/lib/dts/index.d.ts +1 -0
  85. package/lib/dts/loader/agent-yaml.d.ts +5 -63
  86. package/lib/dts/loader/agents.d.ts +4 -0
  87. package/lib/dts/loader/index.d.ts +16 -12
  88. package/lib/dts/loader/schema.d.ts +21 -6
  89. package/lib/dts/memory/recorder.d.ts +4 -4
  90. package/lib/dts/memory/retriever.d.ts +4 -4
  91. package/lib/dts/prompt/agent-session.d.ts +163 -0
  92. package/lib/dts/prompt/compact/compactor.d.ts +7 -0
  93. package/lib/dts/prompt/compact/session-memory-extractor.d.ts +7 -0
  94. package/lib/dts/prompt/compact/types.d.ts +336 -0
  95. package/lib/dts/prompt/compact/user-memory-extractor.d.ts +7 -0
  96. package/lib/dts/prompt/context/afs/history.d.ts +5 -1
  97. package/lib/dts/prompt/prompt-builder.d.ts +11 -9
  98. package/lib/dts/prompt/skills/afs/agent-skill/agent-skill.d.ts +19 -0
  99. package/lib/dts/prompt/skills/afs/agent-skill/skill-loader.d.ts +12 -0
  100. package/lib/dts/prompt/skills/afs/edit.d.ts +6 -9
  101. package/lib/dts/prompt/skills/afs/list.d.ts +2 -0
  102. package/lib/dts/prompt/skills/afs/read.d.ts +9 -3
  103. package/lib/dts/prompt/template.d.ts +84 -9
  104. package/lib/esm/agents/agent.d.ts +42 -11
  105. package/lib/esm/agents/agent.js +34 -8
  106. package/lib/esm/agents/ai-agent.d.ts +63 -4
  107. package/lib/esm/agents/ai-agent.js +154 -20
  108. package/lib/esm/agents/chat-model.d.ts +157 -0
  109. package/lib/esm/agents/chat-model.js +70 -5
  110. package/lib/esm/agents/image-agent.d.ts +17 -1
  111. package/lib/esm/agents/image-agent.js +16 -0
  112. package/lib/esm/agents/image-model.d.ts +12 -2
  113. package/lib/esm/agents/image-model.js +1 -1
  114. package/lib/esm/agents/mcp-agent.d.ts +17 -0
  115. package/lib/esm/agents/mcp-agent.js +18 -0
  116. package/lib/esm/agents/model.d.ts +3 -3
  117. package/lib/esm/agents/model.js +2 -2
  118. package/lib/esm/agents/team-agent.d.ts +55 -0
  119. package/lib/esm/agents/team-agent.js +31 -0
  120. package/lib/esm/agents/transform-agent.d.ts +12 -0
  121. package/lib/esm/agents/transform-agent.js +13 -0
  122. package/lib/esm/agents/video-model.d.ts +10 -0
  123. package/lib/esm/agents/video-model.js +1 -1
  124. package/lib/esm/aigne/context.d.ts +2 -2
  125. package/lib/esm/aigne/context.js +2 -4
  126. package/lib/esm/aigne/usage.d.ts +4 -0
  127. package/lib/esm/aigne/usage.js +6 -0
  128. package/lib/esm/index.d.ts +1 -0
  129. package/lib/esm/index.js +1 -0
  130. package/lib/esm/loader/agent-yaml.d.ts +5 -63
  131. package/lib/esm/loader/agent-yaml.js +4 -128
  132. package/lib/esm/loader/agents.d.ts +4 -0
  133. package/lib/esm/loader/agents.js +14 -0
  134. package/lib/esm/loader/index.d.ts +16 -12
  135. package/lib/esm/loader/index.js +21 -81
  136. package/lib/esm/loader/schema.d.ts +21 -6
  137. package/lib/esm/loader/schema.js +57 -0
  138. package/lib/esm/memory/recorder.d.ts +4 -4
  139. package/lib/esm/memory/retriever.d.ts +4 -4
  140. package/lib/esm/prompt/agent-session.d.ts +163 -0
  141. package/lib/esm/prompt/agent-session.js +968 -0
  142. package/lib/esm/prompt/compact/compactor.d.ts +7 -0
  143. package/lib/esm/prompt/compact/compactor.js +48 -0
  144. package/lib/esm/prompt/compact/session-memory-extractor.d.ts +7 -0
  145. package/lib/esm/prompt/compact/session-memory-extractor.js +139 -0
  146. package/lib/esm/prompt/compact/types.d.ts +336 -0
  147. package/lib/esm/prompt/compact/types.js +50 -0
  148. package/lib/esm/prompt/compact/user-memory-extractor.d.ts +7 -0
  149. package/lib/esm/prompt/compact/user-memory-extractor.js +120 -0
  150. package/lib/esm/prompt/context/afs/history.d.ts +5 -1
  151. package/lib/esm/prompt/context/afs/history.js +3 -2
  152. package/lib/esm/prompt/context/afs/index.js +8 -1
  153. package/lib/esm/prompt/prompt-builder.d.ts +11 -9
  154. package/lib/esm/prompt/prompt-builder.js +80 -121
  155. package/lib/esm/prompt/skills/afs/agent-skill/agent-skill.d.ts +19 -0
  156. package/lib/esm/prompt/skills/afs/agent-skill/agent-skill.js +65 -0
  157. package/lib/esm/prompt/skills/afs/agent-skill/skill-loader.d.ts +12 -0
  158. package/lib/esm/prompt/skills/afs/agent-skill/skill-loader.js +43 -0
  159. package/lib/esm/prompt/skills/afs/delete.js +15 -3
  160. package/lib/esm/prompt/skills/afs/edit.d.ts +6 -9
  161. package/lib/esm/prompt/skills/afs/edit.js +85 -59
  162. package/lib/esm/prompt/skills/afs/exec.js +17 -6
  163. package/lib/esm/prompt/skills/afs/index.js +4 -1
  164. package/lib/esm/prompt/skills/afs/list.d.ts +2 -0
  165. package/lib/esm/prompt/skills/afs/list.js +35 -11
  166. package/lib/esm/prompt/skills/afs/read.d.ts +9 -3
  167. package/lib/esm/prompt/skills/afs/read.js +67 -15
  168. package/lib/esm/prompt/skills/afs/rename.js +18 -4
  169. package/lib/esm/prompt/skills/afs/search.js +21 -5
  170. package/lib/esm/prompt/skills/afs/write.js +20 -6
  171. package/lib/esm/prompt/template.d.ts +84 -9
  172. package/lib/esm/prompt/template.js +46 -17
  173. package/lib/esm/utils/mcp-utils.js +1 -1
  174. package/lib/esm/utils/token-estimator.js +1 -1
  175. package/package.json +7 -6
@@ -2,12 +2,8 @@ import { jsonSchemaToZod } from "@aigne/json-schema-to-zod";
2
2
  import { nodejs } from "@aigne/platform-helpers/nodejs/index.js";
3
3
  import { parse } from "yaml";
4
4
  import { z } from "zod";
5
- import { AIAgentToolChoice } from "../agents/ai-agent.js";
6
- import { roleSchema } from "../agents/chat-model.js";
7
- import { ProcessMode } from "../agents/team-agent.js";
8
5
  import { tryOrThrow } from "../utils/type-utils.js";
9
- import { codeToFunctionAgentFn } from "./function-agent.js";
10
- import { camelizeSchema, chatModelSchema, defaultInputSchema, imageModelSchema, inputOutputSchema, optionalize, preprocessSchema, } from "./schema.js";
6
+ import { camelizeSchema, chatModelSchema, defaultInputSchema, imageModelSchema, inputOutputSchema, optionalize, } from "./schema.js";
11
7
  export async function parseAgentFile(path, data, options) {
12
8
  const agentSchema = getAgentSchema({ filepath: path, options });
13
9
  return agentSchema.parseAsync({
@@ -25,41 +21,7 @@ export async function loadAgentFromYamlFile(path, options) {
25
21
  }, options), (error) => new Error(`Failed to validate agent definition from ${path}: ${error.message}`));
26
22
  return agent;
27
23
  }
28
- const instructionItemSchema = z.union([
29
- z.object({
30
- role: roleSchema.default("system"),
31
- url: z.string(),
32
- }),
33
- z.object({
34
- role: roleSchema.default("system"),
35
- content: z.string(),
36
- }),
37
- ]);
38
- const parseInstructionItem = ({ filepath }) => async ({ role, ...v }) => {
39
- if (role === "tool")
40
- throw new Error(`'tool' role is not allowed in instruction item in agent file ${filepath}`);
41
- if ("content" in v && typeof v.content === "string") {
42
- return { role, content: v.content, path: filepath };
43
- }
44
- if ("url" in v && typeof v.url === "string") {
45
- const url = nodejs.path.isAbsolute(v.url)
46
- ? v.url
47
- : nodejs.path.join(nodejs.path.dirname(filepath), v.url);
48
- return nodejs.fs.readFile(url, "utf8").then((content) => ({ role, content, path: url }));
49
- }
50
- throw new Error(`Invalid instruction item in agent file ${filepath}. Expected 'content' or 'url' property`);
51
- };
52
- export const getInstructionsSchema = ({ filepath }) => z
53
- .union([z.string(), instructionItemSchema, z.array(instructionItemSchema)])
54
- .transform(async (v) => {
55
- if (typeof v === "string")
56
- return [{ role: "system", content: v, path: filepath }];
57
- if (Array.isArray(v)) {
58
- return Promise.all(v.map((item) => parseInstructionItem({ filepath })(item)));
59
- }
60
- return [await parseInstructionItem({ filepath })(v)];
61
- });
62
- export const getAgentSchema = ({ filepath, options, }) => {
24
+ export const getAgentSchema = ({ filepath }) => {
63
25
  const agentSchema = z.lazy(() => {
64
26
  const nestAgentSchema = z.lazy(() => z.union([
65
27
  agentSchema,
@@ -95,6 +57,7 @@ export const getAgentSchema = ({ filepath, options, }) => {
95
57
  }))),
96
58
  });
97
59
  const baseAgentSchema = z.object({
60
+ type: z.string(),
98
61
  name: optionalize(z.string()),
99
62
  alias: optionalize(z.array(z.string())),
100
63
  description: optionalize(z.string()),
@@ -133,94 +96,7 @@ export const getAgentSchema = ({ filepath, options, }) => {
133
96
  ])),
134
97
  shareAFS: optionalize(z.boolean()),
135
98
  });
136
- const instructionsSchema = getInstructionsSchema({ filepath: filepath });
137
- return camelizeSchema(preprocessSchema(async (json) => {
138
- if (typeof json === "object" &&
139
- json &&
140
- "type" in json &&
141
- typeof json.type === "string" &&
142
- !["ai", "image", "mcp", "team", "transform", "function"].includes(json.type)) {
143
- if (!options?.require)
144
- throw new Error(`Module loader is not provided to load agent type module ${json.type} from ${filepath}`);
145
- const Mod = await options.require(json.type, { parent: filepath });
146
- if (typeof Mod?.default?.prototype?.constructor !== "function") {
147
- throw new Error(`The agent type module ${json.type} does not export a default Agent class`);
148
- }
149
- Object.assign(json, { agentClass: Mod.default });
150
- }
151
- return json;
152
- }, z.union([
153
- z
154
- .object({
155
- type: z.string(),
156
- agentClass: z.custom((v) => typeof v?.prototype?.constructor === "function"),
157
- })
158
- .extend(baseAgentSchema.shape)
159
- .passthrough(),
160
- z.discriminatedUnion("type", [
161
- z
162
- .object({
163
- type: z.literal("ai"),
164
- instructions: optionalize(instructionsSchema),
165
- autoReorderSystemMessages: optionalize(z.boolean()),
166
- autoMergeSystemMessages: optionalize(z.boolean()),
167
- inputKey: optionalize(z.string()),
168
- outputKey: optionalize(z.string()),
169
- inputFileKey: optionalize(z.string()),
170
- outputFileKey: optionalize(z.string()),
171
- toolChoice: optionalize(z.nativeEnum(AIAgentToolChoice)),
172
- toolCallsConcurrency: optionalize(z.number().int().min(0)),
173
- keepTextInToolUses: optionalize(z.boolean()),
174
- catchToolsError: optionalize(z.boolean()),
175
- structuredStreamMode: optionalize(z.boolean()),
176
- })
177
- .extend(baseAgentSchema.shape),
178
- z
179
- .object({
180
- type: z.literal("image"),
181
- instructions: instructionsSchema,
182
- inputFileKey: optionalize(z.string()),
183
- })
184
- .extend(baseAgentSchema.shape),
185
- z
186
- .object({
187
- type: z.literal("mcp"),
188
- url: optionalize(z.string()),
189
- command: optionalize(z.string()),
190
- args: optionalize(z.array(z.string())),
191
- })
192
- .extend(baseAgentSchema.shape),
193
- z
194
- .object({
195
- type: z.literal("team"),
196
- mode: optionalize(z.nativeEnum(ProcessMode)),
197
- iterateOn: optionalize(z.string()),
198
- concurrency: optionalize(z.number().int().min(1)),
199
- iterateWithPreviousOutput: optionalize(z.boolean()),
200
- includeAllStepsOutput: optionalize(z.boolean()),
201
- reflection: camelizeSchema(optionalize(z.object({
202
- reviewer: nestAgentSchema,
203
- isApproved: z.string(),
204
- maxIterations: optionalize(z.number().int().min(1)),
205
- returnLastOnMaxIterations: optionalize(z.boolean()),
206
- customErrorMessage: optionalize(z.string()),
207
- }))),
208
- })
209
- .extend(baseAgentSchema.shape),
210
- z
211
- .object({
212
- type: z.literal("transform"),
213
- jsonata: z.string(),
214
- })
215
- .extend(baseAgentSchema.shape),
216
- z
217
- .object({
218
- type: z.literal("function"),
219
- process: z.preprocess((v) => (typeof v === "string" ? codeToFunctionAgentFn(v) : v), z.custom()),
220
- })
221
- .extend(baseAgentSchema.shape),
222
- ]),
223
- ])));
99
+ return camelizeSchema(baseAgentSchema.passthrough());
224
100
  });
225
101
  return agentSchema;
226
102
  };
@@ -0,0 +1,4 @@
1
+ import type { AgentClass } from "../agents/types.ts";
2
+ export declare const builtinAgents: {
3
+ [type: string]: AgentClass;
4
+ };
@@ -0,0 +1,14 @@
1
+ import { FunctionAgent } from "../agents/agent.js";
2
+ import { AIAgent } from "../agents/ai-agent.js";
3
+ import { ImageAgent } from "../agents/image-agent.js";
4
+ import { MCPAgent } from "../agents/mcp-agent.js";
5
+ import { TeamAgent } from "../agents/team-agent.js";
6
+ import { TransformAgent } from "../agents/transform-agent.js";
7
+ export const builtinAgents = {
8
+ ai: AIAgent,
9
+ function: FunctionAgent,
10
+ image: ImageAgent,
11
+ mcp: MCPAgent,
12
+ team: TeamAgent,
13
+ transform: TransformAgent,
14
+ };
@@ -5,9 +5,8 @@ import type { ChatModel } from "../agents/chat-model.js";
5
5
  import type { ImageModel } from "../agents/image-model.js";
6
6
  import type { AIGNEOptions } from "../aigne/aigne.js";
7
7
  import type { MemoryAgent, MemoryAgentOptions } from "../memory/memory.js";
8
- import { PromptBuilder } from "../prompt/prompt-builder.js";
9
8
  import { type PromiseOrValue } from "../utils/type-utils.js";
10
- import { type Instructions, loadAgentFromYamlFile, type NestAgentSchema } from "./agent-yaml.js";
9
+ import { loadAgentFromYamlFile, type NestAgentSchema } from "./agent-yaml.js";
11
10
  export interface LoadOptions {
12
11
  memories?: {
13
12
  new (parameters?: MemoryAgentOptions): MemoryAgent;
@@ -19,7 +18,10 @@ export interface LoadOptions {
19
18
  availableModules?: {
20
19
  module: string;
21
20
  alias?: string[];
22
- create: (options?: Record<string, any>) => PromiseOrValue<AFSModule>;
21
+ load: (options: {
22
+ filepath: string;
23
+ parsed?: object;
24
+ }) => PromiseOrValue<AFSModule>;
23
25
  }[];
24
26
  };
25
27
  aigne?: z.infer<typeof aigneFileSchema>;
@@ -27,6 +29,9 @@ export interface LoadOptions {
27
29
  parent?: string;
28
30
  }) => Promise<any>;
29
31
  }
32
+ export interface AgentLoadOptions extends LoadOptions {
33
+ loadNestAgent: (path: string, agent: NestAgentSchema, options: LoadOptions, agentOptions?: AgentOptions<any, any> & Record<string, unknown>) => Promise<Agent>;
34
+ }
30
35
  export declare function load(path: string, options?: LoadOptions): Promise<AIGNEOptions>;
31
36
  export declare function loadAgent(path: string, options: LoadOptions, agentOptions?: AgentOptions): Promise<Agent>;
32
37
  export declare function loadNestAgent(path: string, agent: NestAgentSchema, options: LoadOptions, agentOptions?: AgentOptions<any, any> & Record<string, unknown>): Promise<Agent>;
@@ -67,9 +72,9 @@ declare const aigneFileSchema: z.ZodObject<{
67
72
  } | undefined, z.ZodTypeDef, number | {
68
73
  $get: string;
69
74
  } | undefined>;
70
- thinkingEffort: ZodType<number | "high" | "medium" | "low" | "minimal" | {
75
+ thinkingEffort: ZodType<number | "high" | "low" | "medium" | "minimal" | {
71
76
  $get: string;
72
- } | undefined, z.ZodTypeDef, number | "high" | "medium" | "low" | "minimal" | {
77
+ } | undefined, z.ZodTypeDef, number | "high" | "low" | "medium" | "minimal" | {
73
78
  $get: string;
74
79
  } | undefined>;
75
80
  }, z.ZodTypeAny, "passthrough"> | undefined, z.ZodTypeDef, z.objectInputType<{
@@ -98,9 +103,9 @@ declare const aigneFileSchema: z.ZodObject<{
98
103
  } | undefined, z.ZodTypeDef, number | {
99
104
  $get: string;
100
105
  } | undefined>;
101
- thinkingEffort: ZodType<number | "high" | "medium" | "low" | "minimal" | {
106
+ thinkingEffort: ZodType<number | "high" | "low" | "medium" | "minimal" | {
102
107
  $get: string;
103
- } | undefined, z.ZodTypeDef, number | "high" | "medium" | "low" | "minimal" | {
108
+ } | undefined, z.ZodTypeDef, number | "high" | "low" | "medium" | "minimal" | {
104
109
  $get: string;
105
110
  } | undefined>;
106
111
  }, z.ZodTypeAny, "passthrough"> | undefined>;
@@ -158,9 +163,9 @@ declare const aigneFileSchema: z.ZodObject<{
158
163
  } | undefined, z.ZodTypeDef, number | {
159
164
  $get: string;
160
165
  } | undefined>;
161
- thinkingEffort: ZodType<number | "high" | "medium" | "low" | "minimal" | {
166
+ thinkingEffort: ZodType<number | "high" | "low" | "medium" | "minimal" | {
162
167
  $get: string;
163
- } | undefined, z.ZodTypeDef, number | "high" | "medium" | "low" | "minimal" | {
168
+ } | undefined, z.ZodTypeDef, number | "high" | "low" | "medium" | "minimal" | {
164
169
  $get: string;
165
170
  } | undefined>;
166
171
  }, z.ZodTypeAny, "passthrough"> | undefined;
@@ -209,9 +214,9 @@ declare const aigneFileSchema: z.ZodObject<{
209
214
  } | undefined, z.ZodTypeDef, number | {
210
215
  $get: string;
211
216
  } | undefined>;
212
- thinkingEffort: ZodType<number | "high" | "medium" | "low" | "minimal" | {
217
+ thinkingEffort: ZodType<number | "high" | "low" | "medium" | "minimal" | {
213
218
  $get: string;
214
- } | undefined, z.ZodTypeDef, number | "high" | "medium" | "low" | "minimal" | {
219
+ } | undefined, z.ZodTypeDef, number | "high" | "low" | "medium" | "minimal" | {
215
220
  $get: string;
216
221
  } | undefined>;
217
222
  }, z.ZodTypeAny, "passthrough"> | undefined;
@@ -239,5 +244,4 @@ export declare function loadAIGNEFile(path: string): Promise<{
239
244
  rootDir: string;
240
245
  }>;
241
246
  export declare function findAIGNEFile(path: string): Promise<string>;
242
- export declare function instructionsToPromptBuilder(instructions: Instructions): PromptBuilder;
243
247
  export {};
@@ -2,18 +2,12 @@ import { AFS } from "@aigne/afs";
2
2
  import { nodejs } from "@aigne/platform-helpers/nodejs/index.js";
3
3
  import { parse } from "yaml";
4
4
  import { z } from "zod";
5
- import { Agent, FunctionAgent } from "../agents/agent.js";
6
- import { AIAgent } from "../agents/ai-agent.js";
7
- import { ImageAgent } from "../agents/image-agent.js";
8
- import { MCPAgent } from "../agents/mcp-agent.js";
9
- import { TeamAgent } from "../agents/team-agent.js";
10
- import { TransformAgent } from "../agents/transform-agent.js";
11
- import { PromptBuilder } from "../prompt/prompt-builder.js";
12
- import { ChatMessagesTemplate, parseChatMessages } from "../prompt/template.js";
5
+ import { Agent } from "../agents/agent.js";
13
6
  import { isAgent } from "../utils/agent-utils.js";
14
7
  import { flat, isNil, isNonNullable, omitBy, tryOrThrow, } from "../utils/type-utils.js";
15
8
  import { loadAgentFromJsFile } from "./agent-js.js";
16
9
  import { loadAgentFromYamlFile, } from "./agent-yaml.js";
10
+ import { builtinAgents } from "./agents.js";
17
11
  import { camelizeSchema, chatModelSchema, imageModelSchema, optionalize } from "./schema.js";
18
12
  const AIGNE_FILE_NAME = ["aigne.yaml", "aigne.yml"];
19
13
  export async function load(path, options = {}) {
@@ -154,7 +148,10 @@ export async function parseAgent(path, agent, options, agentOptions) {
154
148
  const mod = options?.afs?.availableModules?.find((mod) => mod.module === moduleName || mod.alias?.includes(moduleName));
155
149
  if (!mod)
156
150
  throw new Error(`AFS module not found: ${typeof m === "string" ? m : m.module}`);
157
- const module = await mod.create(typeof m === "string" ? {} : m.options);
151
+ const module = await mod.load({
152
+ filepath: path,
153
+ parsed: typeof m === "string" ? {} : m.options,
154
+ });
158
155
  afs.mount(module);
159
156
  }
160
157
  }
@@ -186,73 +183,24 @@ export async function parseAgent(path, agent, options, agentOptions) {
186
183
  skills: [...(agentOptions?.skills || []), ...skills],
187
184
  afs: afs || agentOptions?.afs,
188
185
  };
189
- let instructions;
190
- if ("instructions" in agent && agent.instructions && ["ai", "image"].includes(agent.type)) {
191
- instructions = instructionsToPromptBuilder(agent.instructions);
192
- }
193
- switch (agent.type) {
194
- case "ai": {
195
- return AIAgent.from({
196
- ...baseOptions,
197
- instructions,
198
- });
199
- }
200
- case "image": {
201
- if (!instructions)
202
- throw new Error(`Missing required instructions for image agent at path: ${path}`);
203
- return ImageAgent.from({
204
- ...baseOptions,
205
- instructions,
206
- });
207
- }
208
- case "mcp": {
209
- if (agent.url) {
210
- return MCPAgent.from({
211
- ...baseOptions,
212
- url: agent.url,
213
- });
214
- }
215
- if (agent.command) {
216
- return MCPAgent.from({
217
- ...baseOptions,
218
- command: agent.command,
219
- args: agent.args,
220
- });
221
- }
222
- throw new Error(`Missing url or command in mcp agent: ${path}`);
223
- }
224
- case "team": {
225
- return TeamAgent.from({
226
- ...baseOptions,
227
- mode: agent.mode,
228
- iterateOn: agent.iterateOn,
229
- reflection: agent.reflection && {
230
- ...agent.reflection,
231
- reviewer: await loadNestAgent(path, agent.reflection.reviewer, options),
232
- },
233
- });
234
- }
235
- case "transform": {
236
- return TransformAgent.from({
237
- ...baseOptions,
238
- jsonata: agent.jsonata,
239
- });
240
- }
241
- case "function": {
242
- return FunctionAgent.from({
243
- ...baseOptions,
244
- process: agent.process,
245
- });
186
+ let agentClass = builtinAgents[agent.type];
187
+ if (!agentClass) {
188
+ if (!options?.require)
189
+ throw new Error(`Module loader is not provided to load agent type module ${agent.type} from ${path}`);
190
+ const Mod = await options.require(agent.type, { parent: path });
191
+ if (typeof Mod?.default?.prototype?.constructor !== "function") {
192
+ throw new Error(`The agent type module ${agent.type} does not export a default Agent class`);
246
193
  }
194
+ agentClass = Mod.default;
247
195
  }
248
- if ("agentClass" in agent && agent.agentClass) {
249
- return await agent.agentClass.load({
250
- filepath: path,
251
- parsed: baseOptions,
252
- options,
253
- });
196
+ if (!agentClass) {
197
+ throw new Error(`Unsupported agent type: ${agent.type} from ${path}`);
254
198
  }
255
- throw new Error(`Unsupported agent type: ${"type" in agent ? agent.type : "unknown"} at path: ${path}`);
199
+ return await agentClass.load({
200
+ filepath: path,
201
+ parsed: baseOptions,
202
+ options: { ...options, loadNestAgent },
203
+ });
256
204
  }
257
205
  async function loadMemory(memories, provider, options) {
258
206
  const M = !provider
@@ -308,11 +256,3 @@ export async function findAIGNEFile(path) {
308
256
  }
309
257
  throw new Error(`aigne.yaml not found in ${path}. Please ensure you are in the correct directory or provide a valid path.`);
310
258
  }
311
- export function instructionsToPromptBuilder(instructions) {
312
- return new PromptBuilder({
313
- instructions: ChatMessagesTemplate.from(parseChatMessages(instructions.map((i) => ({
314
- ...i,
315
- options: { workingDir: nodejs.path.dirname(i.path) },
316
- })))),
317
- });
318
- }
@@ -1,4 +1,6 @@
1
1
  import { type ZodType, z } from "zod";
2
+ import { type Role } from "../agents/chat-model.js";
3
+ import { PromptBuilder } from "../prompt/prompt-builder.js";
2
4
  export declare const inputOutputSchema: ({ path }: {
3
5
  path: string;
4
6
  }) => z.ZodUnion<[ZodType<any, z.ZodTypeDef, any>, z.ZodEffects<z.ZodObject<{
@@ -55,9 +57,9 @@ declare const chatModelObjectSchema: z.ZodObject<{
55
57
  } | undefined, z.ZodTypeDef, number | {
56
58
  $get: string;
57
59
  } | undefined>;
58
- thinkingEffort: ZodType<number | "high" | "medium" | "low" | "minimal" | {
60
+ thinkingEffort: ZodType<number | "high" | "low" | "medium" | "minimal" | {
59
61
  $get: string;
60
- } | undefined, z.ZodTypeDef, number | "high" | "medium" | "low" | "minimal" | {
62
+ } | undefined, z.ZodTypeDef, number | "high" | "low" | "medium" | "minimal" | {
61
63
  $get: string;
62
64
  } | undefined>;
63
65
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
@@ -86,9 +88,9 @@ declare const chatModelObjectSchema: z.ZodObject<{
86
88
  } | undefined, z.ZodTypeDef, number | {
87
89
  $get: string;
88
90
  } | undefined>;
89
- thinkingEffort: ZodType<number | "high" | "medium" | "low" | "minimal" | {
91
+ thinkingEffort: ZodType<number | "high" | "low" | "medium" | "minimal" | {
90
92
  $get: string;
91
- } | undefined, z.ZodTypeDef, number | "high" | "medium" | "low" | "minimal" | {
93
+ } | undefined, z.ZodTypeDef, number | "high" | "low" | "medium" | "minimal" | {
92
94
  $get: string;
93
95
  } | undefined>;
94
96
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
@@ -117,9 +119,9 @@ declare const chatModelObjectSchema: z.ZodObject<{
117
119
  } | undefined, z.ZodTypeDef, number | {
118
120
  $get: string;
119
121
  } | undefined>;
120
- thinkingEffort: ZodType<number | "high" | "medium" | "low" | "minimal" | {
122
+ thinkingEffort: ZodType<number | "high" | "low" | "medium" | "minimal" | {
121
123
  $get: string;
122
- } | undefined, z.ZodTypeDef, number | "high" | "medium" | "low" | "minimal" | {
124
+ } | undefined, z.ZodTypeDef, number | "high" | "low" | "medium" | "minimal" | {
123
125
  $get: string;
124
126
  } | undefined>;
125
127
  }, z.ZodTypeAny, "passthrough">>;
@@ -149,4 +151,17 @@ export declare function camelizeSchema<T extends ZodType>(schema: T, { shallow }
149
151
  shallow?: boolean;
150
152
  }): T;
151
153
  export declare function preprocessSchema<T extends ZodType>(fn: (data: unknown) => unknown, schema: T): T;
154
+ export type Instructions = {
155
+ role: Exclude<Role, "tool">;
156
+ content: string;
157
+ path: string;
158
+ cacheControl?: {
159
+ type: "ephemeral";
160
+ ttl?: "5m" | "1h";
161
+ };
162
+ }[];
163
+ export declare const getInstructionsSchema: ({ filepath }: {
164
+ filepath: string;
165
+ }) => ZodType<Instructions>;
166
+ export declare function instructionsToPromptBuilder(instructions: Instructions | string): PromptBuilder;
152
167
  export {};
@@ -2,6 +2,9 @@ import { nodejs } from "@aigne/platform-helpers/nodejs/index.js";
2
2
  import { parse } from "yaml";
3
3
  import { z } from "zod";
4
4
  import { getterSchema } from "../agents/agent.js";
5
+ import { roleSchema } from "../agents/chat-model.js";
6
+ import { PromptBuilder } from "../prompt/prompt-builder.js";
7
+ import { ChatMessagesTemplate, parseChatMessages } from "../prompt/template.js";
5
8
  import { camelize } from "../utils/camelize.js";
6
9
  import { isRecord } from "../utils/type-utils.js";
7
10
  export const inputOutputSchema = ({ path }) => {
@@ -94,3 +97,57 @@ export function camelizeSchema(schema, { shallow = true } = {}) {
94
97
  export function preprocessSchema(fn, schema) {
95
98
  return z.preprocess(fn, schema);
96
99
  }
100
+ const instructionItemSchema = camelizeSchema(z.union([
101
+ z.object({
102
+ role: roleSchema.default("system"),
103
+ url: z.string(),
104
+ cacheControl: optionalize(z.object({
105
+ type: z.literal("ephemeral"),
106
+ ttl: optionalize(z.union([z.literal("5m"), z.literal("1h")])),
107
+ })),
108
+ }),
109
+ z.object({
110
+ role: roleSchema.default("system"),
111
+ content: z.string(),
112
+ cacheControl: optionalize(z.object({
113
+ type: z.literal("ephemeral"),
114
+ ttl: optionalize(z.union([z.literal("5m"), z.literal("1h")])),
115
+ })),
116
+ }),
117
+ ]));
118
+ const parseInstructionItem = ({ filepath }) => async ({ role, cacheControl, ...v }) => {
119
+ if (role === "tool")
120
+ throw new Error(`'tool' role is not allowed in instruction item in agent file ${filepath}`);
121
+ if ("content" in v && typeof v.content === "string") {
122
+ return { role, content: v.content, path: filepath, cacheControl };
123
+ }
124
+ if ("url" in v && typeof v.url === "string") {
125
+ const url = nodejs.path.isAbsolute(v.url)
126
+ ? v.url
127
+ : nodejs.path.join(nodejs.path.dirname(filepath), v.url);
128
+ return nodejs.fs
129
+ .readFile(url, "utf8")
130
+ .then((content) => ({ role, content, path: url, cacheControl }));
131
+ }
132
+ throw new Error(`Invalid instruction item in agent file ${filepath}. Expected 'content' or 'url' property`);
133
+ };
134
+ export const getInstructionsSchema = ({ filepath }) => z
135
+ .union([z.string(), instructionItemSchema, z.array(instructionItemSchema)])
136
+ .transform(async (v) => {
137
+ if (typeof v === "string")
138
+ return [{ role: "system", content: v, path: filepath }];
139
+ if (Array.isArray(v)) {
140
+ return Promise.all(v.map((item) => parseInstructionItem({ filepath })(item)));
141
+ }
142
+ return [await parseInstructionItem({ filepath })(v)];
143
+ });
144
+ export function instructionsToPromptBuilder(instructions) {
145
+ return new PromptBuilder({
146
+ instructions: typeof instructions === "string"
147
+ ? instructions
148
+ : ChatMessagesTemplate.from(parseChatMessages(instructions.map((i) => ({
149
+ ...i,
150
+ options: { workingDir: nodejs.path.dirname(i.path) },
151
+ })))),
152
+ });
153
+ }
@@ -42,24 +42,24 @@ export declare const memoryRecorderOutputSchema: z.ZodObject<{
42
42
  content: ZodType<{}, z.ZodTypeDef, {}>;
43
43
  createdAt: z.ZodString;
44
44
  }, "strip", z.ZodTypeAny, {
45
- content: {};
46
45
  id: string;
46
+ content: {};
47
47
  createdAt: string;
48
48
  }, {
49
- content: {};
50
49
  id: string;
50
+ content: {};
51
51
  createdAt: string;
52
52
  }>, "many">;
53
53
  }, "strip", z.ZodTypeAny, {
54
54
  memories: {
55
- content: {};
56
55
  id: string;
56
+ content: {};
57
57
  createdAt: string;
58
58
  }[];
59
59
  }, {
60
60
  memories: {
61
- content: {};
62
61
  id: string;
62
+ content: {};
63
63
  createdAt: string;
64
64
  }[];
65
65
  }>;
@@ -55,24 +55,24 @@ export declare const memoryRetrieverOutputSchema: z.ZodObject<{
55
55
  content: z.ZodType<{}, z.ZodTypeDef, {}>;
56
56
  createdAt: z.ZodString;
57
57
  }, "strip", z.ZodTypeAny, {
58
- content: {};
59
58
  id: string;
59
+ content: {};
60
60
  createdAt: string;
61
61
  }, {
62
- content: {};
63
62
  id: string;
63
+ content: {};
64
64
  createdAt: string;
65
65
  }>, "many">;
66
66
  }, "strip", z.ZodTypeAny, {
67
67
  memories: {
68
- content: {};
69
68
  id: string;
69
+ content: {};
70
70
  createdAt: string;
71
71
  }[];
72
72
  }, {
73
73
  memories: {
74
- content: {};
75
74
  id: string;
75
+ content: {};
76
76
  createdAt: string;
77
77
  }[];
78
78
  }>;