55 lines
2.3 KiB
Python
55 lines
2.3 KiB
Python
from fastapi import APIRouter, Cookie, HTTPException
|
|
|
|
from app.db import chat_assistant_db
|
|
from app.services.chat_assistant import answer_chat
|
|
from app.web.shared import ChatSendRequest, ChatSessionRequest, require_api_user_with_subscription
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/api/chat/bootstrap")
|
|
async def api_chat_bootstrap(altcoin_session: str = Cookie(default="")):
|
|
user = require_api_user_with_subscription(altcoin_session)
|
|
return chat_assistant_db.bootstrap_chat(user["id"])
|
|
|
|
|
|
@router.get("/api/chat/sessions")
|
|
async def api_chat_sessions(limit: int = 20, offset: int = 0, altcoin_session: str = Cookie(default="")):
|
|
user = require_api_user_with_subscription(altcoin_session)
|
|
return chat_assistant_db.list_chat_sessions(user["id"], limit=limit, offset=offset)
|
|
|
|
|
|
@router.post("/api/chat/sessions")
|
|
async def api_chat_create_session(req: ChatSessionRequest, altcoin_session: str = Cookie(default="")):
|
|
user = require_api_user_with_subscription(altcoin_session)
|
|
return {"ok": True, "session": chat_assistant_db.create_chat_session(user["id"], title=req.title)}
|
|
|
|
|
|
@router.get("/api/chat/sessions/{session_id}")
|
|
async def api_chat_session_detail(session_id: int, altcoin_session: str = Cookie(default="")):
|
|
user = require_api_user_with_subscription(altcoin_session)
|
|
session = chat_assistant_db.get_chat_session(session_id, user["id"])
|
|
if not session:
|
|
raise HTTPException(status_code=404, detail="对话不存在")
|
|
messages = chat_assistant_db.list_chat_messages(session_id, user["id"], limit=200)
|
|
return {"ok": True, "session": session, "messages": messages}
|
|
|
|
|
|
@router.delete("/api/chat/sessions/{session_id}")
|
|
async def api_chat_archive_session(session_id: int, altcoin_session: str = Cookie(default="")):
|
|
user = require_api_user_with_subscription(altcoin_session)
|
|
session = chat_assistant_db.update_chat_session(session_id, user["id"], archived_at="now")
|
|
if not session:
|
|
raise HTTPException(status_code=404, detail="对话不存在")
|
|
return {"ok": True}
|
|
|
|
|
|
@router.post("/api/chat/send")
|
|
async def api_chat_send(req: ChatSendRequest, altcoin_session: str = Cookie(default="")):
|
|
user = require_api_user_with_subscription(altcoin_session)
|
|
try:
|
|
return answer_chat(user["id"], req.message, session_id=req.session_id)
|
|
except ValueError as exc:
|
|
raise HTTPException(status_code=400, detail=str(exc))
|