mirror of
https://github.com/router-for-me/CLIProxyAPIPlus.git
synced 2026-03-21 16:40:22 +00:00
## 背景 当 Claude Code 发送过多工具信息时,可能超出 Kiro API 请求限制导致 500 错误。 现有的工具描述截断(KiroMaxToolDescLen = 10237)只能限制单个工具的描述长度, 无法解决整体工具列表过大的问题。 ## 解决方案 实现动态工具压缩功能,采用两步压缩策略: 1. 先检查原始大小,超过 20KB 才进行压缩 2. 第一步:简化 input_schema,只保留 type/enum/required 字段 3. 第二步:按比例缩短 description(最短 50 字符) 4. 保留全部工具和 skills 可调用,不丢弃任何工具 ## 新增文件 - internal/translator/kiro/claude/tool_compression.go - calculateToolsSize(): 计算工具列表的 JSON 序列化大小 - simplifyInputSchema(): 简化 input_schema,递归处理嵌套 properties - compressToolDescription(): 按比例压缩描述,支持 UTF-8 安全截断 - compressToolsIfNeeded(): 主压缩函数,实现两步压缩策略 - internal/translator/kiro/claude/tool_compression_test.go - 完整的单元测试覆盖所有新增函数 - 测试 UTF-8 安全性 - 测试压缩效果 ## 修改文件 - internal/translator/kiro/common/constants.go - 新增 ToolCompressionTargetSize = 20KB (压缩目标大小阈值) - 新增 MinToolDescriptionLength = 50 (描述最短长度) - internal/translator/kiro/claude/kiro_claude_request.go - 在 convertClaudeToolsToKiro() 函数末尾调用 compressToolsIfNeeded() ## 测试结果 - 70KB 工具压缩至 17KB (74.7% 压缩率) - 所有单元测试通过 ## 预期效果 - 80KB+ tools 压缩至 ~15KB - 不影响工具调用功能
84 lines
3.1 KiB
Go
84 lines
3.1 KiB
Go
// Package common provides shared constants and utilities for Kiro translator.
|
|
package common
|
|
|
|
const (
|
|
// KiroMaxToolDescLen is the maximum description length for Kiro API tools.
|
|
// Kiro API limit is 10240 bytes, leave room for "..."
|
|
KiroMaxToolDescLen = 10237
|
|
|
|
// ToolCompressionTargetSize is the target total size for compressed tools (20KB).
|
|
// If tools exceed this size, compression will be applied.
|
|
ToolCompressionTargetSize = 20 * 1024 // 20KB
|
|
|
|
// MinToolDescriptionLength is the minimum description length after compression.
|
|
// Descriptions will not be shortened below this length.
|
|
MinToolDescriptionLength = 50
|
|
|
|
// ThinkingStartTag is the start tag for thinking blocks in responses.
|
|
ThinkingStartTag = "<thinking>"
|
|
|
|
// ThinkingEndTag is the end tag for thinking blocks in responses.
|
|
ThinkingEndTag = "</thinking>"
|
|
|
|
// CodeFenceMarker is the markdown code fence marker.
|
|
CodeFenceMarker = "```"
|
|
|
|
// AltCodeFenceMarker is the alternative markdown code fence marker.
|
|
AltCodeFenceMarker = "~~~"
|
|
|
|
// InlineCodeMarker is the markdown inline code marker (backtick).
|
|
InlineCodeMarker = "`"
|
|
|
|
// KiroAgenticSystemPrompt is injected only for -agentic models to prevent timeouts on large writes.
|
|
// AWS Kiro API has a 2-3 minute timeout for large file write operations.
|
|
KiroAgenticSystemPrompt = `
|
|
# CRITICAL: CHUNKED WRITE PROTOCOL (MANDATORY)
|
|
|
|
You MUST follow these rules for ALL file operations. Violation causes server timeouts and task failure.
|
|
|
|
## ABSOLUTE LIMITS
|
|
- **MAXIMUM 350 LINES** per single write/edit operation - NO EXCEPTIONS
|
|
- **RECOMMENDED 300 LINES** or less for optimal performance
|
|
- **NEVER** write entire files in one operation if >300 lines
|
|
|
|
## MANDATORY CHUNKED WRITE STRATEGY
|
|
|
|
### For NEW FILES (>300 lines total):
|
|
1. FIRST: Write initial chunk (first 250-300 lines) using write_to_file/fsWrite
|
|
2. THEN: Append remaining content in 250-300 line chunks using file append operations
|
|
3. REPEAT: Continue appending until complete
|
|
|
|
### For EDITING EXISTING FILES:
|
|
1. Use surgical edits (apply_diff/targeted edits) - change ONLY what's needed
|
|
2. NEVER rewrite entire files - use incremental modifications
|
|
3. Split large refactors into multiple small, focused edits
|
|
|
|
### For LARGE CODE GENERATION:
|
|
1. Generate in logical sections (imports, types, functions separately)
|
|
2. Write each section as a separate operation
|
|
3. Use append operations for subsequent sections
|
|
|
|
## EXAMPLES OF CORRECT BEHAVIOR
|
|
|
|
✅ CORRECT: Writing a 600-line file
|
|
- Operation 1: Write lines 1-300 (initial file creation)
|
|
- Operation 2: Append lines 301-600
|
|
|
|
✅ CORRECT: Editing multiple functions
|
|
- Operation 1: Edit function A
|
|
- Operation 2: Edit function B
|
|
- Operation 3: Edit function C
|
|
|
|
❌ WRONG: Writing 500 lines in single operation → TIMEOUT
|
|
❌ WRONG: Rewriting entire file to change 5 lines → TIMEOUT
|
|
❌ WRONG: Generating massive code blocks without chunking → TIMEOUT
|
|
|
|
## WHY THIS MATTERS
|
|
- Server has 2-3 minute timeout for operations
|
|
- Large writes exceed timeout and FAIL completely
|
|
- Chunked writes are FASTER and more RELIABLE
|
|
- Failed writes waste time and require retry
|
|
|
|
REMEMBER: When in doubt, write LESS per operation. Multiple small operations > one large operation.`
|
|
)
|