引入二级大纲功能,新增父子节点关系及子节点排序,同时调整API与UI以支持嵌套大纲管理

This commit is contained in:
2026-03-22 16:53:33 +08:00
parent 20c759150a
commit 098ff4e16d
33 changed files with 2516 additions and 381 deletions

View File

@@ -33,6 +33,22 @@ export async function clearMessages(novelId?: number): Promise<void> {
await http.delete('/chat/messages', { params })
}
export interface CompressResult {
compressed: boolean
reason?: string
error?: string
removed_count?: number
kept_count?: number
summary_length?: number
}
export async function compressContext(novelId?: number): Promise<CompressResult> {
const params: Record<string, unknown> = {}
if (novelId !== undefined) params.novel_id = novelId
const { data } = await http.post<CompressResult>('/chat/compress', null, { params })
return data
}
// ── 流式聊天 ──
export interface TokenUsage {
@@ -59,6 +75,7 @@ export interface StreamChatOptions {
novelId?: number
pageContext?: string
toolsEnabled?: boolean
autoApproveTools?: boolean
// 工具审批续传
pendingToolCalls?: PendingToolCallData[]
assistantText?: string
@@ -67,15 +84,16 @@ export interface StreamChatOptions {
onError: (error: string) => void
onDone: (usage?: TokenUsage, pending?: boolean) => void
onToolCallsPending?: (calls: PendingToolCallData[], assistantText: string) => void
onToolCallsAuto?: (calls: PendingToolCallData[]) => void
onToolResult?: (info: ToolResultInfo) => void
signal?: AbortSignal
}
export async function streamChat(options: StreamChatOptions): Promise<void> {
const {
messages, novelId, pageContext, toolsEnabled,
messages, novelId, pageContext, toolsEnabled, autoApproveTools,
pendingToolCalls, assistantText,
onChunk, onError, onDone, onToolCallsPending, onToolResult,
onChunk, onError, onDone, onToolCallsPending, onToolCallsAuto, onToolResult,
signal,
} = options
@@ -84,6 +102,7 @@ export async function streamChat(options: StreamChatOptions): Promise<void> {
novel_id: novelId ?? null,
page_context: pageContext ?? null,
tools_enabled: toolsEnabled ?? true,
auto_approve_tools: autoApproveTools ?? false,
pending_tool_calls: pendingToolCalls ?? null,
assistant_text: assistantText ?? null,
})
@@ -133,6 +152,9 @@ export async function streamChat(options: StreamChatOptions): Promise<void> {
if (event.tool_calls_pending && onToolCallsPending) {
onToolCallsPending(event.tool_calls_pending, event.assistant_text ?? '')
}
if (event.tool_calls_auto && onToolCallsAuto) {
onToolCallsAuto(event.tool_calls_auto)
}
if (event.tool_result && onToolResult) {
onToolResult(event.tool_result)
}