summaryrefslogtreecommitdiff
path: root/backend/app/auth/routes.py
diff options
context:
space:
mode:
authorYurenHao0426 <blackhao0426@gmail.com>2026-02-13 03:02:36 +0000
committerYurenHao0426 <blackhao0426@gmail.com>2026-02-13 03:02:36 +0000
commit7d897ad9bb5ee46839ec91992cbbf4593168f119 (patch)
treeb4549f64176e93474b3b6c4b36294d30a46230b7 /backend/app/auth/routes.py
parent2f19d8cb84598e0822b525f5fb5c456c07448fb7 (diff)
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 <noreply@anthropic.com>
Diffstat (limited to 'backend/app/auth/routes.py')
-rw-r--r--backend/app/auth/routes.py14
1 files changed, 13 insertions, 1 deletions
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"}