feat(agent): add profile system and improve tools
- Add Agent Profile module for managing agent identity, soul, tools, memory, and bootstrap configuration - Add profile CLI (pnpm agent:profile) for creating/listing/showing profiles - Default sessionId to UUIDv7 instead of "default" - Expose Agent.sessionId as public readonly property - Improve exec/process tools error handling (no more crashes on spawn errors) - Add 'output' action to process tool for reading stdout/stderr - Better tool descriptions to guide agent in choosing exec vs process Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
46a6cb3061
commit
200b2cefda
15 changed files with 740 additions and 58 deletions
|
|
@ -1,13 +1,19 @@
|
|||
import { Agent as PiAgentCore, type AgentEvent, type AgentMessage } from "@mariozechner/pi-agent-core";
|
||||
import { v7 as uuidv7 } from "uuid";
|
||||
import type { AgentOptions, AgentRunResult } from "./types.js";
|
||||
import { createAgentOutput } from "./output.js";
|
||||
import { resolveModel, resolveTools } from "./tools.js";
|
||||
import { SessionManager } from "./session/session-manager.js";
|
||||
import { ProfileManager } from "./profile/index.js";
|
||||
|
||||
export class Agent {
|
||||
private readonly agent: PiAgentCore;
|
||||
private readonly output;
|
||||
private readonly session: SessionManager;
|
||||
private readonly profile?: ProfileManager;
|
||||
|
||||
/** 当前会话 ID */
|
||||
readonly sessionId: string;
|
||||
|
||||
constructor(options: AgentOptions = {}) {
|
||||
const stdout = options.logger?.stdout ?? process.stdout;
|
||||
|
|
@ -15,10 +21,24 @@ export class Agent {
|
|||
this.output = createAgentOutput({ stdout, stderr });
|
||||
|
||||
this.agent = new PiAgentCore();
|
||||
if (options.systemPrompt) this.agent.setSystemPrompt(options.systemPrompt);
|
||||
|
||||
const sessionId = options.sessionId ?? "default";
|
||||
this.session = new SessionManager({ sessionId });
|
||||
// 加载 Agent Profile(如果指定了 profileId)
|
||||
if (options.profileId) {
|
||||
this.profile = new ProfileManager({
|
||||
profileId: options.profileId,
|
||||
baseDir: options.profileBaseDir,
|
||||
});
|
||||
const systemPrompt = this.profile.buildSystemPrompt();
|
||||
if (systemPrompt) {
|
||||
this.agent.setSystemPrompt(systemPrompt);
|
||||
}
|
||||
} else if (options.systemPrompt) {
|
||||
// 直接使用传入的 systemPrompt
|
||||
this.agent.setSystemPrompt(options.systemPrompt);
|
||||
}
|
||||
|
||||
this.sessionId = options.sessionId ?? uuidv7();
|
||||
this.session = new SessionManager({ sessionId: this.sessionId });
|
||||
const storedMeta = this.session.getMeta();
|
||||
if (!options.thinkingLevel && storedMeta?.thinkingLevel) {
|
||||
this.agent.setThinkingLevel(storedMeta.thinkingLevel as any);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue