refactor(sse): simplify error handling and remove __debug__ security issue

- Remove __debug__ conditional that exposed tracebacks in production
- Simplify error response structure to {"error": str(e)}
- Remove redundant exception handling in init_agent()
- Remove unnecessary traceback logging
- Reduce code from ~30 lines to ~10 lines

Fixes security vulnerability where __debug__ is always True
unless Python runs with -O flag, causing full tracebacks
to be sent to clients in production.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
朱潮 2026-01-07 20:24:30 +08:00
parent 342932030f
commit b3303ef8e6
2 changed files with 7 additions and 36 deletions

View File

@ -102,11 +102,8 @@ async def get_tools_from_mcp(mcp):
logger.info(f"get_tools_from_mcp: loaded {len(mcp_tools)} tools, elapsed: {time.time() - start_time:.3f}s") logger.info(f"get_tools_from_mcp: loaded {len(mcp_tools)} tools, elapsed: {time.time() - start_time:.3f}s")
return mcp_tools return mcp_tools
except Exception as e: except Exception as e:
import traceback
error_details = traceback.format_exc()
# 发生异常时返回空列表,避免上层调用报错 # 发生异常时返回空列表,避免上层调用报错
logger.error(f"get_tools_from_mcp: error {str(e)}, elapsed: {time.time() - start_time:.3f}s") logger.error(f"get_tools_from_mcp: error {e}, elapsed: {time.time() - start_time:.3f}s")
logger.error(f"Full traceback: {error_details}")
return [] return []
async def init_agent(config: AgentConfig): async def init_agent(config: AgentConfig):
@ -142,12 +139,8 @@ async def init_agent(config: AgentConfig):
config.mcp_settings = system_prompt config.mcp_settings = system_prompt
# 获取 mcp_tools缓存逻辑已内置到 get_tools_from_mcp 中) # 获取 mcp_tools缓存逻辑已内置到 get_tools_from_mcp 中)
try: mcp_tools = await get_tools_from_mcp(mcp_settings)
mcp_tools = await get_tools_from_mcp(mcp_settings) logger.info(f"Loaded {len(mcp_tools)} MCP tools")
logger.info(f"Successfully loaded {len(mcp_tools)} MCP tools")
except Exception as e:
logger.error(f"Failed to load MCP tools: {str(e)}, using empty tool list")
mcp_tools = []
# 检测或使用指定的提供商 # 检测或使用指定的提供商
model_provider, base_url = detect_provider(config.model_name, config.model_server) model_provider, base_url = detect_provider(config.model_name, config.model_server)

View File

@ -114,21 +114,9 @@ async def enhanced_generate_stream_response(
await output_queue.put(("agent_done", None)) await output_queue.put(("agent_done", None))
except Exception as e: except Exception as e:
import traceback logger.error(f"Error in agent task: {e}")
error_details = traceback.format_exc()
logger.error(f"Error in agent task: {str(e)}")
logger.error(f"Full traceback: {error_details}")
# 发送错误信息给客户端 # 发送错误信息给客户端
error_data = { await output_queue.put(("agent", f'data: {{"error": "{str(e)}"}}\n\n'))
"error": {
"message": f"Agent execution failed: {str(e)}",
"type": "agent_error",
"details": error_details if __debug__ else str(e)
}
}
error_chunk = create_stream_chunk(f"chatcmpl-error", config.model_name, json.dumps(error_data, ensure_ascii=False))
await output_queue.put(("agent", f"data: {json.dumps(error_chunk, ensure_ascii=False)}\n\n"))
# 发送完成信号,确保输出控制器能正常结束 # 发送完成信号,确保输出控制器能正常结束
await output_queue.put(("agent_done", None)) await output_queue.put(("agent_done", None))
@ -189,18 +177,8 @@ async def enhanced_generate_stream_response(
logger.info(f"Enhanced stream response completed") logger.info(f"Enhanced stream response completed")
except Exception as e: except Exception as e:
import traceback logger.error(f"Error in enhanced_generate_stream_response: {e}")
error_details = traceback.format_exc() yield f'data: {{"error": "{str(e)}"}}\n\n'
logger.error(f"Error in enhanced_generate_stream_response: {str(e)}")
logger.error(f"Full traceback: {error_details}")
error_data = {
"error": {
"message": f"Stream error: {str(e)}",
"type": "internal_error"
}
}
yield f"data: {json.dumps(error_data, ensure_ascii=False)}\n\n"
yield "data: [DONE]\n\n" yield "data: [DONE]\n\n"