update
This commit is contained in:
@@ -6,7 +6,7 @@ import requests
|
||||
import yaml
|
||||
from fastapi import Depends, FastAPI, HTTPException
|
||||
from pydantic import BaseModel
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy import delete, select
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
@@ -39,7 +39,7 @@ from backend.auth import ( # noqa: E402
|
||||
verify_password,
|
||||
)
|
||||
from backend.db import engine, get_db # noqa: E402
|
||||
from backend.models import Base, User # noqa: E402
|
||||
from backend.models import Base, User, UserChatMessage # noqa: E402
|
||||
|
||||
|
||||
class GenerationRequest(BaseModel):
|
||||
@@ -169,9 +169,46 @@ def me(user: User = Depends(get_current_user)):
|
||||
return {"id": str(user.id), "email": user.email, "full_name": user.full_name, "is_admin": user.is_admin}
|
||||
|
||||
|
||||
@app.get("/chat/history")
|
||||
def chat_history(
|
||||
limit: int = 500,
|
||||
db: Session = Depends(get_db),
|
||||
user: User | None = Depends(get_current_user) if REQUIRE_AUTH_FOR_GENERATE else None,
|
||||
):
|
||||
if user is None:
|
||||
return {"messages": []}
|
||||
lim = max(1, min(limit, 2000))
|
||||
rows = (
|
||||
db.execute(
|
||||
select(UserChatMessage)
|
||||
.where(UserChatMessage.user_id == user.id)
|
||||
.order_by(UserChatMessage.created_at.asc())
|
||||
.limit(lim)
|
||||
)
|
||||
.scalars()
|
||||
.all()
|
||||
)
|
||||
return {
|
||||
"messages": [{"role": r.role, "content": r.content} for r in rows],
|
||||
}
|
||||
|
||||
|
||||
@app.delete("/chat/history")
|
||||
def chat_history_clear(
|
||||
db: Session = Depends(get_db),
|
||||
user: User | None = Depends(get_current_user) if REQUIRE_AUTH_FOR_GENERATE else None,
|
||||
):
|
||||
if user is None:
|
||||
return {"ok": True}
|
||||
db.execute(delete(UserChatMessage).where(UserChatMessage.user_id == user.id))
|
||||
db.commit()
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@app.post("/chat")
|
||||
def chat_with_ollama(
|
||||
req: ChatRequest,
|
||||
db: Session = Depends(get_db),
|
||||
user: User | None = Depends(get_current_user) if REQUIRE_AUTH_FOR_GENERATE else None,
|
||||
):
|
||||
if not req.messages:
|
||||
@@ -193,6 +230,29 @@ def chat_with_ollama(
|
||||
content = msg.get("content", "")
|
||||
if not content and isinstance(data.get("response"), str):
|
||||
content = data["response"]
|
||||
|
||||
if user is not None:
|
||||
last = req.messages[-1]
|
||||
if last.role == "user":
|
||||
try:
|
||||
db.add(
|
||||
UserChatMessage(
|
||||
user_id=user.id,
|
||||
role="user",
|
||||
content=last.content,
|
||||
)
|
||||
)
|
||||
db.add(
|
||||
UserChatMessage(
|
||||
user_id=user.id,
|
||||
role="assistant",
|
||||
content=content,
|
||||
)
|
||||
)
|
||||
db.commit()
|
||||
except SQLAlchemyError:
|
||||
db.rollback()
|
||||
|
||||
return {"role": "assistant", "content": content}
|
||||
except requests.HTTPError as e:
|
||||
detail = e.response.text if e.response is not None else str(e)
|
||||
|
||||
Reference in New Issue
Block a user