新增子 Agent 与技能系统管理:
All checks were successful
Deploy Noval to K3s / deploy (push) Successful in 54s

- **子 Agent 支持**:
  - 新增 `dispatch_subagent` 工具,支持分配特定任务给子 Agent,由其独立操作。
  - 前端新增 `ChatSubAgent` 组件,支持子 Agent 任务状态展示(运行中/已完成)、工具调用进度及输出预览等。

- **技能管理扩展**:
  - 新增 Skill 编辑器页面(`SkillEditorView.vue`),支持创建、编辑、删除技能。
  - 完善技能工具权限分组选择功能,按类型灵活分配工具。

- **工具增强**:
  - 新增工具接口:`get_outline_detail`、`get_character_detail`、`get_chapter_detail`,用于获取详情内容。
  - 优化部分工具返回数据,仅输出基础信息以减少上下文体积。

- 后端添加 `SPECIAL_TOOLS` 支持,增强 `dispatch_subagent` 的特殊处理能力。

同时优化部分前后端交互,提升代码维护性与可读性。
This commit is contained in:
2026-03-23 02:23:22 +08:00
parent b39377e487
commit 0525c8217e
12 changed files with 2028 additions and 209 deletions

View File

@@ -70,6 +70,25 @@ export interface PendingToolCallData {
arguments: Record<string, unknown>
}
export interface SubAgentStartInfo {
skill_id: number
skill_name: string
task: string
subagent_id: string
}
export interface SubAgentToolCallInfo {
name: string
label: string
arguments: Record<string, unknown>
}
export interface SubAgentToolResultInfo {
name: string
label: string
result: string
}
export interface StreamChatOptions {
messages: { role: string; content: string }[]
novelId?: number
@@ -87,6 +106,12 @@ export interface StreamChatOptions {
onToolCallsPending?: (calls: PendingToolCallData[], assistantText: string) => void
onToolCallsAuto?: (calls: PendingToolCallData[]) => void
onToolResult?: (info: ToolResultInfo) => void
// 子 Agent 回调subagentId 用于区分并行的多个子 Agent
onSubAgentStart?: (info: SubAgentStartInfo) => void
onSubAgentChunk?: (text: string, subagentId: string) => void
onSubAgentToolCall?: (info: SubAgentToolCallInfo, subagentId: string) => void
onSubAgentToolResult?: (info: SubAgentToolResultInfo, subagentId: string) => void
onSubAgentDone?: (result: string, subagentId: string) => void
signal?: AbortSignal
}
@@ -95,6 +120,7 @@ export async function streamChat(options: StreamChatOptions): Promise<void> {
messages, novelId, pageContext, toolsEnabled, autoApproveTools, skillId,
pendingToolCalls, assistantText,
onChunk, onError, onDone, onToolCallsPending, onToolCallsAuto, onToolResult,
onSubAgentStart, onSubAgentChunk, onSubAgentToolCall, onSubAgentToolResult, onSubAgentDone,
signal,
} = options
@@ -160,6 +186,22 @@ export async function streamChat(options: StreamChatOptions): Promise<void> {
if (event.tool_result && onToolResult) {
onToolResult(event.tool_result)
}
// 子 Agent 事件(所有事件携带 subagent_id 用于区分并行的子 Agent
if (event.subagent_start && onSubAgentStart) {
onSubAgentStart(event.subagent_start)
}
if (event.subagent_chunk && onSubAgentChunk) {
onSubAgentChunk(event.subagent_chunk, event.subagent_id ?? '')
}
if (event.subagent_tool_call && onSubAgentToolCall) {
onSubAgentToolCall(event.subagent_tool_call, event.subagent_id ?? '')
}
if (event.subagent_tool_result && onSubAgentToolResult) {
onSubAgentToolResult(event.subagent_tool_result, event.subagent_id ?? '')
}
if (event.subagent_done !== undefined && onSubAgentDone) {
onSubAgentDone(event.subagent_done, event.subagent_id ?? '')
}
} catch {
// 忽略解析错误
}