核心原因
grok.py 第 250 行,流式响应解析时 delta["content"] 为 None,导致 content += None 抛出 TypeError。
###脚本重现
import os, sys, asyncio, traceback, logging
# -------------------------- 加载 .env --------------------------
try:
from dotenv import load_dotenv
env_path = '/root/GrokSearchMCP/WebSearchMCP/.env'
if os.path.exists(env_path):
load_dotenv(env_path)
print("✅ 已从 .env 加载环境变量")
else:
print(f"❌ 找不到 .env 文件: {env_path}")
sys.exit(1)
except ImportError:
print("❌ 请先安装 python-dotenv: pip install python-dotenv")
sys.exit(1)
api_key = os.getenv("GROK_API_KEY")
if not api_key:
print("❌ GROK_API_KEY 未设置,请检查 .env")
sys.exit(1)
api_url = os.getenv("GROK_API_URL", "")
effective_model = os.getenv("GROK_MODEL", "grok-3")
print(f"✅ API Key 前8位: {api_key[:8]}... 模型: {effective_model}")
# -------------------------- 添加项目路径 --------------------------
sys.path.insert(0, '/root/GrokSearchMCP/WebSearchMCP/src')
from web_search.providers.grok import GrokSearchProvider
grok = GrokSearchProvider(api_url, api_key, effective_model)
# -------------------------- 触发错误的查询列表 --------------------------
queries = [
"linux.do GPT搜索很强 智商高 梗 MCP深入思考",
"linux.do gpt 能get梗 智商高 搜索 很强",
'linux.do "GPT" "搜索" "智商高" "梗" 帖子推荐',
"linux.do GPT 搜索能力 很强 智商 例子",
'linux.do "gpt" "搜索" "梗" "智商" "MCP" 帖子链接',
"linux.do GPT搜索很强 智商 梗 例子 MCP 深入思考",
'linux.do "openai" "玩梗" GPT 搜索 智商 MCP',
"linux.do GPT 搜索 很强 'sequential thinking' MCP 智商",
'linux.do "GPT可以" 梗',
]
async def test_query(q):
print(f"\n--- 测试查询: {q} ---")
try:
result = await grok.search(q)
print(f"✅ 成功,结果长度: {len(str(result))}")
return True
except TypeError as e:
if "can only concatenate str" in str(e):
print("\n🔥🔥🔥 复现 TypeError!🔥🔥🔥")
traceback.print_exc()
# 提取 grok.py 中的出错信息
exc = traceback.TracebackException.from_exception(e)
for frame in exc.stack:
if 'grok.py' in frame.filename:
print(f"\n❌ 出错文件: {frame.filename}")
print(f" 行号: {frame.lineno}")
print(f" 代码: {frame.line}")
break
return False
else:
raise
except Exception as e:
print(f"其他异常: {type(e).__name__}: {e}")
traceback.print_exc()
return False
async def main():
for query in queries:
success = await test_query(query)
if not success:
print("\n已捕获目标错误,停止测试。")
return
print("\n所有查询均未复现 TypeError,可能需要更多样本或延长测试。")
if __name__ == "__main__":
asyncio.run(main())
报错
✅ 已从 .env 加载环境变量
✅ API Key 前8位: sk-LhkAu... 模型: grok-4.1-fast
--- 测试查询: linux.do GPT搜索很强 智商高 梗 MCP深入思考 ---
✅ 成功,结果长度: 167
--- 测试查询: linux.do gpt 能get梗 智商高 搜索 很强 ---
✅ 成功,结果长度: 546
--- 测试查询: linux.do "GPT" "搜索" "智商高" "梗" 帖子推荐 ---
🔥🔥🔥 复现 TypeError!🔥🔥🔥
Traceback (most recent call last):
File "/root/GrokSearchMCP/WebSearchMCP/src/web_search/debug_grok.py", line 52, in test_query
result = await grok.search(q)
File "/root/GrokSearchMCP/WebSearchMCP/src/web_search/providers/grok.py", line 207, in search
return await self._execute_stream_with_retry(headers, payload, ctx)
File "/root/GrokSearchMCP/WebSearchMCP/src/web_search/providers/grok.py", line 273, in _execute_stream_with_retry
async for attempt in AsyncRetrying(
File "/usr/local/lib/python3.10/dist-packages/tenacity/asyncio/__init__.py", line 170, in __anext__
do = await self.iter(retry_state=self._retry_state)
File "/usr/local/lib/python3.10/dist-packages/tenacity/asyncio/__init__.py", line 157, in iter
result = await action(retry_state)
File "/usr/local/lib/python3.10/dist-packages/tenacity/_utils.py", line 111, in inner
return call(*args, **kwargs)
File "/usr/local/lib/python3.10/dist-packages/tenacity/__init__.py", line 393, in <lambda>
self._add_action_func(lambda rs: rs.outcome.result())
File "/usr/lib/python3.10/concurrent/futures/_base.py", line 451, in result
return self.__get_result()
File "/usr/lib/python3.10/concurrent/futures/_base.py", line 403, in __get_result
raise self._exception
File "/root/GrokSearchMCP/WebSearchMCP/src/web_search/providers/grok.py", line 287, in _execute_stream_with_retry
return await self._parse_streaming_response(response, ctx)
File "/root/GrokSearchMCP/WebSearchMCP/src/web_search/providers/grok.py", line 250, in _parse_streaming_response
content += delta["content"]
TypeError: can only concatenate str (not "NoneType") to str
临时解决办法
将 grok.py 中的
if "content" in delta:
content += delta["content"]
更改后变为
if "content" in delta:
content += delta["content"] or ""
后续正常使用搜索无任何报错。
核心原因
grok.py 第 250 行,流式响应解析时 delta["content"] 为 None,导致 content += None 抛出 TypeError。
###脚本重现
报错
临时解决办法
将
grok.py中的更改后变为
后续正常使用搜索无任何报错。