@aigne/core 1.72.0-beta.3 → 1.72.0-beta.4

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 (93) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/lib/cjs/agents/agent.d.ts +31 -1
  3. package/lib/cjs/agents/agent.js +13 -0
  4. package/lib/cjs/agents/ai-agent.d.ts +7 -0
  5. package/lib/cjs/agents/ai-agent.js +85 -3
  6. package/lib/cjs/agents/image-agent.d.ts +17 -1
  7. package/lib/cjs/agents/image-agent.js +16 -0
  8. package/lib/cjs/agents/image-model.d.ts +4 -4
  9. package/lib/cjs/agents/mcp-agent.d.ts +17 -0
  10. package/lib/cjs/agents/mcp-agent.js +18 -0
  11. package/lib/cjs/agents/team-agent.d.ts +55 -0
  12. package/lib/cjs/agents/team-agent.js +31 -0
  13. package/lib/cjs/agents/transform-agent.d.ts +12 -0
  14. package/lib/cjs/agents/transform-agent.js +13 -0
  15. package/lib/cjs/agents/video-model.d.ts +4 -4
  16. package/lib/cjs/loader/agent-yaml.d.ts +5 -67
  17. package/lib/cjs/loader/agent-yaml.js +4 -139
  18. package/lib/cjs/loader/agents.d.ts +4 -0
  19. package/lib/cjs/loader/agents.js +17 -0
  20. package/lib/cjs/loader/index.d.ts +18 -14
  21. package/lib/cjs/loader/index.js +20 -81
  22. package/lib/cjs/loader/schema.d.ts +21 -6
  23. package/lib/cjs/loader/schema.js +60 -1
  24. package/lib/cjs/prompt/prompt-builder.js +0 -1
  25. package/lib/cjs/prompt/skills/afs/agent-skill/agent-skill.d.ts +17 -0
  26. package/lib/cjs/prompt/skills/afs/agent-skill/agent-skill.js +63 -0
  27. package/lib/cjs/prompt/skills/afs/agent-skill/skill-loader.d.ts +13 -0
  28. package/lib/cjs/prompt/skills/afs/agent-skill/skill-loader.js +61 -0
  29. package/lib/cjs/prompt/skills/afs/delete.js +15 -3
  30. package/lib/cjs/prompt/skills/afs/edit.js +30 -7
  31. package/lib/cjs/prompt/skills/afs/exec.js +17 -6
  32. package/lib/cjs/prompt/skills/afs/index.js +4 -1
  33. package/lib/cjs/prompt/skills/afs/list.js +26 -10
  34. package/lib/cjs/prompt/skills/afs/read.js +14 -3
  35. package/lib/cjs/prompt/skills/afs/rename.js +18 -4
  36. package/lib/cjs/prompt/skills/afs/search.js +21 -5
  37. package/lib/cjs/prompt/skills/afs/write.js +18 -4
  38. package/lib/cjs/prompt/template.d.ts +23 -23
  39. package/lib/dts/agents/agent.d.ts +31 -1
  40. package/lib/dts/agents/ai-agent.d.ts +7 -0
  41. package/lib/dts/agents/image-agent.d.ts +17 -1
  42. package/lib/dts/agents/image-model.d.ts +4 -4
  43. package/lib/dts/agents/mcp-agent.d.ts +17 -0
  44. package/lib/dts/agents/team-agent.d.ts +55 -0
  45. package/lib/dts/agents/transform-agent.d.ts +12 -0
  46. package/lib/dts/agents/video-model.d.ts +4 -4
  47. package/lib/dts/aigne/context.d.ts +2 -2
  48. package/lib/dts/loader/agent-yaml.d.ts +5 -67
  49. package/lib/dts/loader/agents.d.ts +4 -0
  50. package/lib/dts/loader/index.d.ts +18 -14
  51. package/lib/dts/loader/schema.d.ts +21 -6
  52. package/lib/dts/prompt/skills/afs/agent-skill/agent-skill.d.ts +17 -0
  53. package/lib/dts/prompt/skills/afs/agent-skill/skill-loader.d.ts +13 -0
  54. package/lib/dts/prompt/template.d.ts +25 -25
  55. package/lib/esm/agents/agent.d.ts +31 -1
  56. package/lib/esm/agents/agent.js +13 -0
  57. package/lib/esm/agents/ai-agent.d.ts +7 -0
  58. package/lib/esm/agents/ai-agent.js +85 -3
  59. package/lib/esm/agents/image-agent.d.ts +17 -1
  60. package/lib/esm/agents/image-agent.js +16 -0
  61. package/lib/esm/agents/image-model.d.ts +4 -4
  62. package/lib/esm/agents/mcp-agent.d.ts +17 -0
  63. package/lib/esm/agents/mcp-agent.js +18 -0
  64. package/lib/esm/agents/team-agent.d.ts +55 -0
  65. package/lib/esm/agents/team-agent.js +31 -0
  66. package/lib/esm/agents/transform-agent.d.ts +12 -0
  67. package/lib/esm/agents/transform-agent.js +13 -0
  68. package/lib/esm/agents/video-model.d.ts +4 -4
  69. package/lib/esm/aigne/context.d.ts +2 -2
  70. package/lib/esm/loader/agent-yaml.d.ts +5 -67
  71. package/lib/esm/loader/agent-yaml.js +4 -138
  72. package/lib/esm/loader/agents.d.ts +4 -0
  73. package/lib/esm/loader/agents.js +14 -0
  74. package/lib/esm/loader/index.d.ts +18 -14
  75. package/lib/esm/loader/index.js +21 -81
  76. package/lib/esm/loader/schema.d.ts +21 -6
  77. package/lib/esm/loader/schema.js +57 -0
  78. package/lib/esm/prompt/prompt-builder.js +1 -2
  79. package/lib/esm/prompt/skills/afs/agent-skill/agent-skill.d.ts +17 -0
  80. package/lib/esm/prompt/skills/afs/agent-skill/agent-skill.js +59 -0
  81. package/lib/esm/prompt/skills/afs/agent-skill/skill-loader.d.ts +13 -0
  82. package/lib/esm/prompt/skills/afs/agent-skill/skill-loader.js +53 -0
  83. package/lib/esm/prompt/skills/afs/delete.js +15 -3
  84. package/lib/esm/prompt/skills/afs/edit.js +30 -7
  85. package/lib/esm/prompt/skills/afs/exec.js +17 -6
  86. package/lib/esm/prompt/skills/afs/index.js +4 -1
  87. package/lib/esm/prompt/skills/afs/list.js +26 -10
  88. package/lib/esm/prompt/skills/afs/read.js +14 -3
  89. package/lib/esm/prompt/skills/afs/rename.js +18 -4
  90. package/lib/esm/prompt/skills/afs/search.js +21 -5
  91. package/lib/esm/prompt/skills/afs/write.js +18 -4
  92. package/lib/esm/prompt/template.d.ts +25 -25
  93. package/package.json +5 -4
