优化: anthropic 协议图片 URL 预拉转 base64 + 无 Vision 模型温和丢图

This commit is contained in:
lxy
2026-08-08 14:19:15 +08:00
parent c1f2fe16c8
commit 4ce6a859e7
4 changed files with 254 additions and 4 deletions
+9 -2
View File
@@ -44,6 +44,12 @@ impl Default for TokenEstimator {
}
}
// url 模式图片 token 地板(Anthropic 保守 ~1600/图,OpenAI 按 tile;URL 长度估严重低估会致预算裁剪不触发)。
// 2026-08-05(F-260801 Phase4):url 模式无字节可估,仅按 URL 长度估(几十字符≈几 token)会致含图
// 消息 history_tokens 严重低估 → 预算裁剪不触发 → 多图/长会话超 provider 上限 400。地板按每图
// ~1600 token 保守估(对齐 Anthropic 图片 token 成本量级),宁可高估触发裁剪也不低估漏裁。
const URL_IMAGE_TOKEN_FLOOR: usize = 1600;
impl TokenEstimator {
/// 估算单条消息的 token 数(保守估计)
///
@@ -63,8 +69,9 @@ impl TokenEstimator {
// base64 优先(多模态主载荷),url 次之;url 模式无字节,仅按 URL 长度估
if let Some(b) = base64 {
char_count += b.chars().count();
} else if let Some(u) = url {
char_count += u.chars().count();
} else if url.is_some() {
// F-260801 Phase4:url 模式按地板估(URL 长度估严重低估,见 URL_IMAGE_TOKEN_FLOOR 注)。
char_count += URL_IMAGE_TOKEN_FLOOR;
}
}
}
+1
View File
@@ -636,6 +636,7 @@ impl LlmProvider for OpenAICompatProvider {
#[cfg(test)]
mod tests {
use super::*;
use crate::openai_helpers::OpenAiFunctionResp;
/// 辅助:构造普通文本 delta chunk 的 SSE data
fn text_chunk(content: &str, finish_reason: Option<&str>) -> String {