93 lines
2.3 KiB
TypeScript
93 lines
2.3 KiB
TypeScript
import * as readline from "readline";
|
|
import { weatherAgent } from "@/mastra/agents";
|
|
import { MastraAgent } from "@ag-ui/mastra";
|
|
import { randomUUID } from "node:crypto";
|
|
|
|
const rl = readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
});
|
|
|
|
async function chatLoop() {
|
|
console.log(
|
|
"🤖 AG-UI chat started! Type your messages and press Enter. Press Ctrl+D to quit.\n",
|
|
);
|
|
|
|
const agent = new MastraAgent({
|
|
agent: weatherAgent,
|
|
});
|
|
|
|
return new Promise<void>((resolve) => {
|
|
const promptUser = () => {
|
|
rl.question("> ", async (input) => {
|
|
if (input.trim() === "") {
|
|
promptUser();
|
|
return;
|
|
}
|
|
console.log("");
|
|
|
|
rl.pause();
|
|
|
|
agent.messages.push({
|
|
id: randomUUID(),
|
|
role: "user",
|
|
content: input.trim(),
|
|
});
|
|
|
|
try {
|
|
await agent.runAgent(
|
|
{},
|
|
{
|
|
onTextMessageStartEvent() {
|
|
process.stdout.write("🤖 AG-UI assistant: ");
|
|
},
|
|
onTextMessageContentEvent({ event }) {
|
|
process.stdout.write(event.delta);
|
|
},
|
|
onTextMessageEndEvent() {
|
|
console.log("\n");
|
|
},
|
|
onToolCallStartEvent({ event }) {
|
|
console.log("🔧 Tool call:", event.toolCallName);
|
|
},
|
|
onToolCallArgsEvent({ event }) {
|
|
process.stdout.write(event.delta);
|
|
},
|
|
onToolCallEndEvent() {
|
|
console.log("");
|
|
},
|
|
onToolCallResultEvent({ event }) {
|
|
if (event.content) {
|
|
console.log("\n🔍 Tool call result:", event.content);
|
|
}
|
|
},
|
|
// new in step 2
|
|
onStateSnapshotEvent({ event }) {
|
|
console.log("\n🔍 State snapshot:", event.snapshot);
|
|
},
|
|
},
|
|
);
|
|
} catch (error) {
|
|
console.error("❌ Error running agent:", error);
|
|
}
|
|
|
|
rl.resume();
|
|
promptUser();
|
|
});
|
|
};
|
|
|
|
rl.on("close", () => {
|
|
console.log("\n👋 Goodbye!");
|
|
resolve();
|
|
});
|
|
|
|
promptUser();
|
|
});
|
|
}
|
|
|
|
async function main() {
|
|
await chatLoop();
|
|
}
|
|
|
|
main().catch(console.error);
|