From 1033cefdfb41408c9c27fe225ee651851c661c43 Mon Sep 17 00:00:00 2001 From: Metona Fix Date: Mon, 6 Apr 2026 19:14:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=B7=A6=E4=BE=A7?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E6=89=A7=E8=A1=8C=E6=97=A5=E5=BF=97=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 功能: - 日志面板位于聊天区左侧,可折叠/展开 - 实时展示所有执行事件: - 🤔 模型思考过程 - 📡 流式响应状态 - 🔧 工具调用(参数+结果) - ⚠️ 错误和警告 - ℹ️ Agent Loop 迭代 - ✅ 操作完成 - 日志自动滚动、最大 500 条、可清空 - 等宽字体显示,按级别着色 - 头部新增日志开关按钮 --- src/renderer/components/input-area.ts | 12 ++ src/renderer/index.html | 33 ++++- src/renderer/main.ts | 2 + src/renderer/services/agent-engine.ts | 21 +++ src/renderer/services/log-service.ts | 180 ++++++++++++++++++++++++++ src/renderer/styles/style.css | 123 +++++++++++++++++- 6 files changed, 369 insertions(+), 2 deletions(-) create mode 100644 src/renderer/services/log-service.ts diff --git a/src/renderer/components/input-area.ts b/src/renderer/components/input-area.ts index 99be6fb..12e6711 100644 --- a/src/renderer/components/input-area.ts +++ b/src/renderer/components/input-area.ts @@ -16,6 +16,7 @@ import { OllamaAPI } from '../api/ollama.js'; import { runAgentLoop } from '../services/agent-engine.js'; import { searchMemories, buildMemoryContext, markMemoryUsed, extractMemoriesFromConversation, isMemoryEnabled } from '../services/memory-manager.js'; import { showToolConfirm } from './tool-confirm-modal.js'; +import { logInfo, logStream, logError, logSuccess, logWarn } from '../services/log-service.js'; import type { ChatSession, ChatMessage, OllamaStreamChunk, RagSource, FileContent, ChatFile, ToolCallRecord } from '../types.js'; let chatInputEl: HTMLTextAreaElement; @@ -249,6 +250,8 @@ export async function sendMessage(): Promise { return; } + logInfo(`发送消息: ${model}`, text ? text.slice(0, 60) + (text.length > 60 ? '...' : '') : '[附件消息]'); + if (pendingImages.length > 0 && !isVisionAvailable()) { appendSystemMessage('⚠️ 当前模型不支持图片分析,请移除图片后重试'); return; @@ -441,8 +444,11 @@ export async function sendMessage(): Promise { if (!assistantContent && !thinkContent) { appendSystemMessage('⚠️ 模型未返回任何内容,可能是上下文过长或模型不支持当前请求'); + logWarn('模型未返回任何内容'); } + logStream(`流式完成: ${assistantContent.length} 字符${finalStats?.eval_count ? `, ${finalStats.eval_count} tokens` : ''}`); + const assistantMsg: ChatMessage = { role: 'assistant', content: assistantContent || '', @@ -555,10 +561,15 @@ export async function sendMessage(): Promise { let errMsg = `❌ 错误: ${(err as Error).message}`; if ((err as Error).message.includes('Failed to fetch') || (err as Error).message.includes('NetworkError')) { errMsg = '❌ 连接失败。请检查:\n1. Ollama 是否正在运行\n2. 地址是否正确\n3. 是否设置了 OLLAMA_ORIGINS="*"'; + logError('连接失败', 'Ollama 服务不可达'); } else if ((err as Error).message.includes('400')) { errMsg = '❌ 请求参数错误,可能是知识库内容超出模型上下文限制'; + logError('请求参数错误 (400)', (err as Error).message); } else if ((err as Error).message.includes('500')) { errMsg = '❌ Ollama 服务器错误,请检查 Ollama 日志'; + logError('Ollama 服务器错误 (500)', (err as Error).message); + } else { + logError('对话错误', (err as Error).message); } appendSystemMessage(errMsg); } finally { @@ -691,6 +702,7 @@ async function sendMessageWithAgentLoop(text: string, currentSession: ChatSessio }); } catch (err) { console.error('[AgentLoop] 错误:', err); + logError('Agent Loop 错误', (err as Error).message); if ((err as Error).name === 'AbortError') { const placeholder = document.querySelector('#messagesContainer .message.assistant.loading') as HTMLElement; diff --git a/src/renderer/index.html b/src/renderer/index.html index bda42f3..e17a726 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -11,9 +11,40 @@
+ + + + +
+
+ Metona Ollama v3.0.0 @@ -149,7 +180,7 @@
-
+