This commit is contained in:
2026-04-10 00:06:55 +03:00
parent f01e3b9040
commit 214c9495f3
2 changed files with 106 additions and 3 deletions

View File

@@ -18,8 +18,16 @@ def _env(name: str, default: str) -> str:
return value if value else default
# Example for local Ollama: http://localhost:11434/api/generate
# Example: http://host:11434/api/generate — для чата берётся тот же хост + /api/chat
OLLAMA_API_URL = _env("OLLAMA_API_URL", "http://host.docker.internal:11434/api/generate")
def _ollama_chat_url() -> str:
base = OLLAMA_API_URL.replace("/api/generate", "").rstrip("/")
return f"{base}/api/chat"
OLLAMA_CHAT_URL = _env("OLLAMA_CHAT_URL", _ollama_chat_url())
REQUIRE_AUTH_FOR_GENERATE = _env("REQUIRE_AUTH_FOR_GENERATE", "true").lower() in ("1", "true", "yes", "on")
from backend.auth import ( # noqa: E402
@@ -40,6 +48,16 @@ class GenerationRequest(BaseModel):
model: str = "codellama"
class ChatMessageIn(BaseModel):
role: str
content: str
class ChatRequest(BaseModel):
model: str
messages: list[ChatMessageIn]
def validate_config(config_text: str):
try:
yaml.safe_load(config_text)
@@ -151,6 +169,38 @@ 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.post("/chat")
def chat_with_ollama(
req: ChatRequest,
user: User | None = Depends(get_current_user) if REQUIRE_AUTH_FOR_GENERATE else None,
):
if not req.messages:
raise HTTPException(status_code=400, detail="messages must not be empty")
for m in req.messages:
if m.role not in ("user", "assistant", "system"):
raise HTTPException(status_code=400, detail=f"invalid role: {m.role}")
payload = {
"model": req.model,
"messages": [{"role": m.role, "content": m.content} for m in req.messages],
"stream": False,
}
try:
response = requests.post(OLLAMA_CHAT_URL, json=payload, timeout=120)
response.raise_for_status()
data = response.json()
msg = data.get("message") or {}
content = msg.get("content", "")
if not content and isinstance(data.get("response"), str):
content = data["response"]
return {"role": "assistant", "content": content}
except requests.HTTPError as e:
detail = e.response.text if e.response is not None else str(e)
raise HTTPException(status_code=502, detail=f"Ollama HTTP error: {detail}")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Ollama error: {str(e)}")
@app.post("/generate")
async def generate_pipeline(
req: GenerationRequest,