diff --git a/app/app.py b/app/app.py index 3659708..37fb0db 100644 --- a/app/app.py +++ b/app/app.py @@ -418,6 +418,51 @@ def admin_conversations(email): # API # ================ +@app.route("/api/chat", methods=["POST"]) +@login_required +@rate_limited +def chat(): + data = request.json + model = data.get("model", "llama3.2") + messages = data.get("messages", []) + + url = f"{app.config['OLLAMA_BASE_URL']}/api/chat" + payload = {"model": model, "messages": messages} + + r = requests.post(url, json=payload) + r.raise_for_status() + + return jsonify(r.json()) + +@app.route("/api/chat/stream") +@login_required +@rate_limited +def chat_stream(): + model = request.args.get("model", "llama3.2") + cid = request.args.get("conversation_id") + + db = SessionLocal() + msgs = db.query(Message).filter_by(conversation_id=cid).order_by(Message.created_at).all() + db.close() + + chatml = [{"role": m.role, "content": m.content} for m in msgs] + + def generate(): + url = f"{app.config['OLLAMA_BASE_URL']}/api/chat" + payload = {"model": model, "messages": chatml, "stream": True} + + with requests.post(url, json=payload, stream=True) as r: + for line in r.iter_lines(): + if not line: + continue + data = json.loads(line.decode()) + token = data.get("message", {}).get("content", "") + yield f"data: {json.dumps({'token': token})}\n\n" + + return Response(generate(), mimetype="text/event-stream") + + + @app.route("/api/new_conversation", methods=["POST"]) @login_required