@aigne/core 1.14.0 → 1.16.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.
- package/CHANGELOG.md +27 -0
- package/README.md +9 -7
- package/README.zh.md +9 -7
- package/lib/cjs/agents/agent.d.ts +129 -6
- package/lib/cjs/agents/agent.js +112 -20
- package/lib/cjs/agents/ai-agent.d.ts +3 -2
- package/lib/cjs/agents/ai-agent.js +12 -9
- package/lib/{esm/models → cjs/agents}/chat-model.d.ts +24 -13
- package/lib/cjs/{models → agents}/chat-model.js +48 -7
- package/lib/cjs/agents/guide-rail-agent.d.ts +62 -0
- package/lib/cjs/agents/guide-rail-agent.js +14 -0
- package/lib/cjs/agents/mcp-agent.js +9 -9
- package/lib/cjs/agents/team-agent.js +1 -1
- package/lib/cjs/aigne/aigne.d.ts +3 -2
- package/lib/cjs/aigne/aigne.js +2 -2
- package/lib/cjs/aigne/context.d.ts +2 -1
- package/lib/cjs/aigne/context.js +8 -1
- package/lib/cjs/index.d.ts +1 -1
- package/lib/cjs/index.js +1 -1
- package/lib/cjs/loader/agent-yaml.d.ts +1 -1
- package/lib/cjs/loader/index.d.ts +18 -11
- package/lib/cjs/loader/index.js +8 -27
- package/lib/cjs/memory/retriever.d.ts +2 -2
- package/lib/cjs/prompt/prompt-builder.d.ts +3 -3
- package/lib/cjs/prompt/template.d.ts +3 -3
- package/lib/cjs/prompt/template.js +1 -1
- package/lib/cjs/utils/json-schema.js +1 -1
- package/lib/cjs/utils/logger.d.ts +33 -8
- package/lib/cjs/utils/logger.js +63 -5
- package/lib/cjs/utils/model-utils.d.ts +1 -1
- package/lib/cjs/utils/stream-utils.d.ts +3 -2
- package/lib/cjs/utils/stream-utils.js +50 -26
- package/lib/cjs/utils/type-utils.d.ts +5 -0
- package/lib/dts/agents/agent.d.ts +129 -6
- package/lib/dts/agents/ai-agent.d.ts +3 -2
- package/lib/{cjs/models → dts/agents}/chat-model.d.ts +24 -13
- package/lib/dts/agents/guide-rail-agent.d.ts +62 -0
- package/lib/dts/aigne/aigne.d.ts +3 -2
- package/lib/dts/aigne/context.d.ts +2 -1
- package/lib/dts/index.d.ts +1 -1
- package/lib/dts/loader/agent-yaml.d.ts +1 -1
- package/lib/dts/loader/index.d.ts +18 -11
- package/lib/dts/memory/retriever.d.ts +2 -2
- package/lib/dts/prompt/prompt-builder.d.ts +3 -3
- package/lib/dts/prompt/template.d.ts +3 -3
- package/lib/dts/utils/logger.d.ts +33 -8
- package/lib/dts/utils/model-utils.d.ts +1 -1
- package/lib/dts/utils/stream-utils.d.ts +3 -2
- package/lib/dts/utils/type-utils.d.ts +5 -0
- package/lib/esm/agents/agent.d.ts +129 -6
- package/lib/esm/agents/agent.js +112 -20
- package/lib/esm/agents/ai-agent.d.ts +3 -2
- package/lib/esm/agents/ai-agent.js +12 -9
- package/lib/{dts/models → esm/agents}/chat-model.d.ts +24 -13
- package/lib/esm/{models → agents}/chat-model.js +48 -7
- package/lib/esm/agents/guide-rail-agent.d.ts +62 -0
- package/lib/esm/agents/guide-rail-agent.js +11 -0
- package/lib/esm/agents/mcp-agent.js +9 -9
- package/lib/esm/agents/team-agent.js +2 -2
- package/lib/esm/aigne/aigne.d.ts +3 -2
- package/lib/esm/aigne/aigne.js +2 -2
- package/lib/esm/aigne/context.d.ts +2 -1
- package/lib/esm/aigne/context.js +9 -2
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/loader/agent-yaml.d.ts +1 -1
- package/lib/esm/loader/index.d.ts +18 -11
- package/lib/esm/loader/index.js +8 -27
- package/lib/esm/memory/retriever.d.ts +2 -2
- package/lib/esm/prompt/prompt-builder.d.ts +3 -3
- package/lib/esm/prompt/template.d.ts +3 -3
- package/lib/esm/prompt/template.js +1 -1
- package/lib/esm/utils/json-schema.js +1 -1
- package/lib/esm/utils/logger.d.ts +33 -8
- package/lib/esm/utils/logger.js +61 -4
- package/lib/esm/utils/model-utils.d.ts +1 -1
- package/lib/esm/utils/stream-utils.d.ts +3 -2
- package/lib/esm/utils/stream-utils.js +48 -25
- package/lib/esm/utils/type-utils.d.ts +5 -0
- package/package.json +1 -20
- package/lib/cjs/client/client.d.ts +0 -97
- package/lib/cjs/client/client.js +0 -87
- package/lib/cjs/client/index.d.ts +0 -1
- package/lib/cjs/client/index.js +0 -17
- package/lib/cjs/models/bedrock-chat-model.d.ts +0 -79
- package/lib/cjs/models/bedrock-chat-model.js +0 -303
- package/lib/cjs/models/claude-chat-model.d.ts +0 -114
- package/lib/cjs/models/claude-chat-model.js +0 -317
- package/lib/cjs/models/deepseek-chat-model.d.ts +0 -23
- package/lib/cjs/models/deepseek-chat-model.js +0 -35
- package/lib/cjs/models/gemini-chat-model.d.ts +0 -23
- package/lib/cjs/models/gemini-chat-model.js +0 -35
- package/lib/cjs/models/ollama-chat-model.d.ts +0 -22
- package/lib/cjs/models/ollama-chat-model.js +0 -34
- package/lib/cjs/models/open-router-chat-model.d.ts +0 -22
- package/lib/cjs/models/open-router-chat-model.js +0 -34
- package/lib/cjs/models/openai-chat-model.d.ts +0 -166
- package/lib/cjs/models/openai-chat-model.js +0 -415
- package/lib/cjs/models/xai-chat-model.d.ts +0 -21
- package/lib/cjs/models/xai-chat-model.js +0 -33
- package/lib/cjs/server/error.d.ts +0 -15
- package/lib/cjs/server/error.js +0 -22
- package/lib/cjs/server/index.d.ts +0 -2
- package/lib/cjs/server/index.js +0 -18
- package/lib/cjs/server/server.d.ts +0 -135
- package/lib/cjs/server/server.js +0 -188
- package/lib/dts/client/client.d.ts +0 -97
- package/lib/dts/client/index.d.ts +0 -1
- package/lib/dts/models/bedrock-chat-model.d.ts +0 -79
- package/lib/dts/models/claude-chat-model.d.ts +0 -114
- package/lib/dts/models/deepseek-chat-model.d.ts +0 -23
- package/lib/dts/models/gemini-chat-model.d.ts +0 -23
- package/lib/dts/models/ollama-chat-model.d.ts +0 -22
- package/lib/dts/models/open-router-chat-model.d.ts +0 -22
- package/lib/dts/models/openai-chat-model.d.ts +0 -166
- package/lib/dts/models/xai-chat-model.d.ts +0 -21
- package/lib/dts/server/error.d.ts +0 -15
- package/lib/dts/server/index.d.ts +0 -2
- package/lib/dts/server/server.d.ts +0 -135
- package/lib/esm/client/client.d.ts +0 -97
- package/lib/esm/client/client.js +0 -83
- package/lib/esm/client/index.d.ts +0 -1
- package/lib/esm/client/index.js +0 -1
- package/lib/esm/models/bedrock-chat-model.d.ts +0 -79
- package/lib/esm/models/bedrock-chat-model.js +0 -298
- package/lib/esm/models/claude-chat-model.d.ts +0 -114
- package/lib/esm/models/claude-chat-model.js +0 -310
- package/lib/esm/models/deepseek-chat-model.d.ts +0 -23
- package/lib/esm/models/deepseek-chat-model.js +0 -31
- package/lib/esm/models/gemini-chat-model.d.ts +0 -23
- package/lib/esm/models/gemini-chat-model.js +0 -31
- package/lib/esm/models/ollama-chat-model.d.ts +0 -22
- package/lib/esm/models/ollama-chat-model.js +0 -30
- package/lib/esm/models/open-router-chat-model.d.ts +0 -22
- package/lib/esm/models/open-router-chat-model.js +0 -30
- package/lib/esm/models/openai-chat-model.d.ts +0 -166
- package/lib/esm/models/openai-chat-model.js +0 -405
- package/lib/esm/models/xai-chat-model.d.ts +0 -21
- package/lib/esm/models/xai-chat-model.js +0 -29
- package/lib/esm/server/error.d.ts +0 -15
- package/lib/esm/server/error.js +0 -18
- package/lib/esm/server/index.d.ts +0 -2
- package/lib/esm/server/index.js +0 -2
- package/lib/esm/server/server.d.ts +0 -135
- package/lib/esm/server/server.js +0 -181
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { GetPromptResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
2
|
import { Agent, type Message } from "../agents/agent.js";
|
|
3
3
|
import type { AIAgent } from "../agents/ai-agent.js";
|
|
4
|
+
import type { ChatModel, ChatModelInput } from "../agents/chat-model.js";
|
|
4
5
|
import type { Context } from "../aigne/context.js";
|
|
5
6
|
import type { MemoryAgent } from "../memory/memory.js";
|
|
6
|
-
import type { ChatModel, ChatModelInput } from "../models/chat-model.js";
|
|
7
7
|
import { ChatMessagesTemplate } from "./template.js";
|
|
8
8
|
export declare const MESSAGE_KEY = "$message";
|
|
9
9
|
export declare function createMessage<I extends Message>(message: string | I): I;
|
|
@@ -11,7 +11,7 @@ export declare function getMessage(input: Message): string | undefined;
|
|
|
11
11
|
export interface PromptBuilderOptions {
|
|
12
12
|
instructions?: string | ChatMessagesTemplate;
|
|
13
13
|
}
|
|
14
|
-
export interface
|
|
14
|
+
export interface PromptBuildOptions {
|
|
15
15
|
memory?: MemoryAgent | MemoryAgent[];
|
|
16
16
|
context: Context;
|
|
17
17
|
agent?: AIAgent;
|
|
@@ -32,7 +32,7 @@ export declare class PromptBuilder {
|
|
|
32
32
|
private static fromMCPPromptResult;
|
|
33
33
|
constructor(options?: PromptBuilderOptions);
|
|
34
34
|
instructions?: string | ChatMessagesTemplate;
|
|
35
|
-
build(options:
|
|
35
|
+
build(options: PromptBuildOptions): Promise<ChatModelInput & {
|
|
36
36
|
toolAgents?: Agent[];
|
|
37
37
|
}>;
|
|
38
38
|
private buildMessages;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ChatModelInputMessage, ChatModelInputMessageContent, ChatModelOutputToolCall } from "../
|
|
1
|
+
import type { ChatModelInputMessage, ChatModelInputMessageContent, ChatModelOutputToolCall } from "../agents/chat-model.js";
|
|
2
2
|
export declare class PromptTemplate {
|
|
3
3
|
template: string;
|
|
4
4
|
static from(template: string): PromptTemplate;
|
|
@@ -24,7 +24,7 @@ export declare class AgentMessageTemplate extends ChatMessageTemplate {
|
|
|
24
24
|
constructor(content?: ChatModelInputMessage["content"], toolCalls?: ChatModelOutputToolCall[] | undefined, name?: string);
|
|
25
25
|
format(variables?: Record<string, unknown>): {
|
|
26
26
|
toolCalls: ChatModelOutputToolCall[] | undefined;
|
|
27
|
-
role: import("../
|
|
27
|
+
role: import("../agents/chat-model.js").Role;
|
|
28
28
|
content?: ChatModelInputMessageContent;
|
|
29
29
|
toolCallId?: string;
|
|
30
30
|
name?: string;
|
|
@@ -36,7 +36,7 @@ export declare class ToolMessageTemplate extends ChatMessageTemplate {
|
|
|
36
36
|
constructor(content: object | string, toolCallId: string, name?: string);
|
|
37
37
|
format(variables?: Record<string, unknown>): {
|
|
38
38
|
toolCallId: string;
|
|
39
|
-
role: import("../
|
|
39
|
+
role: import("../agents/chat-model.js").Role;
|
|
40
40
|
content?: ChatModelInputMessageContent;
|
|
41
41
|
toolCalls?: {
|
|
42
42
|
id: string;
|
|
@@ -92,7 +92,7 @@ class ToolMessageTemplate extends ChatMessageTemplate {
|
|
|
92
92
|
constructor(content, toolCallId, name) {
|
|
93
93
|
super("tool", typeof content === "string"
|
|
94
94
|
? content
|
|
95
|
-
: (0, type_utils_js_1.tryOrThrow)(() => JSON.stringify(content), `Failed to stringify tool content. toolCallId: ${toolCallId}, content: ${(0, node_util_1.inspect)(content)}`), name);
|
|
95
|
+
: (0, type_utils_js_1.tryOrThrow)(() => JSON.stringify(content, (_, value) => typeof value === "bigint" ? value.toString() : value), `Failed to stringify tool content. toolCallId: ${toolCallId}, content: ${(0, node_util_1.inspect)(content)}`), name);
|
|
96
96
|
this.toolCallId = toolCallId;
|
|
97
97
|
}
|
|
98
98
|
format(variables) {
|
|
@@ -1,8 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
export declare enum LogLevel {
|
|
2
|
+
ERROR = "error",
|
|
3
|
+
WARN = "warn",
|
|
4
|
+
INFO = "info",
|
|
5
|
+
DEBUG = "debug"
|
|
6
|
+
}
|
|
7
|
+
export declare class Logger {
|
|
8
|
+
constructor(options: {
|
|
9
|
+
level: LogLevel;
|
|
10
|
+
ns: string;
|
|
11
|
+
});
|
|
12
|
+
level: LogLevel;
|
|
13
|
+
private debugLogger;
|
|
14
|
+
private infoLogger;
|
|
15
|
+
private warnLogger;
|
|
16
|
+
private errorLogger;
|
|
17
|
+
logMessage: {
|
|
18
|
+
(...data: any[]): void;
|
|
19
|
+
(...data: any[]): void;
|
|
20
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
21
|
+
};
|
|
22
|
+
logError: {
|
|
23
|
+
(...data: any[]): void;
|
|
24
|
+
(...data: any[]): void;
|
|
25
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
26
|
+
};
|
|
27
|
+
debug(message: string, ...args: unknown[]): void;
|
|
28
|
+
info(message: string, ...args: unknown[]): void;
|
|
29
|
+
warn(message: string, ...args: unknown[]): void;
|
|
30
|
+
error(message: string, ...args: unknown[]): void;
|
|
31
|
+
enabled(level: LogLevel): boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare const logger: Logger;
|
package/lib/cjs/utils/logger.js
CHANGED
|
@@ -3,10 +3,68 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.logger = void 0;
|
|
6
|
+
exports.logger = exports.Logger = exports.LogLevel = void 0;
|
|
7
|
+
const node_tty_1 = require("node:tty");
|
|
7
8
|
const debug_1 = __importDefault(require("debug"));
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
var LogLevel;
|
|
10
|
+
(function (LogLevel) {
|
|
11
|
+
LogLevel["ERROR"] = "error";
|
|
12
|
+
LogLevel["WARN"] = "warn";
|
|
13
|
+
LogLevel["INFO"] = "info";
|
|
14
|
+
LogLevel["DEBUG"] = "debug";
|
|
15
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
16
|
+
const levels = Object.values(LogLevel);
|
|
17
|
+
class Logger {
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.level = options.level;
|
|
20
|
+
this.debugLogger = (0, debug_1.default)(`${options.ns}:debug`);
|
|
21
|
+
this.infoLogger = (0, debug_1.default)(`${options.ns}:info`);
|
|
22
|
+
this.warnLogger = (0, debug_1.default)(`${options.ns}:warn`);
|
|
23
|
+
this.errorLogger = (0, debug_1.default)(`${options.ns}:error`);
|
|
24
|
+
for (const logger of [this.debugLogger, this.infoLogger, this.warnLogger]) {
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
logger.useColors = (0, node_tty_1.isatty)(process.stdout.fd);
|
|
27
|
+
logger.enabled = true;
|
|
28
|
+
logger.log = (...args) => this.logMessage(...args);
|
|
29
|
+
}
|
|
30
|
+
this.errorLogger.log = (...args) => this.logError(...args);
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
this.errorLogger.useColors = (0, node_tty_1.isatty)(process.stderr.fd);
|
|
33
|
+
this.errorLogger.enabled = true;
|
|
34
|
+
}
|
|
35
|
+
level;
|
|
36
|
+
debugLogger;
|
|
37
|
+
infoLogger;
|
|
38
|
+
warnLogger;
|
|
39
|
+
errorLogger;
|
|
40
|
+
logMessage = console.log;
|
|
41
|
+
logError = console.error;
|
|
42
|
+
debug(message, ...args) {
|
|
43
|
+
if (this.enabled(LogLevel.DEBUG)) {
|
|
44
|
+
this.debugLogger(message, ...args);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
info(message, ...args) {
|
|
48
|
+
if (this.enabled(LogLevel.INFO)) {
|
|
49
|
+
this.infoLogger(message, ...args);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
warn(message, ...args) {
|
|
53
|
+
if (this.enabled(LogLevel.WARN)) {
|
|
54
|
+
this.warnLogger(message, ...args);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
error(message, ...args) {
|
|
58
|
+
if (this.enabled(LogLevel.ERROR)) {
|
|
59
|
+
this.errorLogger(message, ...args);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
enabled(level) {
|
|
63
|
+
return levels.indexOf(this.level) >= levels.indexOf(level);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.Logger = Logger;
|
|
67
|
+
exports.logger = new Logger({
|
|
68
|
+
ns: "aigne:core",
|
|
69
|
+
level: LogLevel.INFO,
|
|
12
70
|
});
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ChatModelOutputUsage } from "../
|
|
1
|
+
import type { ChatModelOutputUsage } from "../agents/chat-model.js";
|
|
2
2
|
import type { Nullish } from "./type-utils.js";
|
|
3
3
|
export declare function mergeUsage(...usages: Nullish<ChatModelOutputUsage>[]): ChatModelOutputUsage;
|
|
@@ -6,7 +6,7 @@ export declare function mergeAgentResponseChunk<T extends Message>(output: T, ch
|
|
|
6
6
|
export declare function agentResponseStreamToObject<T extends Message>(stream: AgentResponseStream<T> | AgentProcessAsyncGenerator<T>): Promise<T>;
|
|
7
7
|
export declare function asyncGeneratorToReadableStream<T extends Message>(generator: AgentProcessAsyncGenerator<T>): AgentResponseStream<T>;
|
|
8
8
|
export declare function onAgentResponseStreamEnd<T extends Message>(stream: AgentResponseStream<T>, callback: (result: T) => PromiseOrValue<Partial<T> | void>, options?: {
|
|
9
|
-
errorCallback?: (error: Error) => Error
|
|
9
|
+
errorCallback?: (error: Error) => PromiseOrValue<Error>;
|
|
10
10
|
processChunk?: (chunk: AgentResponseChunk<T>) => AgentResponseChunk<T>;
|
|
11
11
|
}): ReadableStream<any>;
|
|
12
12
|
export declare function isAsyncGenerator<T extends AsyncGenerator>(value: AsyncGenerator | unknown): value is T;
|
|
@@ -18,5 +18,6 @@ export declare function readableStreamToArray<T>(stream: ReadableStream<T>, opti
|
|
|
18
18
|
export declare function readableStreamToArray<T>(stream: ReadableStream<T>, options?: {
|
|
19
19
|
catchError?: false;
|
|
20
20
|
}): Promise<T[]>;
|
|
21
|
-
export declare function readableStreamToAsyncIterator<T>(stream: ReadableStream<T>): AsyncIterable<T>;
|
|
22
21
|
export declare function stringToAgentResponseStream(str: string, key?: "text" | typeof MESSAGE_KEY | string): AgentResponseStream<Message>;
|
|
22
|
+
export declare function toReadableStream(stream: NodeJS.ReadStream): ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
23
|
+
export declare function readAllString(stream: NodeJS.ReadStream | ReadableStream): Promise<string>;
|
|
@@ -12,8 +12,9 @@ exports.isAsyncGenerator = isAsyncGenerator;
|
|
|
12
12
|
exports.arrayToAgentProcessAsyncGenerator = arrayToAgentProcessAsyncGenerator;
|
|
13
13
|
exports.arrayToReadableStream = arrayToReadableStream;
|
|
14
14
|
exports.readableStreamToArray = readableStreamToArray;
|
|
15
|
-
exports.readableStreamToAsyncIterator = readableStreamToAsyncIterator;
|
|
16
15
|
exports.stringToAgentResponseStream = stringToAgentResponseStream;
|
|
16
|
+
exports.toReadableStream = toReadableStream;
|
|
17
|
+
exports.readAllString = readAllString;
|
|
17
18
|
const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
|
|
18
19
|
const agent_js_1 = require("../agents/agent.js");
|
|
19
20
|
const type_utils_js_1 = require("./type-utils.js");
|
|
@@ -42,7 +43,7 @@ function mergeAgentResponseChunk(output, chunk) {
|
|
|
42
43
|
async function agentResponseStreamToObject(stream) {
|
|
43
44
|
const json = {};
|
|
44
45
|
if (stream instanceof ReadableStream) {
|
|
45
|
-
for await (const value of
|
|
46
|
+
for await (const value of stream) {
|
|
46
47
|
mergeAgentResponseChunk(json, value);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
@@ -92,25 +93,29 @@ function onAgentResponseStreamEnd(stream, callback, options) {
|
|
|
92
93
|
return new ReadableStream({
|
|
93
94
|
async pull(controller) {
|
|
94
95
|
try {
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
while (true) {
|
|
97
|
+
const { value, done } = await reader.read();
|
|
98
|
+
if (done) {
|
|
99
|
+
const result = await callback(json);
|
|
100
|
+
if (result && !(0, fast_deep_equal_1.default)(result, json)) {
|
|
101
|
+
let chunk = { delta: { json: result } };
|
|
102
|
+
if (options?.processChunk)
|
|
103
|
+
chunk = options.processChunk(chunk);
|
|
104
|
+
controller.enqueue(chunk);
|
|
105
|
+
}
|
|
106
|
+
controller.close();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
mergeAgentResponseChunk(json, value);
|
|
97
110
|
const chunk = options?.processChunk ? options.processChunk(value) : value;
|
|
98
|
-
if (!(0, agent_js_1.isEmptyChunk)(chunk))
|
|
111
|
+
if (!(0, agent_js_1.isEmptyChunk)(chunk)) {
|
|
99
112
|
controller.enqueue(chunk);
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
const result = await callback(json);
|
|
104
|
-
if (result && !(0, fast_deep_equal_1.default)(result, json)) {
|
|
105
|
-
let chunk = { delta: { json: result } };
|
|
106
|
-
if (options?.processChunk)
|
|
107
|
-
chunk = options.processChunk(chunk);
|
|
108
|
-
controller.enqueue(chunk);
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
109
115
|
}
|
|
110
|
-
controller.close();
|
|
111
116
|
}
|
|
112
117
|
catch (error) {
|
|
113
|
-
controller.error(options?.errorCallback?.(error) ?? error);
|
|
118
|
+
controller.error((await options?.errorCallback?.(error)) ?? error);
|
|
114
119
|
}
|
|
115
120
|
},
|
|
116
121
|
});
|
|
@@ -147,7 +152,7 @@ function arrayToReadableStream(chunks) {
|
|
|
147
152
|
async function readableStreamToArray(stream, options) {
|
|
148
153
|
const result = [];
|
|
149
154
|
try {
|
|
150
|
-
for await (const value of
|
|
155
|
+
for await (const value of stream) {
|
|
151
156
|
result.push(value);
|
|
152
157
|
}
|
|
153
158
|
}
|
|
@@ -158,17 +163,36 @@ async function readableStreamToArray(stream, options) {
|
|
|
158
163
|
}
|
|
159
164
|
return result;
|
|
160
165
|
}
|
|
161
|
-
async function* readableStreamToAsyncIterator(stream) {
|
|
162
|
-
const reader = stream.getReader();
|
|
163
|
-
while (true) {
|
|
164
|
-
const { value, done } = await reader.read();
|
|
165
|
-
if (done)
|
|
166
|
-
break;
|
|
167
|
-
yield value;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
166
|
function stringToAgentResponseStream(str, key = "text") {
|
|
171
167
|
const segmenter = new Intl.Segmenter(undefined, { granularity: "word" });
|
|
172
168
|
const segments = segmenter.segment(str);
|
|
173
169
|
return arrayToReadableStream(Array.from(segments).map((segment) => ({ delta: { text: { [key]: segment.segment } } })));
|
|
174
170
|
}
|
|
171
|
+
function toReadableStream(stream) {
|
|
172
|
+
return new ReadableStream({
|
|
173
|
+
start(controller) {
|
|
174
|
+
const onData = (chunk) => {
|
|
175
|
+
controller.enqueue(new Uint8Array(chunk));
|
|
176
|
+
};
|
|
177
|
+
const onEnd = () => {
|
|
178
|
+
cleanup();
|
|
179
|
+
controller.close();
|
|
180
|
+
};
|
|
181
|
+
const onError = (err) => {
|
|
182
|
+
cleanup();
|
|
183
|
+
controller.error(err);
|
|
184
|
+
};
|
|
185
|
+
function cleanup() {
|
|
186
|
+
stream.off("data", onData);
|
|
187
|
+
stream.off("end", onEnd);
|
|
188
|
+
stream.off("error", onError);
|
|
189
|
+
}
|
|
190
|
+
stream.on("data", onData);
|
|
191
|
+
stream.on("end", onEnd);
|
|
192
|
+
stream.on("error", onError);
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
async function readAllString(stream) {
|
|
197
|
+
return (await readableStreamToArray((stream instanceof ReadableStream ? stream : toReadableStream(stream)).pipeThrough(new TextDecoderStream()))).join("");
|
|
198
|
+
}
|
|
@@ -2,6 +2,11 @@ import { type ZodType } from "zod";
|
|
|
2
2
|
export type PromiseOrValue<T> = T | Promise<T>;
|
|
3
3
|
export type Nullish<T> = T | null | undefined | void;
|
|
4
4
|
export type OmitPropertiesFromArrayFirstElement<T extends unknown[], K extends string | number | symbol> = T extends [infer U, ...infer Rest] ? [Omit<U, K>, ...Rest] : never;
|
|
5
|
+
export type XOr<T, K extends keyof T, O extends keyof T> = (Omit<T, O> & {
|
|
6
|
+
[key in O]?: undefined;
|
|
7
|
+
}) | (Omit<T, K> & {
|
|
8
|
+
[key in K]?: undefined;
|
|
9
|
+
});
|
|
5
10
|
export declare function isNil(value: unknown): value is null | undefined;
|
|
6
11
|
export declare function isRecord<T>(value: unknown): value is Record<string, T>;
|
|
7
12
|
export declare function isEmpty(obj: unknown): boolean;
|
|
@@ -3,7 +3,8 @@ import { ZodObject, type ZodType } from "zod";
|
|
|
3
3
|
import type { Context } from "../aigne/context.js";
|
|
4
4
|
import type { MessagePayload } from "../aigne/message-queue.js";
|
|
5
5
|
import type { MemoryAgent } from "../memory/memory.js";
|
|
6
|
-
import { type Nullish, type PromiseOrValue } from "../utils/type-utils.js";
|
|
6
|
+
import { type Nullish, type PromiseOrValue, type XOr } from "../utils/type-utils.js";
|
|
7
|
+
import type { GuideRailAgent, GuideRailAgentOutput } from "./guide-rail-agent.js";
|
|
7
8
|
import { type TransferAgentOutput } from "./types.js";
|
|
8
9
|
export * from "./types.js";
|
|
9
10
|
/**
|
|
@@ -29,7 +30,7 @@ export type PublishTopic<O extends Message> = string | string[] | ((output: O) =
|
|
|
29
30
|
* @template I The agent input message type
|
|
30
31
|
* @template O The agent output message type
|
|
31
32
|
*/
|
|
32
|
-
export interface AgentOptions<I extends Message = Message, O extends Message = Message> {
|
|
33
|
+
export interface AgentOptions<I extends Message = Message, O extends Message = Message> extends Partial<Pick<Agent, "guideRails" | "hooks">> {
|
|
33
34
|
/**
|
|
34
35
|
* Topics the agent should subscribe to
|
|
35
36
|
*
|
|
@@ -139,6 +140,35 @@ export declare abstract class Agent<I extends Message = Message, O extends Messa
|
|
|
139
140
|
* List of memories this agent can use
|
|
140
141
|
*/
|
|
141
142
|
readonly memories: MemoryAgent[];
|
|
143
|
+
/**
|
|
144
|
+
* Lifecycle hooks for agent processing.
|
|
145
|
+
*
|
|
146
|
+
* Hooks enable tracing, logging, monitoring, and custom behavior
|
|
147
|
+
* without modifying the core agent implementation
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* Here's an example of using hooks:
|
|
151
|
+
* {@includeCode ../../test/agents/agent.test.ts#example-agent-hooks}
|
|
152
|
+
*/
|
|
153
|
+
readonly hooks: AgentHooks;
|
|
154
|
+
/**
|
|
155
|
+
* List of GuideRail agents applied to this agent
|
|
156
|
+
*
|
|
157
|
+
* GuideRail agents validate, transform, or control the message flow by:
|
|
158
|
+
* - Enforcing rules and safety policies
|
|
159
|
+
* - Validating inputs/outputs against specific criteria
|
|
160
|
+
* - Implementing business logic validations
|
|
161
|
+
* - Monitoring and auditing agent behavior
|
|
162
|
+
*
|
|
163
|
+
* Each GuideRail agent can examine both input and expected output,
|
|
164
|
+
* and has the ability to abort the process with an explanation
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* Here's an example of using GuideRail agents:
|
|
168
|
+
*
|
|
169
|
+
* {@includeCode ../../test/agents/agent.test.ts#example-agent-guide-rails}
|
|
170
|
+
*/
|
|
171
|
+
readonly guideRails?: GuideRailAgent[];
|
|
142
172
|
/**
|
|
143
173
|
* Name of the agent, used for identification and logging
|
|
144
174
|
*
|
|
@@ -301,6 +331,7 @@ export declare abstract class Agent<I extends Message = Message, O extends Messa
|
|
|
301
331
|
* @returns Agent response (streaming or regular)
|
|
302
332
|
*/
|
|
303
333
|
invoke(input: I | string, context?: Context, options?: AgentInvokeOptions): Promise<AgentResponse<O>>;
|
|
334
|
+
protected invokeSkill<I extends Message, O extends Message>(skill: Agent<I, O>, input: I, context: Context): Promise<O>;
|
|
304
335
|
/**
|
|
305
336
|
* Process agent output
|
|
306
337
|
*
|
|
@@ -319,7 +350,6 @@ export declare abstract class Agent<I extends Message = Message, O extends Messa
|
|
|
319
350
|
*
|
|
320
351
|
* @param error Caught error
|
|
321
352
|
* @param context Execution context
|
|
322
|
-
* @throws Always throws the received error
|
|
323
353
|
*/
|
|
324
354
|
private processAgentError;
|
|
325
355
|
/**
|
|
@@ -342,7 +372,25 @@ export declare abstract class Agent<I extends Message = Message, O extends Messa
|
|
|
342
372
|
* @param _ Input message (unused)
|
|
343
373
|
* @param context Execution context
|
|
344
374
|
*/
|
|
345
|
-
protected preprocess(_: I, context: Context): void
|
|
375
|
+
protected preprocess(_: I, context: Context): PromiseOrValue<void>;
|
|
376
|
+
private checkResponseByGuideRails;
|
|
377
|
+
private runGuideRails;
|
|
378
|
+
/**
|
|
379
|
+
* Handle errors detected by GuideRail agents
|
|
380
|
+
*
|
|
381
|
+
* This method is called when a GuideRail agent aborts the process, providing
|
|
382
|
+
* a way for agents to customize error handling behavior. By default, it simply
|
|
383
|
+
* returns the original error, but subclasses can override this method to:
|
|
384
|
+
* - Transform the error into a more specific response
|
|
385
|
+
* - Apply recovery strategies
|
|
386
|
+
* - Log or report the error in a custom format
|
|
387
|
+
* - Return a fallback output instead of an error
|
|
388
|
+
*
|
|
389
|
+
* @param error The GuideRail agent output containing abort=true and a reason
|
|
390
|
+
* @returns Either the original/modified error or a substitute output object
|
|
391
|
+
* which will be tagged with $status: "GuideRailError"
|
|
392
|
+
*/
|
|
393
|
+
protected onGuideRailError(error: GuideRailAgentOutput): Promise<O | GuideRailAgentOutput>;
|
|
346
394
|
/**
|
|
347
395
|
* Post-processing operations after handling output
|
|
348
396
|
*
|
|
@@ -354,7 +402,7 @@ export declare abstract class Agent<I extends Message = Message, O extends Messa
|
|
|
354
402
|
* @param output Output message
|
|
355
403
|
* @param context Execution context
|
|
356
404
|
*/
|
|
357
|
-
protected postprocess(input: I, output: O, context: Context): void
|
|
405
|
+
protected postprocess(input: I, output: O, context: Context): PromiseOrValue<void>;
|
|
358
406
|
protected publishToTopics(output: Message, context: Context): Promise<void>;
|
|
359
407
|
/**
|
|
360
408
|
* Core processing method of the agent, must be implemented in subclasses
|
|
@@ -419,6 +467,81 @@ export declare abstract class Agent<I extends Message = Message, O extends Messa
|
|
|
419
467
|
*/
|
|
420
468
|
[Symbol.asyncDispose](): Promise<void>;
|
|
421
469
|
}
|
|
470
|
+
/**
|
|
471
|
+
* Lifecycle hooks for agent execution
|
|
472
|
+
*
|
|
473
|
+
* Hooks provide a way to intercept and extend agent behavior at key points during
|
|
474
|
+
* the agent's lifecycle, enabling custom functionality like logging, monitoring,
|
|
475
|
+
* tracing, error handling, and more.
|
|
476
|
+
*/
|
|
477
|
+
export interface AgentHooks<I extends Message = Message, O extends Message = Message> {
|
|
478
|
+
/**
|
|
479
|
+
* Called when agent processing begins
|
|
480
|
+
*
|
|
481
|
+
* This hook runs before the agent processes input, allowing for
|
|
482
|
+
* setup operations, logging, or input transformations.
|
|
483
|
+
*
|
|
484
|
+
* @param event Object containing the input message
|
|
485
|
+
*/
|
|
486
|
+
onStart?: (event: {
|
|
487
|
+
input: I;
|
|
488
|
+
}) => PromiseOrValue<void>;
|
|
489
|
+
/**
|
|
490
|
+
* Called when agent processing completes or fails
|
|
491
|
+
*
|
|
492
|
+
* This hook runs after processing finishes, receiving either the output
|
|
493
|
+
* or an error if processing failed. Useful for cleanup operations,
|
|
494
|
+
* logging results, or error handling.
|
|
495
|
+
*
|
|
496
|
+
* @param event Object containing the input message and either output or error
|
|
497
|
+
*/
|
|
498
|
+
onEnd?: (event: XOr<{
|
|
499
|
+
input: I;
|
|
500
|
+
output: O;
|
|
501
|
+
error: Error;
|
|
502
|
+
}, "output", "error">) => PromiseOrValue<void>;
|
|
503
|
+
/**
|
|
504
|
+
* Called before a skill (sub-agent) is invoked
|
|
505
|
+
*
|
|
506
|
+
* This hook runs when the agent delegates work to a skill,
|
|
507
|
+
* allowing for tracking skill usage or transforming input to the skill.
|
|
508
|
+
*
|
|
509
|
+
* @param event Object containing the skill being used and input message
|
|
510
|
+
*/
|
|
511
|
+
onSkillStart?: (event: {
|
|
512
|
+
skill: Agent;
|
|
513
|
+
input: I;
|
|
514
|
+
}) => PromiseOrValue<void>;
|
|
515
|
+
/**
|
|
516
|
+
* Called after a skill (sub-agent) completes or fails
|
|
517
|
+
*
|
|
518
|
+
* This hook runs when a skill finishes execution, receiving either the output
|
|
519
|
+
* or an error if the skill failed. Useful for monitoring skill performance
|
|
520
|
+
* or handling skill-specific errors.
|
|
521
|
+
*
|
|
522
|
+
* @param event Object containing the skill used, input message, and either output or error
|
|
523
|
+
*/
|
|
524
|
+
onSkillEnd?: (event: XOr<{
|
|
525
|
+
skill: Agent;
|
|
526
|
+
input: I;
|
|
527
|
+
output: O;
|
|
528
|
+
error: Error;
|
|
529
|
+
}, "output", "error">) => PromiseOrValue<void>;
|
|
530
|
+
/**
|
|
531
|
+
* Called when an agent hands off processing to another agent
|
|
532
|
+
*
|
|
533
|
+
* This hook runs when a source agent transfers control to a target agent,
|
|
534
|
+
* allowing for tracking of handoffs between agents and monitoring the flow
|
|
535
|
+
* of processing in multi-agent systems.
|
|
536
|
+
*
|
|
537
|
+
* @param event Object containing the source agent, target agent, and input message
|
|
538
|
+
*/
|
|
539
|
+
onHandoff?: (event: {
|
|
540
|
+
source: Agent;
|
|
541
|
+
target: Agent;
|
|
542
|
+
input: I;
|
|
543
|
+
}) => PromiseOrValue<void>;
|
|
544
|
+
}
|
|
422
545
|
/**
|
|
423
546
|
* Response type for an agent, can be:
|
|
424
547
|
* - Direct response object
|
|
@@ -427,7 +550,7 @@ export declare abstract class Agent<I extends Message = Message, O extends Messa
|
|
|
427
550
|
*
|
|
428
551
|
* @template T Response data type
|
|
429
552
|
*/
|
|
430
|
-
export type AgentResponse<T> = T | TransferAgentOutput |
|
|
553
|
+
export type AgentResponse<T> = T | AgentResponseStream<T> | TransferAgentOutput | GuideRailAgentOutput;
|
|
431
554
|
/**
|
|
432
555
|
* Streaming response type for an agent
|
|
433
556
|
*
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type ZodObject, type ZodType, z } from "zod";
|
|
2
2
|
import type { Context } from "../aigne/context.js";
|
|
3
3
|
import { type DefaultMemoryOptions } from "../memory/default-memory.js";
|
|
4
|
-
import { ChatModel } from "../models/chat-model.js";
|
|
5
|
-
import type { ChatModelInput } from "../models/chat-model.js";
|
|
6
4
|
import { PromptBuilder } from "../prompt/prompt-builder.js";
|
|
7
5
|
import { Agent, type AgentOptions, type AgentProcessAsyncGenerator, type Message } from "./agent.js";
|
|
6
|
+
import { ChatModel, type ChatModelInput } from "./chat-model.js";
|
|
7
|
+
import type { GuideRailAgentOutput } from "./guide-rail-agent.js";
|
|
8
8
|
/**
|
|
9
9
|
* Configuration options for an AI Agent
|
|
10
10
|
*
|
|
@@ -216,6 +216,7 @@ export declare class AIAgent<I extends Message = Message, O extends Message = Me
|
|
|
216
216
|
* @protected
|
|
217
217
|
*/
|
|
218
218
|
process(input: I, context: Context): AgentProcessAsyncGenerator<O>;
|
|
219
|
+
protected onGuideRailError(error: GuideRailAgentOutput): Promise<O | GuideRailAgentOutput>;
|
|
219
220
|
/**
|
|
220
221
|
* Process router mode requests
|
|
221
222
|
*
|