From cb5d186cf02ffc48f4d680ef308f351199af840c Mon Sep 17 00:00:00 2001 From: SXP-Simon Date: Tue, 9 Sep 2025 20:04:49 +0800 Subject: [PATCH] =?UTF-8?q?[v2.0.0]=20(LLM=20Token)=20=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=9C=B0=E6=8F=90=E5=8F=96=20usage=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=20response.raw=5Fcompletion.usage=20=E4=B8=BA=20None=20?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=20AttributeError?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- metadata.yaml | 2 +- src/analysis/llm_analyzer.py | 39 ++++++++++++++++++++++-------------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 8e5f1de..c3acd0e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # QQ群日常分析插件 -[![Plugin Version](https://img.shields.io/badge/Latest_Version-v1.9.0-blue.svg?style=for-the-badge&color=76bad9)](https://github.com/SXP-Simon/astrbot-qq-group-daily-analysis) +[![Plugin Version](https://img.shields.io/badge/Latest_Version-v2.0.0-blue.svg?style=for-the-badge&color=76bad9)](https://github.com/SXP-Simon/astrbot-qq-group-daily-analysis) [![AstrBot](https://img.shields.io/badge/AstrBot-Plugin-ff69b4?style=for-the-badge)](https://github.com/AstrBotDevs/AstrBot) [![License](https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge)](LICENSE) diff --git a/metadata.yaml b/metadata.yaml index 1f66982..8f4e496 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -13,6 +13,6 @@ help: | # 插件的帮助信息 命令: /群分析 [天数] - 分析群聊活动 /分析设置 [操作] - 管理设置(enable/disable/status/test) -version: v1.9.0 # 插件版本号。格式:v1.1.1 或者 v1.1 +version: v2.0.0 # 插件版本号。格式:v1.1.1 或者 v1.1 author: SXP-Simon # 作者 repo: https://github.com/SXP-Simon/astrbot-qq-group-daily-analysis # 插件的仓库地址 diff --git a/src/analysis/llm_analyzer.py b/src/analysis/llm_analyzer.py index 1e5a0d1..bb91437 100644 --- a/src/analysis/llm_analyzer.py +++ b/src/analysis/llm_analyzer.py @@ -116,11 +116,14 @@ class LLMAnalyzer: # 提取token使用统计 token_usage = TokenUsage() - if response.raw_completion and hasattr(response.raw_completion, 'usage'): - usage = response.raw_completion.usage - token_usage.prompt_tokens = usage.prompt_tokens if usage.prompt_tokens else 0 - token_usage.completion_tokens = usage.completion_tokens if usage.completion_tokens else 0 - token_usage.total_tokens = usage.total_tokens if usage.total_tokens else 0 + # 安全地提取 usage,避免 response.raw_completion.usage 为 None 导致的 AttributeError + usage = None + if getattr(response, 'raw_completion', None) is not None: + usage = getattr(response.raw_completion, 'usage', None) + if usage: + token_usage.prompt_tokens = getattr(usage, 'prompt_tokens', 0) or 0 + token_usage.completion_tokens = getattr(usage, 'completion_tokens', 0) or 0 + token_usage.total_tokens = getattr(usage, 'total_tokens', 0) or 0 # 解析响应 if hasattr(response, 'completion_text'): @@ -341,11 +344,14 @@ class LLMAnalyzer: # 提取token使用统计 token_usage = TokenUsage() - if response.raw_completion and hasattr(response.raw_completion, 'usage'): - usage = response.raw_completion.usage - token_usage.prompt_tokens = usage.prompt_tokens if usage.prompt_tokens else 0 - token_usage.completion_tokens = usage.completion_tokens if usage.completion_tokens else 0 - token_usage.total_tokens = usage.total_tokens if usage.total_tokens else 0 + # 安全地提取 usage,避免 response.raw_completion.usage 为 None 导致的 AttributeError + usage = None + if getattr(response, 'raw_completion', None) is not None: + usage = getattr(response.raw_completion, 'usage', None) + if usage: + token_usage.prompt_tokens = getattr(usage, 'prompt_tokens', 0) or 0 + token_usage.completion_tokens = getattr(usage, 'completion_tokens', 0) or 0 + token_usage.total_tokens = getattr(usage, 'total_tokens', 0) or 0 # 解析响应 if hasattr(response, 'completion_text'): @@ -442,11 +448,14 @@ class LLMAnalyzer: # 提取token使用统计 token_usage = TokenUsage() - if response.raw_completion and hasattr(response.raw_completion, 'usage'): - usage = response.raw_completion.usage - token_usage.prompt_tokens = usage.prompt_tokens if usage.prompt_tokens else 0 - token_usage.completion_tokens = usage.completion_tokens if usage.completion_tokens else 0 - token_usage.total_tokens = usage.total_tokens if usage.total_tokens else 0 + # 安全地提取 usage,避免 response.raw_completion.usage 为 None 导致的 AttributeError + usage = None + if getattr(response, 'raw_completion', None) is not None: + usage = getattr(response.raw_completion, 'usage', None) + if usage: + token_usage.prompt_tokens = getattr(usage, 'prompt_tokens', 0) or 0 + token_usage.completion_tokens = getattr(usage, 'completion_tokens', 0) or 0 + token_usage.total_tokens = getattr(usage, 'total_tokens', 0) or 0 # 解析响应 if hasattr(response, 'completion_text'):