From 06eacb04191d6397255adff831301c217f42ce54 Mon Sep 17 00:00:00 2001 From: hex2077 Date: Mon, 20 Oct 2025 23:54:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(api):=20=E6=B7=BB=E5=8A=A0=20token=20?= =?UTF-8?q?=E8=BF=87=E6=9C=9F=E8=87=AA=E5=8A=A8=E5=88=B7=E6=96=B0=E5=92=8C?= =?UTF-8?q?=20count=5Ftokens=20=E7=AB=AF=E7=82=B9=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 API 服务器中添加对 count_tokens 请求的处理,返回不支持的提示。 在 Kiro 客户端的内容生成方法中增加 token 过期检查,在即将过期时 自动刷新认证凭证,避免请求失败。 --- src/api-server.js | 10 ++++++++++ src/claude/claude-kiro.js | 14 ++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/api-server.js b/src/api-server.js index 0061c66..ec90792 100644 --- a/src/api-server.js +++ b/src/api-server.js @@ -628,6 +628,16 @@ function createRequestHandler(config) { })); } + // Ignore count_tokens requests + if (path.includes('/count_tokens')) { + console.log(`[Server] Ignoring count_tokens request: ${path}`); + res.writeHead(200, { 'Content-Type': 'application/json' }); + return res.end(JSON.stringify({ + tokens: 0, + message: 'Token counting is not supported' + })); + } + if (!isAuthorized(req, requestUrl, currentConfig.REQUIRED_API_KEY)) { res.writeHead(401, { 'Content-Type': 'application/json' }); return res.end(JSON.stringify({ error: { message: 'Unauthorized: API key is invalid or missing.' } })); diff --git a/src/claude/claude-kiro.js b/src/claude/claude-kiro.js index 719fa5c..7de00c3 100644 --- a/src/claude/claude-kiro.js +++ b/src/claude/claude-kiro.js @@ -859,6 +859,13 @@ async initializeAuth(forceRefresh = false) { async generateContent(model, requestBody) { if (!this.isInitialized) await this.initialize(); + + // 检查 token 是否即将过期,如果是则先刷新 + if (this.isExpiryDateNear()) { + console.log('[Kiro] Token is near expiry, refreshing before generateContent request...'); + await this.initializeAuth(true); + } + const finalModel = MODEL_MAPPING[model] ? model : this.modelName; console.log(`[Kiro] Calling generateContent with model: ${finalModel}`); const response = await this.callApi('', finalModel, requestBody); @@ -886,6 +893,13 @@ async initializeAuth(forceRefresh = false) { // 重构2: generateContentStream 调用新的普通async函数 async * generateContentStream(model, requestBody) { if (!this.isInitialized) await this.initialize(); + + // 检查 token 是否即将过期,如果是则先刷新 + if (this.isExpiryDateNear()) { + console.log('[Kiro] Token is near expiry, refreshing before generateContentStream request...'); + await this.initializeAuth(true); + } + const finalModel = MODEL_MAPPING[model] ? model : this.modelName; console.log(`[Kiro] Calling generateContentStream with model: ${finalModel}`);