From 7d897ad9bb5ee46839ec91992cbbf4593168f119 Mon Sep 17 00:00:00 2001 From: YurenHao0426 Date: Fri, 13 Feb 2026 03:02:36 +0000 Subject: Add Claude provider, OpenRouter fallback, and GFM markdown support - Add Claude (Anthropic) as third LLM provider with streaming support - Add OpenRouter as transparent fallback when official API keys are missing or fail - Add remark-gfm to ReactMarkdown for table/strikethrough rendering - Claude models: sonnet-4.5, opus-4, opus-4.5, opus-4.6 - Backend: new stream_claude(), stream_openrouter(), provider routing, API key CRUD - Frontend: model selectors, API key inputs for Claude and OpenRouter - Auto-migration for new DB columns (claude_api_key, openrouter_api_key) Co-Authored-By: Claude Opus 4.6 --- backend/app/auth/routes.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'backend/app/auth/routes.py') diff --git a/backend/app/auth/routes.py b/backend/app/auth/routes.py index 3c906b5..eaf897e 100644 --- a/backend/app/auth/routes.py +++ b/backend/app/auth/routes.py @@ -228,14 +228,20 @@ async def get_api_keys(current_user: User = Depends(get_current_user)): return { "openai_api_key": mask_key(current_user.openai_api_key), "gemini_api_key": mask_key(current_user.gemini_api_key), + "claude_api_key": mask_key(current_user.claude_api_key), + "openrouter_api_key": mask_key(current_user.openrouter_api_key), "has_openai_key": bool(current_user.openai_api_key), "has_gemini_key": bool(current_user.gemini_api_key), + "has_claude_key": bool(current_user.claude_api_key), + "has_openrouter_key": bool(current_user.openrouter_api_key), } class ApiKeysUpdate(BaseModel): openai_api_key: Optional[str] = None gemini_api_key: Optional[str] = None + claude_api_key: Optional[str] = None + openrouter_api_key: Optional[str] = None @router.post("/api-keys") @@ -253,7 +259,13 @@ async def update_api_keys( if keys.gemini_api_key is not None: current_user.gemini_api_key = keys.gemini_api_key if keys.gemini_api_key else None - + + if keys.claude_api_key is not None: + current_user.claude_api_key = keys.claude_api_key if keys.claude_api_key else None + + if keys.openrouter_api_key is not None: + current_user.openrouter_api_key = keys.openrouter_api_key if keys.openrouter_api_key else None + db.commit() return {"message": "API keys updated successfully"} -- cgit v1.2.3