agentscope-ai / agentscope-ai/agentscope
[Bug] TypeError in Gemini streaming: NoneType subtraction in _parse_gemini_stream_generation_response
- 主要語言
- Python
- 星號
- 31.5k
- 分支
- 3.5k
- 平均合併
- 1 天 23 小時
- 30 天內合併 PR
- 95
描述
## Bug Description
When using `GeminiChatModel` with streaming enabled (default), a `TypeError` occurs because `usage_metadata.prompt_token_count` and `usage_metadata.total_token_count` can be `None` during streaming chunks.
## Error Message
```
TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'
```
## Stack Trace
```
File "agentscope/model/_gemini_model.py", line 390, in _parse_gemini_stream_generation_response
output_tokens=chunk.usage_metadata.total_token_count
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- chunk.usage_metadata.prompt_token_count,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'
```
## How to Reproduce
```python
from agentscope.agent import ReActAgent
from agentscope.formatter import GeminiChatFormatter
from agentscope.model import GeminiChatModel
from agentscope.memory import InMemoryMemory
from agentscope.message import Msg, URLSource, TextBlock, ImageBlock
gemini_model = GeminiChatModel(
model_name="gemini-3-flash-preview",
api_key="YOUR_API_KEY",
# stream=True # default
)
agent = ReActAgent(
name="assistant",
sys_prompt="You are a helpful assistant.",
model=gemini_model,
memory=InMemoryMemory(),
formatter=GeminiChatFormatter(),
)
msg = Msg(
name="user",
role="user",
content=[
TextBlock(type="text", text="What do you see in this image?"),
ImageBlock(
type="image",
source=URLSource(
type="url",
url="https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png",
),
),
],
)
import asyncio
asyncio.run(agent(msg))
```
## Root Cause
In `_gemini_model.py` lines 386-393, the code assumes `usage_metadata` fields are always present:
```python
if chunk.usage_metadata:
usage = ChatUsage(
input_tokens=chunk.usage_metadata.prompt_token_count,
output_tokens=chunk.usage_metadata.total_token_count
- chunk.usage_metadata.prompt_token_count, # <-- can be None - None
time=(datetime.now() - start_datetime).total_seconds(),
)
```
During streaming, Gemini may return chunks where `usage_metadata` exists but `prompt_token_count` and `total_token_count` are `None`.
## Suggested Fix
```python
usage = None
if chunk.usage_metadata:
prompt_tokens = chunk.usage_metadata.prompt_token_count
total_tokens = chunk.usage_metadata.total_token_count
if prompt_tokens is not None and total_tokens is not None:
usage = ChatUsage(
input_tokens=prompt_tokens,
output_tokens=total_tokens - prompt_tokens,
time=(datetime.now() - start_datetime).total_seconds(),
)
```
## Environment
- agentscope version: 1.0.15
- Python version: 3.13
- Model: gemini-3-flash-preview (Vertex AI)
## Workaround
Set `stream=False` when creating `GeminiChatModel`, or apply a monkey patch to fix the None handling.
貢獻指南
評估
這個 Issue 還沒有評估資料。