From 42805ac7894d62996d68e4038c37900b26a14a9e Mon Sep 17 00:00:00 2001 From: hlohaus <983577+hlohaus@users.noreply.github.com> Date: Sun, 26 Jan 2025 16:32:32 +0100 Subject: Add leagcy port to docker-compose files Update demo model list Disable upload cookies in demo Track usage in demo mode Add messages without asking the ai Add hint for browser usage in provider list Add qwen2 prompt template to HuggingFace provider Trim automatic messages in HuggingFaceAPI --- g4f/gui/server/api.py | 1 + g4f/gui/server/backend_api.py | 71 +++++++++++++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 19 deletions(-) (limited to 'g4f/gui/server') diff --git a/g4f/gui/server/api.py b/g4f/gui/server/api.py index 748a3280..a21f7128 100644 --- a/g4f/gui/server/api.py +++ b/g4f/gui/server/api.py @@ -65,6 +65,7 @@ class Api: "parent": getattr(provider, "parent", None), "image": bool(getattr(provider, "image_models", False)), "vision": getattr(provider, "default_vision_model", None) is not None, + "nodriver": getattr(provider, "use_nodriver", False), "auth": provider.needs_auth, "login_url": getattr(provider, "login_url", None), } for provider in __providers__ if provider.working] diff --git a/g4f/gui/server/backend_api.py b/g4f/gui/server/backend_api.py index 9c2d5261..8d9b4f2d 100644 --- a/g4f/gui/server/backend_api.py +++ b/g4f/gui/server/backend_api.py @@ -7,6 +7,7 @@ import logging import asyncio import shutil import random +import datetime from flask import Flask, Response, request, jsonify from typing import Generator from pathlib import Path @@ -61,7 +62,7 @@ class Backend_Api(Api): """ self.app: Flask = app - if has_flask_limiter: + if has_flask_limiter and app.demo: limiter = Limiter( get_remote_address, app=app, @@ -71,8 +72,8 @@ class Backend_Api(Api): else: class Dummy(): def limit(self, value): - def callback(v): - return v + def callback(value): + return value return callback limiter = Dummy() @@ -111,7 +112,7 @@ class Backend_Api(Api): for model, providers in models.demo_models.values()] @app.route('/backend-api/v2/conversation', methods=['POST']) - @limiter.limit("4 per minute") + @limiter.limit("4 per minute") # 1 request in 15 seconds def handle_conversation(): """ Handles conversation requests and streams responses back. @@ -150,6 +151,41 @@ class Backend_Api(Api): mimetype='text/event-stream' ) + @app.route('/backend-api/v2/usage', methods=['POST']) + def add_usage(): + cache_dir = Path(get_cookies_dir()) / ".usage" + cache_file = cache_dir / f"{datetime.date.today()}.jsonl" + cache_dir.mkdir(parents=True, exist_ok=True) + with cache_file.open("a" if cache_file.exists() else "w") as f: + f.write(f"{json.dumps(request.json)}\n") + return {} + + @app.route('/backend-api/v2/memory', methods=['POST']) + def add_memory(): + api_key = request.headers.get("x_api_key") + json_data = request.json + from mem0 import MemoryClient + client = MemoryClient(api_key=api_key) + client.add( + [{"role": item["role"], "content": item["content"]} for item in json_data.get("items")], + user_id="user", + metadata={"conversation_id": json_data.get("id"), "title": json_data.get("title")} + ) + return {"count": len(json_data.get("items"))} + + @app.route('/backend-api/v2/memory/', methods=['GET']) + def read_memory(user_id: str): + api_key = request.headers.get("x_api_key") + from mem0 import MemoryClient + client = MemoryClient(api_key=api_key) + if request.args.search: + return client.search( + request.args.search, + user_id=user_id, + metadata=json.loads(request.args.metadata) if request.args.metadata else None + ) + return {} + self.routes = { '/backend-api/v2/version': { 'function': self.get_version, @@ -159,10 +195,6 @@ class Backend_Api(Api): 'function': self.handle_synthesize, 'methods': ['GET'] }, - '/backend-api/v2/upload_cookies': { - 'function': self.upload_cookies, - 'methods': ['POST'] - }, '/images/': { 'function': self.serve_images, 'methods': ['GET'] @@ -301,17 +333,18 @@ class Backend_Api(Api): except Exception as e: return jsonify({"error": {"message": f"Error uploading file: {str(e)}"}}), 500 - def upload_cookies(self): - file = None - if "file" in request.files: - file = request.files['file'] - if file.filename == '': - return 'No selected file', 400 - if file and file.filename.endswith(".json") or file.filename.endswith(".har"): - filename = secure_filename(file.filename) - file.save(os.path.join(get_cookies_dir(), filename)) - return "File saved", 200 - return 'Not supported file', 400 + @app.route('/backend-api/v2/upload_cookies', methods=['POST']) + def upload_cookies(self): + file = None + if "file" in request.files: + file = request.files['file'] + if file.filename == '': + return 'No selected file', 400 + if file and file.filename.endswith(".json") or file.filename.endswith(".har"): + filename = secure_filename(file.filename) + file.save(os.path.join(get_cookies_dir(), filename)) + return "File saved", 200 + return 'Not supported file', 400 def handle_synthesize(self, provider: str): try: -- cgit v1.2.3