ForcePilot/src/api.py
2024-07-14 16:42:38 +08:00

84 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import json
from flask import Flask, jsonify, Response, request
from flask_cors import CORS
from dotenv import load_dotenv
from core import HistoryManager
from core import Retriever
from config import Config
from models import select_model
from utils.logging_config import setup_logger
load_dotenv()
logger = setup_logger("server")
config = Config("config/base.yaml")
model = select_model(config)
retriever = Retriever(config)
apps = Flask(__name__)# 这段代码是为了解决跨域问题Flask默认不支持跨域
CORS(apps, resources=r'/*')# CORS的用法是
@apps.route('/', methods=["GET"])
def route_index():
return jsonify({"message": "You Got It!"})
@apps.errorhandler(404)
def page_not_found(e):
return jsonify({"message": "DEBUG: " + str(e)}), 404
@apps.errorhandler(403)
def page_not_found(e):
return jsonify({"message": str(e)}), 403
@apps.route('/', methods=['GET'])
def chat_get():
return "Chat Get!"
@apps.route('/chat', methods=['POST'])
def chat():
request_data = json.loads(request.data)
query = request_data['query']
logger.debug(f"Web query: {query}")
new_query, refs = retriever(query)
history_manager = HistoryManager(request_data['history'])
messages = history_manager.get_history_with_msg(new_query)
history_manager.add_user(query)
logger.debug(f"Web history: {history_manager}")
def generate_response():
content = ""
for delta in model.predict(messages, stream=True):
content += delta.content
response_chunk = json.dumps({
"history": history_manager.update_ai(content),
"response": content,
"refs": refs # TODO: 优化 refs不需要每次都返回
}, ensure_ascii=False).encode('utf8') + b'\n'
yield response_chunk
return Response(generate_response(), content_type='application/json', status=200)
@apps.route('/call', methods=['POST'])
def call():
request_data = json.loads(request.data)
query = request_data['query']
logger.debug(f"Web query: {query}")
response = model.predict(query, stream=False)
return jsonify({
"response": response.content,
})
if __name__ == '__main__':
print("Starting model...")
apps.secret_key = os.urandom(24)
apps.run(host='0.0.0.0', port=8000, debug=True, threaded=True)