@@ -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>;
@@ -132,6 +137,7 @@ declare const aigneFileSchema: z.ZodObject<{
132
137
  chat?: string | undefined;
133
138
  } | undefined>;
134
139
  }, "strip", z.ZodTypeAny, {
140
+ name?: string | undefined;
135
141
  model?: z.objectInputType<{
136
142
  model: ZodType<string | {
137
143
  $get: string;
@@ -158,13 +164,12 @@ declare const aigneFileSchema: z.ZodObject<{
158
164
  } | undefined, z.ZodTypeDef, number | {
159
165
  $get: string;
160
166
  } | undefined>;
161
- thinkingEffort: ZodType<number | "high" | "medium" | "low" | "minimal" | {
167
+ thinkingEffort: ZodType<number | "high" | "low" | "medium" | "minimal" | {
162
168
  $get: string;
163
- } | undefined, z.ZodTypeDef, number | "high" | "medium" | "low" | "minimal" | {
169
+ } | undefined, z.ZodTypeDef, number | "high" | "low" | "medium" | "minimal" | {
164
170
  $get: string;
165
171
  } | undefined>;
166
172
  }, z.ZodTypeAny, "passthrough"> | undefined;
167
- name?: string | undefined;
168
173
  description?: string | undefined;
169
174
  imageModel?: z.objectInputType<{
170
175
  model: ZodType<string | {
@@ -183,6 +188,7 @@ declare const aigneFileSchema: z.ZodObject<{
183
188
  chat?: string | undefined;
184
189
  } | undefined;
185
190
  }, {
191
+ name?: string | undefined;
186
192
  model?: z.objectInputType<{
187
193
  model: ZodType<string | {
188
194
  $get: string;
@@ -209,13 +215,12 @@ declare const aigneFileSchema: z.ZodObject<{
209
215
  } | undefined, z.ZodTypeDef, number | {
210
216
  $get: string;
211
217
  } | undefined>;
212
- thinkingEffort: ZodType<number | "high" | "medium" | "low" | "minimal" | {
218
+ thinkingEffort: ZodType<number | "high" | "low" | "medium" | "minimal" | {
213
219
  $get: string;
214
- } | undefined, z.ZodTypeDef, number | "high" | "medium" | "low" | "minimal" | {
220
+ } | undefined, z.ZodTypeDef, number | "high" | "low" | "medium" | "minimal" | {
215
221
  $get: string;
216
222
  } | undefined>;
217
223
  }, z.ZodTypeAny, "passthrough"> | undefined;
218
- name?: string | undefined;
219
224
  description?: string | undefined;
220
225
  imageModel?: z.objectInputType<{
221
226
  model: ZodType<string | {
@@ -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 {};
@@ -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 {};
@@ -0,0 +1,17 @@
1
+ import { Agent, type AgentOptions, type Message } from "../../../../agents/agent.js";
2
+ import type { Skill } from "./skill-loader.js";
3
+ export interface SkillToolInput extends Message {
4
+ skill: string;
5
+ args?: string;
6
+ }
7
+ export interface SkillToolOutput extends Message {
8
+ result: string;
9
+ }
10
+ export interface SkillToolOptions extends AgentOptions<SkillToolInput, SkillToolOutput> {
11
+ agentSkills: Skill[];
12
+ }
13
+ export declare class AgentSkill extends Agent<SkillToolInput, SkillToolOutput> {
14
+ constructor(options: SkillToolOptions);
15
+ private agentSkills;
16
+ process(input: SkillToolInput): Promise<SkillToolOutput>;
17
+ }
@@ -0,0 +1,13 @@
1
+ import type { AFS } from "@aigne/afs";
2
+ import { AgentSkill } from "./agent-skill.js";
3
+ export interface Skill {
4
+ path: string;
5
+ name: string;
6
+ description: string;
7
+ content: string;
8
+ }
9
+ export declare function loadSkill(path: string): Promise<Skill>;
10
+ export declare function loadSkills(paths: string[]): Promise<Skill[]>;
11
+ export declare function loadAgentSkillFromAFS({ afs, }: {
12
+ afs: AFS;
13
+ }): Promise<AgentSkill | undefined>;
@@ -42,11 +42,11 @@ export declare class AgentMessageTemplate extends ChatMessageTemplate {
42
42
  static from(template?: ChatModelInputMessage["content"], toolCalls?: ChatModelOutputToolCall[], name?: string, options?: FormatOptions, cacheControl?: ChatModelInputMessage["cacheControl"]): AgentMessageTemplate;
43
43
  constructor(content?: ChatModelInputMessage["content"], toolCalls?: ChatModelOutputToolCall[] | undefined, name?: string, options?: FormatOptions, cacheControl?: ChatModelInputMessage["cacheControl"]);
44
44
  format(_variables?: Record<string, unknown>, _options?: FormatOptions): Promise<{
45
- role: "agent" | "system" | "user" | "tool";
45
+ role: "system" | "user" | "agent" | "tool";
46
46
  name: string | undefined;
47
47
  content: ChatModelInputMessageContent | undefined;
48
48
  toolCalls: ChatModelOutputToolCall[] | undefined;
49
- cacheControl: import("../agents/chat-model.js").CacheControl | undefined;
49
+ cacheControl: import("../index.js").CacheControl | undefined;
50
50
  }>;
51
51
  }
52
52
  export declare class ToolMessageTemplate extends ChatMessageTemplate {
@@ -54,11 +54,11 @@ export declare class ToolMessageTemplate extends ChatMessageTemplate {
54
54
  static from(content: object | string, toolCallId: string, name?: string, options?: FormatOptions, cacheControl?: ChatModelInputMessage["cacheControl"]): ToolMessageTemplate;
55
55
  constructor(content: object | string, toolCallId: string, name?: string, options?: FormatOptions, cacheControl?: ChatModelInputMessage["cacheControl"]);
56
56
  format(_variables?: Record<string, unknown>, _options?: FormatOptions): Promise<{
57
- role: "agent" | "system" | "user" | "tool";
57
+ role: "system" | "user" | "agent" | "tool";
58
58
  name: string | undefined;
59
59
  content: ChatModelInputMessageContent | undefined;
60
60
  toolCallId: string;
61
- cacheControl: import("../agents/chat-model.js").CacheControl | undefined;
61
+ cacheControl: import("../index.js").CacheControl | undefined;
62
62
  }>;
63
63
  }
64
64
  export declare class ChatMessagesTemplate {
@@ -83,21 +83,21 @@ declare const chatMessageSchema: z.ZodUnion<[z.ZodObject<{
83
83
  ttl?: "5m" | "1h" | undefined;
84
84
  }>>;
85
85
  }, "strip", z.ZodTypeAny, {
86
- role: "system";
87
86
  content: string;
88
- name?: string | undefined;
87
+ role: "system";
89
88
  cacheControl?: {
90
89
  type: "ephemeral";
91
90
  ttl?: "5m" | "1h" | undefined;
92
91
  } | undefined;
92
+ name?: string | undefined;
93
93
  }, {
94
- role: "system";
95
94
  content: string;
96
- name?: string | undefined;
95
+ role: "system";
97
96
  cacheControl?: {
98
97
  type: "ephemeral";
99
98
  ttl?: "5m" | "1h" | undefined;
100
99
  } | undefined;
100
+ name?: string | undefined;
101
101
  }>, z.ZodObject<{
102
102
  role: z.ZodLiteral<"user">;
103
103
  content: z.ZodString;
@@ -113,21 +113,21 @@ declare const chatMessageSchema: z.ZodUnion<[z.ZodObject<{
113
113
  ttl?: "5m" | "1h" | undefined;
114
114
  }>>;
115
115
  }, "strip", z.ZodTypeAny, {
116
- role: "user";
117
116
  content: string;
118
- name?: string | undefined;
117
+ role: "user";
119
118
  cacheControl?: {
120
119
  type: "ephemeral";
121
120
  ttl?: "5m" | "1h" | undefined;
122
121
  } | undefined;
122
+ name?: string | undefined;
123
123
  }, {
124
- role: "user";
125
124
  content: string;
126
- name?: string | undefined;
125
+ role: "user";
127
126
  cacheControl?: {
128
127
  type: "ephemeral";
129
128
  ttl?: "5m" | "1h" | undefined;
130
129
  } | undefined;
130
+ name?: string | undefined;
131
131
  }>, z.ZodObject<{
132
132
  role: z.ZodLiteral<"agent">;
133
133
  content: z.ZodOptional<z.ZodString>;
@@ -172,8 +172,11 @@ declare const chatMessageSchema: z.ZodUnion<[z.ZodObject<{
172
172
  }>>;
173
173
  }, "strip", z.ZodTypeAny, {
174
174
  role: "agent";
175
- name?: string | undefined;
176
175
  content?: string | undefined;
176
+ cacheControl?: {
177
+ type: "ephemeral";
178
+ ttl?: "5m" | "1h" | undefined;
179
+ } | undefined;
177
180
  toolCalls?: {
178
181
  function: {
179
182
  name: string;
@@ -182,14 +185,14 @@ declare const chatMessageSchema: z.ZodUnion<[z.ZodObject<{
182
185
  type: "function";
183
186
  id: string;
184
187
  }[] | undefined;
188
+ name?: string | undefined;
189
+ }, {
190
+ role: "agent";
191
+ content?: string | undefined;
185
192
  cacheControl?: {
186
193
  type: "ephemeral";
187
194
  ttl?: "5m" | "1h" | undefined;
188
195
  } | undefined;
189
- }, {
190
- role: "agent";
191
- name?: string | undefined;
192
- content?: string | undefined;
193
196
  toolCalls?: {
194
197
  function: {
195
198
  name: string;
@@ -198,10 +201,7 @@ declare const chatMessageSchema: z.ZodUnion<[z.ZodObject<{
198
201
  type: "function";
199
202
  id: string;
200
203
  }[] | undefined;
201
- cacheControl?: {
202
- type: "ephemeral";
203
- ttl?: "5m" | "1h" | undefined;
204
- } | undefined;
204
+ name?: string | undefined;
205
205
  }>, z.ZodObject<{
206
206
  role: z.ZodLiteral<"tool">;
207
207
  content: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>]>, string, string | Record<string, unknown>>;
@@ -218,23 +218,23 @@ declare const chatMessageSchema: z.ZodUnion<[z.ZodObject<{
218
218
  ttl?: "5m" | "1h" | undefined;
219
219
  }>>;
220
220
  }, "strip", z.ZodTypeAny, {
221
- role: "tool";
222
221
  content: string;
222
+ role: "tool";
223
223
  toolCallId: string;
224
- name?: string | undefined;
225
224
  cacheControl?: {
226
225
  type: "ephemeral";
227
226
  ttl?: "5m" | "1h" | undefined;
228
227
  } | undefined;
228
+ name?: string | undefined;
229
229
  }, {
230
- role: "tool";
231
230
  content: string | Record<string, unknown>;
231
+ role: "tool";
232
232
  toolCallId: string;
233
- name?: string | undefined;
234
233
  cacheControl?: {
235
234
  type: "ephemeral";
236
235
  ttl?: "5m" | "1h" | undefined;
237
236
  } | undefined;
237
+ name?: string | undefined;
238
238
  }>]>;
239
239
  export declare function safeParseChatMessages(messages: unknown): ChatMessageTemplate[] | undefined;
240
240
  export declare function parseChatMessages(messages: (z.infer<typeof chatMessageSchema> & {
@@ -1,7 +1,7 @@
1
1
  import { AFS, type AFSExecOptions, type AFSExecResult, type AFSListOptions, type AFSListResult, type AFSModule, type AFSOptions, type AFSReadResult, type AFSSearchOptions } from "@aigne/afs";
2
2
  import { nodejs } from "@aigne/platform-helpers/nodejs/index.js";
3
3
  import type * as prompts from "@inquirer/prompts";
4
- import { type ZodObject, type ZodType } from "zod";
4
+ import { type ZodObject, type ZodType, z } from "zod";
5
5
  import type { AgentEvent, Context, UserContext } from "../aigne/context.js";
6
6
  import type { MessagePayload } from "../aigne/message-queue.js";
7
7
  import type { ContextUsage } from "../aigne/usage.js";
@@ -783,6 +783,25 @@ export interface AgentResponseProgress {
783
783
  } | {
784
784
  event: "agentFailed";
785
785
  error: Error;
786
+ } | {
787
+ event: "message";
788
+ role: "user" | "agent";
789
+ message: ({
790
+ type: "text";
791
+ content: string;
792
+ } | {
793
+ type: "thinking";
794
+ thoughts: string;
795
+ } | {
796
+ type: "tool_use";
797
+ toolUseId: string;
798
+ name: string;
799
+ input: unknown;
800
+ } | {
801
+ type: "tool_result";
802
+ toolUseId: string;
803
+ content: unknown;
804
+ })[];
786
805
  }) & Omit<AgentEvent, "agent"> & {
787
806
  agent: {
788
807
  name: string;
@@ -870,6 +889,17 @@ export interface FunctionAgentOptions<I extends Message = Message, O extends Mes
870
889
  */
871
890
  export declare class FunctionAgent<I extends Message = Message, O extends Message = Message> extends Agent<I, O> {
872
891
  tag: string;
892
+ static schema(): ZodObject<{
893
+ process: ZodType<FunctionAgentFn>;
894
+ }, "strip", z.ZodTypeAny, {
895
+ process: FunctionAgentFn<any, any, FunctionAgent<any, any>>;
896
+ }, {
897
+ process: FunctionAgentFn<any, any, FunctionAgent<any, any>>;
898
+ }>;
899
+ static load<I extends Message = any, O extends Message = any>(options: {
900
+ filepath: string;
901
+ parsed: object;
902
+ }): Promise<Agent<I, O>>;
873
903
  /**
874
904
  * Create a function agent from a function or options
875
905
  *
@@ -5,6 +5,7 @@ import nunjucks from "nunjucks";
5
5
  import { joinURL } from "ufo";
6
6
  import { z } from "zod";
7
7
  import { zodToJsonSchema } from "zod-to-json-schema";
8
+ import { codeToFunctionAgentFn } from "../loader/function-agent.js";
8
9
  import { sortHooks } from "../utils/agent-utils.js";
9
10
  import { getZodObjectKeys, isZodSchema } from "../utils/json-schema.js";
10
11
  import { logger } from "../utils/logger.js";
@@ -824,6 +825,18 @@ function checkAgentInputOutputSchema(schema) {
824
825
  */
825
826
  export class FunctionAgent extends Agent {
826
827
  tag = "FunctionAgent";
828
+ static schema() {
829
+ return z.object({
830
+ process: z.preprocess((v) => (typeof v === "string" ? codeToFunctionAgentFn(v) : v), z.custom()),
831
+ });
832
+ }
833
+ static async load(options) {
834
+ const valid = await FunctionAgent.schema().parseAsync(options.parsed);
835
+ return new FunctionAgent({
836
+ ...options.parsed,
837
+ process: valid.process,
838
+ });
839
+ }
827
840
  /**
828
841
  * Create a function agent from a function or options
829
842
  *
@@ -188,6 +188,13 @@ export declare const aiAgentOptionsSchema: ZodObject<{
188
188
  */
189
189
  export declare class AIAgent<I extends Message = any, O extends Message = any> extends Agent<I, O> {
190
190
  tag: string;
191
+ static schema<T>({ filepath }: {
192
+ filepath: string;
193
+ }): ZodType<T>;
194
+ static load<I extends Message = any, O extends Message = any>(options: {
195
+ filepath: string;
196
+ parsed: object;
197
+ }): Promise<Agent<I, O>>;
191
198
  /**
192
199
  * Create an AIAgent with the specified options
193
200
  *
@@ -1,8 +1,10 @@
1
1
  import { z } from "zod";
2
+ import { camelizeSchema, getInstructionsSchema, instructionsToPromptBuilder, optionalize, } from "../loader/schema.js";
2
3
  import { PromptBuilder } from "../prompt/prompt-builder.js";
3
4
  import { STRUCTURED_STREAM_INSTRUCTIONS } from "../prompt/prompts/structured-stream-instructions.js";
4
5
  import { AgentMessageTemplate, ToolMessageTemplate } from "../prompt/template.js";
5
6
  import * as fastq from "../utils/queue.js";
7
+ import { mergeAgentResponseChunk } from "../utils/stream-utils.js";
6
8
  import { ExtractMetadataTransform } from "../utils/structured-stream-extractor.js";
7
9
  import { checkArguments, isEmpty } from "../utils/type-utils.js";
8
10
  import { Agent, agentOptionsSchema, isAgentResponseDelta, } from "./agent.js";
@@ -84,6 +86,32 @@ export const aiAgentOptionsSchema = agentOptionsSchema.extend({
84
86
  */
85
87
  export class AIAgent extends Agent {
86
88
  tag = "AIAgent";
89
+ static schema({ filepath }) {
90
+ const instructionsSchema = getInstructionsSchema({ filepath });
91
+ return camelizeSchema(z.object({
92
+ instructions: optionalize(instructionsSchema),
93
+ autoReorderSystemMessages: optionalize(z.boolean()),
94
+ autoMergeSystemMessages: optionalize(z.boolean()),
95
+ inputKey: optionalize(z.string()),
96
+ outputKey: optionalize(z.string()),
97
+ inputFileKey: optionalize(z.string()),
98
+ outputFileKey: optionalize(z.string()),
99
+ toolChoice: optionalize(z.nativeEnum(AIAgentToolChoice)),
100
+ toolCallsConcurrency: optionalize(z.number().int().min(0)),
101
+ keepTextInToolUses: optionalize(z.boolean()),
102
+ catchToolsError: optionalize(z.boolean()),
103
+ structuredStreamMode: optionalize(z.boolean()),
104
+ }));
105
+ }
106
+ static async load(options) {
107
+ const schema = AIAgent.schema(options);
108
+ const valid = await schema.parseAsync(options.parsed);
109
+ return new AIAgent({
110
+ ...options.parsed,
111
+ ...valid,
112
+ instructions: valid.instructions && instructionsToPromptBuilder(valid.instructions),
113
+ });
114
+ }
87
115
  /**
88
116
  * Create an AIAgent with the specified options
89
117
  *
@@ -280,6 +308,16 @@ export class AIAgent extends Agent {
280
308
  }
281
309
  const toolCallMessages = [];
282
310
  const outputKey = this.outputKey;
311
+ const inputMessage = this.inputKey ? input[this.inputKey] : undefined;
312
+ if (inputMessage) {
313
+ yield {
314
+ progress: {
315
+ event: "message",
316
+ role: "user",
317
+ message: [{ type: "text", content: inputMessage }],
318
+ },
319
+ };
320
+ }
283
321
  for (;;) {
284
322
  const modelOutput = {};
285
323
  let stream = await this.invokeChildAgent(model, { ...modelInput, messages: modelInput.messages.concat(toolCallMessages) }, { ...options, streaming: true });
@@ -289,12 +327,12 @@ export class AIAgent extends Agent {
289
327
  }
290
328
  let isTextIgnored = false;
291
329
  for await (const value of stream) {
330
+ mergeAgentResponseChunk(modelOutput, value);
292
331
  if (isAgentResponseDelta(value)) {
293
332
  if (!isTextIgnored && value.delta.text?.text) {
294
333
  yield { delta: { text: { [outputKey]: value.delta.text.text } } };
295
334
  }
296
335
  if (value.delta.json) {
297
- Object.assign(modelOutput, value.delta.json);
298
336
  if (this.structuredStreamMode) {
299
337
  yield { delta: { json: value.delta.json.json } };
300
338
  if (!isTextIgnored && modelOutput.json && this.ignoreTextOfStructuredStreamMode) {
@@ -304,13 +342,23 @@ export class AIAgent extends Agent {
304
342
  }
305
343
  }
306
344
  }
307
- const { toolCalls, json, text, files } = modelOutput;
345
+ const { toolCalls, json, text, thoughts, files } = modelOutput;
346
+ if (text) {
347
+ yield {
348
+ progress: { event: "message", role: "agent", message: [{ type: "text", content: text }] },
349
+ };
350
+ }
351
+ if (thoughts) {
352
+ yield {
353
+ progress: { event: "message", role: "agent", message: [{ type: "thinking", thoughts }] },
354
+ };
355
+ }
308
356
  if (toolCalls?.length) {
309
357
  if (this.keepTextInToolUses !== true) {
310
358
  yield { delta: { json: { [outputKey]: "" } } };
311
359
  }
312
360
  else {
313
- yield { delta: { text: { [outputKey]: "\n" } } };
361
+ yield { delta: { text: { [outputKey]: "\n\n" } } };
314
362
  }
315
363
  const executedToolCalls = [];
316
364
  let error;
@@ -340,6 +388,20 @@ export class AIAgent extends Agent {
340
388
  const tool = toolsMap.get(call.function.name);
341
389
  if (!tool)
342
390
  throw new Error(`Tool not found: ${call.function.name}`);
391
+ yield {
392
+ progress: {
393
+ event: "message",
394
+ role: "agent",
395
+ message: [
396
+ {
397
+ type: "tool_use",
398
+ name: call.function.name,
399
+ input: call.function.arguments,
400
+ toolUseId: call.id,
401
+ },
402
+ ],
403
+ },
404
+ };
343
405
  queue.push({ tool, call });
344
406
  }
345
407
  await queue.drained();
@@ -347,6 +409,21 @@ export class AIAgent extends Agent {
347
409
  throw error;
348
410
  // Continue LLM function calling loop if any tools were executed
349
411
  if (executedToolCalls.length) {
412
+ for (const { call, output } of executedToolCalls) {
413
+ yield {
414
+ progress: {
415
+ event: "message",
416
+ role: "agent",
417
+ message: [
418
+ {
419
+ type: "tool_result",
420
+ toolUseId: call.id,
421
+ content: output,
422
+ },
423
+ ],
424
+ },
425
+ };
426
+ }
350
427
  const transferOutput = executedToolCalls.find((i) => isTransferAgentOutput(i.output))?.output;
351
428
  if (transferOutput)
352
429
  return transferOutput;
@@ -367,6 +444,11 @@ export class AIAgent extends Agent {
367
444
  if (!isEmpty(result)) {
368
445
  yield { delta: { json: result } };
369
446
  }
447
+ if (text) {
448
+ yield {
449
+ progress: { event: "message", role: "agent", message: [{ type: "text", content: text }] },
450
+ };
451
+ }
370
452
  return;
371
453
  }
372
454
  }
@@ -1,4 +1,4 @@
1
- import { type ZodObject, type ZodType } from "zod";
1
+ import z, { type ZodObject, type ZodType } from "zod";
2
2
  import { PromptBuilder } from "../prompt/prompt-builder.js";
3
3
  import { Agent, type AgentInvokeOptions, type AgentOptions, type Message } from "./agent.js";
4
4
  import { type ImageModelOutput } from "./image-model.js";
@@ -13,6 +13,22 @@ export declare const imageAgentOptionsSchema: ZodObject<{
13
13
  }>;
14
14
  export declare class ImageAgent<I extends Message = any, O extends ImageModelOutput = any> extends Agent<I, O> {
15
15
  tag: string;
16
+ static schema({ filepath }: {
17
+ filepath: string;
18
+ }): z.ZodObject<{
19
+ instructions: z.ZodType<import("../loader/schema.js").Instructions, z.ZodTypeDef, import("../loader/schema.js").Instructions>;
20
+ inputFileKey: z.ZodType<string | undefined, z.ZodTypeDef, string | undefined>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ instructions: import("../loader/schema.js").Instructions;
23
+ inputFileKey?: string | undefined;
24
+ }, {
25
+ instructions: import("../loader/schema.js").Instructions;
26
+ inputFileKey?: string | undefined;
27
+ }>;
28
+ static load<I extends Message = any, O extends Message = any>(options: {
29
+ filepath: string;
30
+ parsed: object;
31
+ }): Promise<Agent<I, O>>;
16
32
  static from<I extends Message = any, O extends ImageModelOutput = any>(options: ImageAgentOptions<I, O>): ImageAgent<I, O>;
17
33
  constructor(options: ImageAgentOptions<I, O>);
18
34
  instructions: PromptBuilder;
@@ -1,4 +1,5 @@
1
1
  import z from "zod";
2
+ import { camelizeSchema, getInstructionsSchema, instructionsToPromptBuilder, optionalize, } from "../loader/schema.js";
2
3
  import { PromptBuilder } from "../prompt/prompt-builder.js";
3
4
  import { checkArguments } from "../utils/type-utils.js";
4
5
  import { Agent, agentOptionsSchema, } from "./agent.js";
@@ -10,6 +11,21 @@ export const imageAgentOptionsSchema = agentOptionsSchema.extend({
10
11
  });
11
12
  export class ImageAgent extends Agent {
12
13
  tag = "ImageAgent";
14
+ static schema({ filepath }) {
15
+ const instructionsSchema = getInstructionsSchema({ filepath });
16
+ return camelizeSchema(z.object({
17
+ instructions: instructionsSchema,
18
+ inputFileKey: optionalize(z.string()),
19
+ }));
20
+ }
21
+ static async load(options) {
22
+ const valid = await ImageAgent.schema({ filepath: options.filepath }).parseAsync(options.parsed);
23
+ return new ImageAgent({
24
+ ...options.parsed,
25
+ ...valid,
26
+ instructions: instructionsToPromptBuilder(valid.instructions),
27
+ });
28
+ }
13
29
  static from(options) {
14
30
  return new ImageAgent(options);
15
31
  }