fix: send full extract_webpage content to model

This commit is contained in:
JOJO 2026-01-03 15:03:41 +08:00
parent e2ba632ac8
commit f5cf2fb7e7
4 changed files with 44 additions and 4 deletions

View File

@ -95,6 +95,7 @@
<TokenDrawer <TokenDrawer
:visible="Boolean(currentConversationId)" :visible="Boolean(currentConversationId)"
:collapsed="tokenPanelCollapsed" :collapsed="tokenPanelCollapsed"
@toggle="handleTokenPanelToggleClick"
:current-conversation-tokens="currentConversationTokens" :current-conversation-tokens="currentConversationTokens"
:current-context-tokens="currentContextTokens" :current-context-tokens="currentContextTokens"
:container-status="containerStatus" :container-status="containerStatus"

View File

@ -1,6 +1,9 @@
<template> <template>
<div class="token-drawer" v-if="visible" :class="{ collapsed }"> <div class="token-drawer" v-if="visible" :class="{ collapsed }">
<div class="token-display-panel"> <div class="token-display-panel">
<button class="token-close-btn" type="button" @click="emit('toggle')">
</button>
<div class="token-panel-content"> <div class="token-panel-content">
<div class="usage-dashboard"> <div class="usage-dashboard">
<div class="usage-cell usage-cell--left usage-cell--token panel-card"> <div class="usage-cell usage-cell--left usage-cell--token panel-card">
@ -95,6 +98,10 @@ defineOptions({ name: 'TokenDrawer' });
import { computed } from 'vue'; import { computed } from 'vue';
const emit = defineEmits<{
(e: 'toggle'): void;
}>();
const props = defineProps<{ const props = defineProps<{
visible: boolean; visible: boolean;
collapsed: boolean; collapsed: boolean;

View File

@ -5,7 +5,7 @@
/* 顶部 Token 抽屉 */ /* 顶部 Token 抽屉 */
.token-drawer { .token-drawer {
position: absolute; position: absolute;
top: 20px; top: 56px;
left: 0; left: 0;
right: 0; right: 0;
width: 100%; width: 100%;
@ -24,6 +24,7 @@
box-shadow: 0 24px 42px rgba(61, 57, 41, 0.18); box-shadow: 0 24px 42px rgba(61, 57, 41, 0.18);
transition: transform 0.35s ease, opacity 0.35s ease; transition: transform 0.35s ease, opacity 0.35s ease;
pointer-events: auto; pointer-events: auto;
position: relative;
} }
.token-drawer.collapsed .token-display-panel { .token-drawer.collapsed .token-display-panel {
@ -163,6 +164,33 @@
color: var(--claude-text-secondary); 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 { .panel-row {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(360px, 1fr));

View File

@ -562,12 +562,16 @@ def _format_extract_webpage(result_data: Dict[str, Any]) -> str:
url = result_data.get("url") or "目标网页" url = result_data.get("url") or "目标网页"
content = result_data.get("content") or "" content = result_data.get("content") or ""
length = len(content) length = len(content)
preview, truncated = _preview_text(content, 800) truncated_flag = result_data.get("truncated") or False
header = f"提取完成:{url},长度 {length} 字符。" header = f"提取完成:{url},长度 {length} 字符。"
if not content: if not content:
return f"{header} 内容为空。" return f"{header} 内容为空。"
note = "(截断预览)" if truncated else "(未截断)" # 为模型保留完整正文,避免 800 字预览导致上下文缺失
return "\n".join([f"{header}{note}", "```", preview, "```"]) 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: def _format_vlm_analyze(result_data: Dict[str, Any]) -> str: