|
|
@@ -16,7 +16,7 @@ from fastapi.staticfiles import StaticFiles
|
|
|
import httpx
|
|
|
from anthropic import Anthropic
|
|
|
|
|
|
-from debug_logger import log_debug
|
|
|
+from debug_logger import log_debug, log_error
|
|
|
from config import MCP_SERVERS, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, ANTHROPIC_MODEL
|
|
|
from conversation_manager import ConversationManager
|
|
|
from tool_handler import ToolCallHandler
|
|
|
@@ -157,11 +157,11 @@ async def chat(request: Request):
|
|
|
print(f"[DEBUG /api/chat] {k}: {v[:30] if v else 'None'}...")
|
|
|
|
|
|
# 获取前端发送的组件列表(实现动态组件注册)
|
|
|
- available_components = data.get('availableComponents')
|
|
|
+ components_prompt = data.get('componentsPrompt')
|
|
|
enabled_mcp_list = data.get('enabledMcpList') # 前端发送的已启用 MCP 列表
|
|
|
|
|
|
- if available_components:
|
|
|
- print(f"[DEBUG /api/chat] Using dynamic components from frontend ({len(available_components)} chars)")
|
|
|
+ if components_prompt:
|
|
|
+ print(f"[DEBUG /api/chat] Using dynamic components from frontend ({len(components_prompt)} chars)")
|
|
|
|
|
|
# DEBUG: 打印已启用的 MCP 列表
|
|
|
if enabled_mcp_list is not None:
|
|
|
@@ -176,7 +176,7 @@ async def chat(request: Request):
|
|
|
model=ANTHROPIC_MODEL,
|
|
|
session_id=session_id,
|
|
|
mcp_tokens=parsed_tokens,
|
|
|
- components_prompt=available_components, # 动态组件提示
|
|
|
+ components_prompt=components_prompt, # 动态组件提示
|
|
|
enabled_mcp_list=enabled_mcp_list # 前端传递的已启用 MCP 列表
|
|
|
)
|
|
|
|
|
|
@@ -205,6 +205,7 @@ async def chat(request: Request):
|
|
|
raise
|
|
|
except Exception as e:
|
|
|
import traceback
|
|
|
+ log_error("app_fastapi.chat_stream_error", e, {"endpoint": "/api/chat/stream"})
|
|
|
return JSONResponse(
|
|
|
status_code=500,
|
|
|
content={
|
|
|
@@ -219,7 +220,7 @@ async def generate_chat_stream(
|
|
|
conversation_history: List[Dict[str, Any]],
|
|
|
session_id: Optional[str],
|
|
|
mcp_tokens: Optional[Dict[str, str]] = None,
|
|
|
- available_components: Optional[str] = None, # 新增:前端发送的组件列表
|
|
|
+ components_prompt: Optional[str] = None, # 新增:前端发送的组件列表
|
|
|
enabled_mcp_list: Optional[List[str]] = None # 新增:前端发送的已启用 MCP 列表
|
|
|
):
|
|
|
"""生成 SSE 流式响应的异步生成器"""
|
|
|
@@ -244,8 +245,8 @@ async def generate_chat_stream(
|
|
|
print(f"[DEBUG generate_chat_stream] {k}: {v[:30] if v else 'None'}...")
|
|
|
|
|
|
# DEBUG: 打印组件提示
|
|
|
- if available_components:
|
|
|
- print(f"[DEBUG generate_chat_stream] Using dynamic components from frontend ({len(available_components)} chars)")
|
|
|
+ if components_prompt:
|
|
|
+ print(f"[DEBUG generate_chat_stream] Using dynamic components from frontend ({len(components_prompt)} chars)")
|
|
|
else:
|
|
|
print(f"[DEBUG generate_chat_stream] Using default components")
|
|
|
|
|
|
@@ -262,7 +263,7 @@ async def generate_chat_stream(
|
|
|
model=ANTHROPIC_MODEL,
|
|
|
session_id=session_id,
|
|
|
mcp_tokens=parsed_tokens,
|
|
|
- components_prompt=available_components, # 动态组件提示
|
|
|
+ components_prompt=components_prompt, # 动态组件提示
|
|
|
enabled_mcp_list=enabled_mcp_list # 前端传递的已启用 MCP 列表
|
|
|
)
|
|
|
|
|
|
@@ -428,6 +429,7 @@ async def generate_chat_stream(
|
|
|
|
|
|
except Exception as e:
|
|
|
import traceback
|
|
|
+ log_error("app_fastapi.chat_error", e, {"endpoint": "/api/chat"})
|
|
|
yield f"event: error\ndata: {json_module.dumps({'error': str(e), 'traceback': traceback.format_exc()})}\n\n"
|
|
|
|
|
|
|
|
|
@@ -449,7 +451,7 @@ async def chat_stream(request: Request):
|
|
|
conversation_history = data.get('history', [])
|
|
|
session_id = request.headers.get('X-Session-ID')
|
|
|
mcp_tokens = request.headers.get('X-MCP-Tokens') # MCP tokens (JSON string)
|
|
|
- available_components = data.get('availableComponents') # 前端发送的组件列表
|
|
|
+ components_prompt = data.get('componentsPrompt') # 前端发送的组件列表
|
|
|
enabled_mcp_list = data.get('enabledMcpList') # 前端发送的已启用 MCP 列表
|
|
|
|
|
|
# 记录到 JSONL 文件
|
|
|
@@ -462,14 +464,14 @@ async def chat_stream(request: Request):
|
|
|
# DEBUG: 打印收到的 token
|
|
|
print(f"[DEBUG /api/chat/stream] mcp_tokens type: {type(mcp_tokens)}")
|
|
|
print(f"[DEBUG /api/chat/stream] mcp_tokens value: {mcp_tokens[:150] if mcp_tokens else 'None'}...")
|
|
|
- print(f"[DEBUG /api/chat/stream] available_components: {len(available_components) if available_components else 0} chars")
|
|
|
+ print(f"[DEBUG /api/chat/stream] components_prompt: {len(components_prompt) if components_prompt else 0} chars")
|
|
|
print(f"[DEBUG /api/chat/stream] enabled_mcp_list: {enabled_mcp_list}")
|
|
|
|
|
|
if not message:
|
|
|
raise HTTPException(status_code=400, detail="Message is required")
|
|
|
|
|
|
return StreamingResponse(
|
|
|
- generate_chat_stream(message, conversation_history, session_id, mcp_tokens, available_components, enabled_mcp_list),
|
|
|
+ generate_chat_stream(message, conversation_history, session_id, mcp_tokens, components_prompt, enabled_mcp_list),
|
|
|
media_type="text/event-stream",
|
|
|
headers={
|
|
|
'Cache-Control': 'no-cache',
|
|
|
@@ -481,6 +483,7 @@ async def chat_stream(request: Request):
|
|
|
raise
|
|
|
except Exception as e:
|
|
|
import traceback
|
|
|
+ log_error("app_fastapi.chat_stream_error", e, {"endpoint": "/api/chat/stream"})
|
|
|
return JSONResponse(
|
|
|
status_code=500,
|
|
|
content={
|
|
|
@@ -535,6 +538,7 @@ async def list_mcp_tools(
|
|
|
}
|
|
|
except Exception as e:
|
|
|
import traceback
|
|
|
+ log_error("app_fastapi.list_mcp_tools_error", e, {"endpoint": "/api/mcp/tools"})
|
|
|
return JSONResponse(
|
|
|
status_code=500,
|
|
|
content={
|
|
|
@@ -624,6 +628,7 @@ async def check_mcp_health(mcp_type: str):
|
|
|
|
|
|
except Exception as e:
|
|
|
import traceback
|
|
|
+ log_error("app_fastapi.check_mcp_health_error", e, {"endpoint": f"/api/mcp/health/{mcp_type}", "mcp_type": mcp_type})
|
|
|
return JSONResponse(
|
|
|
status_code=500,
|
|
|
content={
|
|
|
@@ -708,6 +713,7 @@ async def login(request: Request):
|
|
|
except HTTPException:
|
|
|
raise
|
|
|
except Exception as e:
|
|
|
+ log_error("app_fastapi.login_error", e, {"endpoint": "/api/auth/login"})
|
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
|
|
|
|
|
@@ -777,6 +783,7 @@ async def admin_login(request: Request):
|
|
|
except HTTPException:
|
|
|
raise
|
|
|
except Exception as e:
|
|
|
+ log_error("app_fastapi.admin_login_error", e, {"endpoint": "/api/auth/admin-login"})
|
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
|
|
|
|
|
@@ -849,6 +856,7 @@ async def register(request: Request):
|
|
|
except HTTPException:
|
|
|
raise
|
|
|
except Exception as e:
|
|
|
+ log_error("app_fastapi.register_error", e, {"endpoint": "/api/auth/register"})
|
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
|
|
|
|
|
@@ -864,6 +872,7 @@ async def logout(request: Request):
|
|
|
|
|
|
return {"success": True}
|
|
|
except Exception as e:
|
|
|
+ log_error("app_fastapi.logout_error", e, {"endpoint": "/api/auth/logout"})
|
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
|
|
|
|
|
@@ -938,6 +947,7 @@ async def test_mcp_get(
|
|
|
|
|
|
except Exception as e:
|
|
|
import traceback
|
|
|
+ log_error("app_fastapi.test_mcp_get_error", e, {"endpoint": "/api/test-mcp", "method": "GET", "tool_name": tool_name, "server_id": server_id})
|
|
|
print(f"[TEST-MCP GET] 异常: {e}")
|
|
|
traceback.print_exc()
|
|
|
return JSONResponse(
|
|
|
@@ -1021,6 +1031,7 @@ async def test_mcp_call(request: Request):
|
|
|
raise
|
|
|
except Exception as e:
|
|
|
import traceback
|
|
|
+ log_error("app_fastapi.test_mcp_post_error", e, {"endpoint": "/api/test-mcp", "method": "POST", "tool_name": tool_name, "server_id": server_id})
|
|
|
print(f"[TEST-MCP] 异常: {e}")
|
|
|
traceback.print_exc()
|
|
|
return JSONResponse(
|