From f5cf2fb7e7cd95264549d5829c9d19eee9289778 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Sat, 3 Jan 2026 15:03:41 +0800 Subject: [PATCH] fix: send full extract_webpage content to model --- static/src/App.vue | 1 + static/src/components/token/TokenDrawer.vue | 7 +++++ .../components/panels/_resource-panel.scss | 30 ++++++++++++++++++- utils/tool_result_formatter.py | 10 +++++-- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/static/src/App.vue b/static/src/App.vue index af32181..acc2528 100644 --- a/static/src/App.vue +++ b/static/src/App.vue @@ -95,6 +95,7 @@
+
@@ -95,6 +98,10 @@ defineOptions({ name: 'TokenDrawer' }); import { computed } from 'vue'; +const emit = defineEmits<{ + (e: 'toggle'): void; +}>(); + const props = defineProps<{ visible: boolean; collapsed: boolean; diff --git a/static/src/styles/components/panels/_resource-panel.scss b/static/src/styles/components/panels/_resource-panel.scss index 46c0bc7..4c4684a 100644 --- a/static/src/styles/components/panels/_resource-panel.scss +++ b/static/src/styles/components/panels/_resource-panel.scss @@ -5,7 +5,7 @@ /* 顶部 Token 抽屉 */ .token-drawer { position: absolute; - top: 20px; + top: 56px; left: 0; right: 0; width: 100%; @@ -24,6 +24,7 @@ box-shadow: 0 24px 42px rgba(61, 57, 41, 0.18); transition: transform 0.35s ease, opacity 0.35s ease; pointer-events: auto; + position: relative; } .token-drawer.collapsed .token-display-panel { @@ -163,6 +164,33 @@ color: var(--claude-text-secondary); } +.token-close-btn { + position: absolute; + top: 12px; + left: 12px; + width: 28px; + height: 28px; + border: 1px solid var(--claude-border); + border-radius: 50%; + background: rgba(255, 255, 255, 0.8); + color: var(--claude-text); + font-size: 14px; + display: grid; + place-items: center; + cursor: pointer; + transition: background 0.2s ease, transform 0.2s ease; + box-shadow: 0 8px 18px rgba(0, 0, 0, 0.08); +} + +.token-close-btn:hover { + background: var(--claude-surface); + transform: translateY(-1px); +} + +.token-close-btn:active { + transform: translateY(0); +} + .panel-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); diff --git a/utils/tool_result_formatter.py b/utils/tool_result_formatter.py index e0e6e84..79b299e 100644 --- a/utils/tool_result_formatter.py +++ b/utils/tool_result_formatter.py @@ -562,12 +562,16 @@ def _format_extract_webpage(result_data: Dict[str, Any]) -> str: url = result_data.get("url") or "目标网页" content = result_data.get("content") or "" length = len(content) - preview, truncated = _preview_text(content, 800) + truncated_flag = result_data.get("truncated") or False header = f"提取完成:{url},长度 {length} 字符。" if not content: return f"{header} 内容为空。" - note = "(截断预览)" if truncated else "(未截断)" - return "\n".join([f"{header}{note}", "```", preview, "```"]) + # 为模型保留完整正文,避免 800 字预览导致上下文缺失 + note_parts = [] + if truncated_flag: + note_parts.append("原始内容已被上游截断") + note = f"({';'.join(note_parts)})" if note_parts else "" + return "\n".join([f"{header}{note}", "```", content, "```"]) def _format_vlm_analyze(result_data: Dict[str, Any]) -> str: