From 7e99ee652ad000608d7f4b5e413167bd5126ac68 Mon Sep 17 00:00:00 2001 From: Renato Rosa Date: Wed, 19 Aug 2026 20:34:02 -0300 Subject: [PATCH] Atualizar app/app.py --- app/app.py | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/app/app.py b/app/app.py index 8ee39ff..089c2fc 100644 --- a/app/app.py +++ b/app/app.py @@ -1,3 +1,89 @@ +import json +import requests +from flask import Flask, Response, request, jsonify, session, redirect, url_for +from authlib.integrations.flask_client import OAuth +from functools import wraps + +from config import Config +from chat_store import ChatStore + +app = Flask(__name__) +app.config.from_object(Config) +app.secret_key = app.config["SECRET_KEY"] + +store = ChatStore() + +oauth = OAuth(app) +google = oauth.register( + name="google", + client_id=app.config["GOOGLE_CLIENT_ID"], + client_secret=app.config["GOOGLE_CLIENT_SECRET"], + access_token_url="https://oauth2.googleapis.com/token", + authorize_url="https://accounts.google.com/o/oauth2/v2/auth", + api_base_url="https://www.googleapis.com/oauth2/v2/", + client_kwargs={"scope": "openid email profile"}, +) + +def login_required(f): + @wraps(f) + def wrapper(*args, **kwargs): + if "user" not in session: + return redirect(url_for("login")) + return f(*args, **kwargs) + return wrapper + +@app.route("/login") +def login(): + return google.authorize_redirect(app.config["GOOGLE_REDIRECT_URI"]) + +@app.route("/oauth/callback") +def oauth_callback(): + token = google.authorize_access_token() + user_info = google.get("userinfo").json() + session["user"] = user_info + return redirect("/") + +@app.route("/api/new_conversation") +@login_required +def new_conversation(): + cid = store.new_conversation() + return jsonify({"conversation_id": cid}) + +@app.route("/api/history/") +@login_required +def history(cid): + return jsonify(store.get_messages(cid)) + +@app.route("/api/stream") +@login_required +def stream(): + cid = request.args.get("conversation_id") + model = request.args.get("model", "llama3.2") + prompt = request.args.get("prompt") + + store.add_message(cid, "user", prompt) + + def generate(): + url = f"{app.config['OLLAMA_BASE_URL']}/api/generate" + payload = {"model": model, "prompt": prompt, "stream": True} + + with requests.post(url, json=payload, stream=True) as r: + for line in r.iter_lines(): + if not line: + continue + try: + data = json.loads(line.decode()) + token = data.get("response", "") + store.add_message(cid, "assistant", token) + yield f"data: {json.dumps({'token': token})}\n\n" + except: + continue + + return Response(generate(), mimetype="text/event-stream") + + +# *** + import os import json import requests