update llm_api and api server:

1. fastchat's controller/model_worker/api_server use swagger UI offline.
2. add custom title and icon.
3. remove fastapi-offline dependence
This commit is contained in:
liunux4odoo 2023-08-16 14:20:09 +08:00
parent 67b8ebef52
commit f64affc930
6 changed files with 96 additions and 13 deletions

View File

@ -5,7 +5,6 @@ fschat==0.2.20
transformers transformers
torch~=2.0.0 torch~=2.0.0
fastapi~=0.99.1 fastapi~=0.99.1
fastapi-offline
nltk~=3.8.1 nltk~=3.8.1
uvicorn~=0.23.1 uvicorn~=0.23.1
starlette~=0.27.0 starlette~=0.27.0

View File

@ -5,7 +5,6 @@ fschat==0.2.20
transformers transformers
torch~=2.0.0 torch~=2.0.0
fastapi~=0.99.1 fastapi~=0.99.1
fastapi-offline
nltk~=3.8.1 nltk~=3.8.1
uvicorn~=0.23.1 uvicorn~=0.23.1
starlette~=0.27.0 starlette~=0.27.0

View File

@ -7,7 +7,6 @@ sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from configs.model_config import NLTK_DATA_PATH, OPEN_CROSS_DOMAIN from configs.model_config import NLTK_DATA_PATH, OPEN_CROSS_DOMAIN
import argparse import argparse
import uvicorn import uvicorn
from server.utils import FastAPIOffline as FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from starlette.responses import RedirectResponse from starlette.responses import RedirectResponse
from server.chat import (chat, knowledge_base_chat, openai_chat, from server.chat import (chat, knowledge_base_chat, openai_chat,
@ -16,7 +15,7 @@ from server.knowledge_base.kb_api import list_kbs, create_kb, delete_kb
from server.knowledge_base.kb_doc_api import (list_docs, upload_doc, delete_doc, from server.knowledge_base.kb_doc_api import (list_docs, upload_doc, delete_doc,
update_doc, download_doc, recreate_vector_store, update_doc, download_doc, recreate_vector_store,
search_docs, DocumentWithScore) search_docs, DocumentWithScore)
from server.utils import BaseResponse, ListResponse from server.utils import BaseResponse, ListResponse, FastAPI, MakeFastAPIOffline
from typing import List from typing import List
@ -28,7 +27,8 @@ async def document():
def create_app(): def create_app():
app = FastAPI() app = FastAPI(title="Langchain-Chatchat API Server")
MakeFastAPIOffline(app)
# Add CORS middleware to allow all origins # Add CORS middleware to allow all origins
# 在config.py中设置OPEN_DOMAIN=True允许跨域 # 在config.py中设置OPEN_DOMAIN=True允许跨域
# set OPEN_DOMAIN=True in config.py to allow cross-domain # set OPEN_DOMAIN=True in config.py to allow cross-domain

View File

@ -4,6 +4,8 @@ import os
sys.path.append(os.path.dirname(os.path.dirname(__file__))) sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from configs.model_config import llm_model_dict, LLM_MODEL, LLM_DEVICE, LOG_PATH, logger from configs.model_config import llm_model_dict, LLM_MODEL, LLM_DEVICE, LOG_PATH, logger
from server.utils import MakeFastAPIOffline
host_ip = "0.0.0.0" host_ip = "0.0.0.0"
controller_port = 20001 controller_port = 20001
@ -30,6 +32,8 @@ def create_controller_app(
controller = Controller(dispatch_method) controller = Controller(dispatch_method)
sys.modules["fastchat.serve.controller"].controller = controller sys.modules["fastchat.serve.controller"].controller = controller
MakeFastAPIOffline(app)
app.title = "FastChat Controller"
return app return app
@ -55,7 +59,6 @@ def create_model_worker_app(
import fastchat.constants import fastchat.constants
fastchat.constants.LOGDIR = LOG_PATH fastchat.constants.LOGDIR = LOG_PATH
from fastchat.serve.model_worker import app, GptqConfig, ModelWorker, worker_id from fastchat.serve.model_worker import app, GptqConfig, ModelWorker, worker_id
from fastchat.serve import model_worker
import argparse import argparse
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
@ -117,6 +120,8 @@ def create_model_worker_app(
sys.modules["fastchat.serve.model_worker"].args = args sys.modules["fastchat.serve.model_worker"].args = args
sys.modules["fastchat.serve.model_worker"].gptq_config = gptq_config sys.modules["fastchat.serve.model_worker"].gptq_config = gptq_config
MakeFastAPIOffline(app)
app.title = f"FastChat LLM Server ({LLM_MODEL})"
return app return app
@ -141,6 +146,8 @@ def create_openai_api_app(
app_settings.controller_address = controller_address app_settings.controller_address = controller_address
app_settings.api_keys = api_keys app_settings.api_keys = api_keys
MakeFastAPIOffline(app)
app.title = "FastChat OpeanAI API Server"
return app return app

View File

@ -2,14 +2,10 @@ import pydantic
from pydantic import BaseModel from pydantic import BaseModel
from typing import List from typing import List
import torch import torch
from fastapi_offline import FastAPIOffline from fastapi import FastAPI
import fastapi_offline
from pathlib import Path from pathlib import Path
import asyncio import asyncio
from typing import Any, Optional
# patch fastapi_offline to use local static assests
fastapi_offline.core._STATIC_PATH = Path(__file__).parent / "static"
class BaseResponse(BaseModel): class BaseResponse(BaseModel):
@ -112,3 +108,81 @@ def iter_over_async(ait, loop):
if done: if done:
break break
yield obj yield obj
def MakeFastAPIOffline(
app: FastAPI,
static_dir = Path(__file__).parent / "static",
static_url = "/static-offline-docs",
docs_url: Optional[str] = "/docs",
redoc_url: Optional[str] = "/redoc",
) -> None:
"""patch the FastAPI obj that doesn't rely on CDN for the documentation page"""
from fastapi import Request
from fastapi.openapi.docs import (
get_redoc_html,
get_swagger_ui_html,
get_swagger_ui_oauth2_redirect_html,
)
from fastapi.staticfiles import StaticFiles
from starlette.responses import HTMLResponse
openapi_url = app.openapi_url
swagger_ui_oauth2_redirect_url = app.swagger_ui_oauth2_redirect_url
def remove_route(url: str) -> None:
'''
remove original route from app
'''
index = None
for i, r in enumerate(app.routes):
if r.path.lower() == url.lower():
index = i
break
if isinstance(index, int):
app.routes.pop(i)
# Set up static file mount
app.mount(
static_url,
StaticFiles(directory=Path(static_dir).as_posix()),
name="static-offline-docs",
)
if docs_url is not None:
remove_route(docs_url)
remove_route(swagger_ui_oauth2_redirect_url)
# Define the doc and redoc pages, pointing at the right files
@app.get(docs_url, include_in_schema=False)
async def custom_swagger_ui_html(request: Request) -> HTMLResponse:
root = request.scope.get("root_path")
favicon = f"{root}{static_url}/favicon.png"
return get_swagger_ui_html(
openapi_url=f"{root}{openapi_url}",
title=app.title + " - Swagger UI",
oauth2_redirect_url=swagger_ui_oauth2_redirect_url,
swagger_js_url=f"{root}{static_url}/swagger-ui-bundle.js",
swagger_css_url=f"{root}{static_url}/swagger-ui.css",
swagger_favicon_url=favicon,
)
@app.get(swagger_ui_oauth2_redirect_url, include_in_schema=False)
async def swagger_ui_redirect() -> HTMLResponse:
return get_swagger_ui_oauth2_redirect_html()
if redoc_url is not None:
remove_route(redoc_url)
@app.get(redoc_url, include_in_schema=False)
async def redoc_html(request: Request) -> HTMLResponse:
root = request.scope.get("root_path")
favicon = f"{root}{static_url}/favicon.png"
return get_redoc_html(
openapi_url=f"{root}{openapi_url}",
title=app.title + " - ReDoc",
redoc_js_url=f"{root}{static_url}/redoc.standalone.js",
with_google_fonts=False,
redoc_favicon_url=favicon,
)

View File

@ -13,7 +13,11 @@ import os
api = ApiRequest(base_url="http://127.0.0.1:7861", no_remote_api=False) api = ApiRequest(base_url="http://127.0.0.1:7861", no_remote_api=False)
if __name__ == "__main__": if __name__ == "__main__":
st.set_page_config("Langchain-Chatchat WebUI", initial_sidebar_state="expanded") st.set_page_config(
"Langchain-Chatchat WebUI",
os.path.join("img", "chatchat_icon_blue_square_v2.png"),
initial_sidebar_state="expanded",
)
if not chat_box.chat_inited: if not chat_box.chat_inited:
st.toast( st.toast(