Atualizar app/app.py
This commit is contained in:
+81
-4
@@ -37,10 +37,31 @@ def notifications(ws):
|
|||||||
# ================
|
# ================
|
||||||
# DECORATORS
|
# DECORATORS
|
||||||
# ================
|
# ================
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
def make_cache_key(model, prompt):
|
||||||
|
raw = f"{model}:{prompt}"
|
||||||
|
return hashlib.sha256(raw.encode()).hexdigest()
|
||||||
|
|
||||||
|
def get_cache(model, prompt):
|
||||||
|
key = make_cache_key(model, prompt)
|
||||||
|
db = SessionLocal()
|
||||||
|
entry = db.query(Cache).filter_by(key=key).first()
|
||||||
|
db.close()
|
||||||
|
return entry.response if entry else None
|
||||||
|
|
||||||
|
def set_cache(model, prompt, response):
|
||||||
|
key = make_cache_key(model, prompt)
|
||||||
|
db = SessionLocal()
|
||||||
|
entry = Cache(key=key, model=model, response=response)
|
||||||
|
db.add(entry)
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
|
|
||||||
logger = structlog.get_logger()
|
logger = structlog.get_logger()
|
||||||
|
|
||||||
@app.before_request
|
@app.before_request
|
||||||
def log_request():
|
def log_request():
|
||||||
logger.info(
|
logger.info(
|
||||||
@@ -1013,9 +1034,65 @@ def generate():
|
|||||||
# return jsonify({"error": "Invalid JSON response from Ollama."}), 502
|
# return jsonify({"error": "Invalid JSON response from Ollama."}), 502
|
||||||
#output_text = ollama_data.get("response") or ollama_data.get("output") or ""
|
#output_text = ollama_data.get("response") or ollama_data.get("output") or ""
|
||||||
#return jsonify({"model": model_name, "output": output_text})
|
#return jsonify({"model": model_name, "output": output_text})
|
||||||
|
|
||||||
|
cached = get_cache(model, prompt)
|
||||||
|
if cached:
|
||||||
|
return jsonify({"model": model, "output": cached, "cached": True})
|
||||||
|
|
||||||
result, used_model = call_ollama_with_fallback({"prompt": prompt})
|
result, used_model = call_ollama_with_fallback({"prompt": prompt})
|
||||||
return jsonify({"model_used": used_model, "output": result.get("response")})
|
output = result.get("response")
|
||||||
|
|
||||||
|
set_cache(used_model, prompt, output)
|
||||||
|
|
||||||
|
return jsonify({"model": used_model, "output": output, "cached": False})
|
||||||
|
|
||||||
|
@app.route("/api/multi", methods=["POST"])
|
||||||
|
@login_required
|
||||||
|
@rate_limited
|
||||||
|
def multi():
|
||||||
|
data = request.json
|
||||||
|
models = data.get("models", ["llama3.2", "gemma4"])
|
||||||
|
prompt = data.get("prompt")
|
||||||
|
|
||||||
|
results = {}
|
||||||
|
|
||||||
|
for m in models:
|
||||||
|
try:
|
||||||
|
r = requests.post(
|
||||||
|
f"{app.config['OLLAMA_BASE_URL']}/api/generate",
|
||||||
|
json={"model": m, "prompt": prompt}
|
||||||
|
)
|
||||||
|
r.raise_for_status()
|
||||||
|
results[m] = r.json().get("response")
|
||||||
|
except Exception as e:
|
||||||
|
results[m] = f"Error: {str(e)}"
|
||||||
|
|
||||||
|
return jsonify(results)
|
||||||
|
|
||||||
|
@app.route("/api/multi/stream")
|
||||||
|
@login_required
|
||||||
|
def multi_stream():
|
||||||
|
models = request.args.get("models", "llama3.2,gemma4").split(",")
|
||||||
|
prompt = request.args.get("prompt")
|
||||||
|
|
||||||
|
def generate():
|
||||||
|
for m in models:
|
||||||
|
yield f"event: model\n"
|
||||||
|
yield f"data: {json.dumps({'model': m})}\n\n"
|
||||||
|
|
||||||
|
url = f"{app.config['OLLAMA_BASE_URL']}/api/generate"
|
||||||
|
payload = {"model": m, "prompt": prompt, "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("response", "")
|
||||||
|
yield f"event: token\n"
|
||||||
|
yield f"data: {json.dumps({'model': m, 'token': token})}\n\n"
|
||||||
|
|
||||||
|
return Response(generate(), mimetype="text/event-stream")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user