diff --git a/main.py b/main.py index 10ff932..7480f82 100644 --- a/main.py +++ b/main.py @@ -1,60 +1,4 @@ -from typing import Annotated, Union - -from fastapi import FastAPI, Request, status, Form -from fastapi.responses import JSONResponse - -from src.dotchain.runtime.interpreter import program_parser -from src.dotchain.runtime.tokenizer import Tokenizer -from src.dotchain.runtime.runtime import Runtime -from src.blackbox.blackbox_factory import BlackboxFactory import uvicorn -from fastapi.middleware.cors import CORSMiddleware -from injector import Injector - -app = FastAPI() - -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - -injector = Injector() -blackbox_factory = injector.get(BlackboxFactory) - -@app.post("/") -async def blackbox(blackbox_name: Union[str, None] = None, request: Request = None): - if not blackbox_name: - return await JSONResponse(content={"error": "blackbox_name is required"}, status_code=status.HTTP_400_BAD_REQUEST) - try: - box = blackbox_factory.create_blackbox(blackbox_name) - except ValueError: - return await JSONResponse(content={"error": "value error"}, status_code=status.HTTP_400_BAD_REQUEST) - return await box.fast_api_handler(request) - -def read_form_image(request: Request): - async def inner(field: str): - print(field) - return "image" - return inner - -def read_form_text(request: Request): - def inner(field: str): - print(field) - return "text" - return inner - -@app.post("/workflows") -async def workflows(script: Annotated[str, Form()], request: Request=None): - dsl_runtime = Runtime(exteral_fun={"print": print, - 'read_form_image': read_form_image(request), - "read_form_text": read_form_text(request)}) - t = Tokenizer() - t.init(script) - ast = program_parser(t) - ast.exec(dsl_runtime) if __name__ == "__main__": - uvicorn.run("main:app", host="0.0.0.0", port=8000, log_level="info") + uvicorn.run("router:app", host="0.0.0.0", port=8000, log_level="info") diff --git a/router.py b/router.py new file mode 100644 index 0000000..fc8c3fd --- /dev/null +++ b/router.py @@ -0,0 +1,35 @@ +from typing import Annotated, Union + +from fastapi import FastAPI, Request, status, Form +from fastapi.responses import JSONResponse + +from src.dotchain.runtime.interpreter import program_parser +from src.dotchain.runtime.tokenizer import Tokenizer +from src.dotchain.runtime.runtime import Runtime +from src.blackbox.blackbox_factory import BlackboxFactory +import uvicorn +from fastapi.middleware.cors import CORSMiddleware +from injector import Injector + +app = FastAPI() + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +injector = Injector() +blackbox_factory = injector.get(BlackboxFactory) + +@app.post("/") +async def blackbox(blackbox_name: Union[str, None] = None, request: Request = None): + if not blackbox_name: + return await JSONResponse(content={"error": "blackbox_name is required"}, status_code=status.HTTP_400_BAD_REQUEST) + try: + box = blackbox_factory.call_blackbox(blackbox_name) + except ValueError: + return await JSONResponse(content={"error": "value error"}, status_code=status.HTTP_400_BAD_REQUEST) + return await box.fast_api_handler(request) diff --git a/src/blackbox/asr.py b/src/blackbox/asr.py index ad7ca81..4f92659 100644 --- a/src/blackbox/asr.py +++ b/src/blackbox/asr.py @@ -7,7 +7,9 @@ from fastapi.responses import JSONResponse from ..asr.rapid_paraformer.utils import read_yaml from ..asr.rapid_paraformer import RapidParaformer from .blackbox import Blackbox +from injector import singleton +@singleton class ASR(Blackbox): def __init__(self, path = ".env.yaml") -> None: diff --git a/src/blackbox/audio_chat.py b/src/blackbox/audio_chat.py index 091c78e..cf5fb71 100644 --- a/src/blackbox/audio_chat.py +++ b/src/blackbox/audio_chat.py @@ -1,6 +1,6 @@ from fastapi import Request, Response,status from fastapi.responses import JSONResponse -from injector import inject +from injector import inject, singleton from .asr import ASR from .tesou import Tesou @@ -8,6 +8,7 @@ from .tts import TTS from .blackbox import Blackbox +@singleton class AudioChat(Blackbox): @inject diff --git a/src/blackbox/audio_to_text.py b/src/blackbox/audio_to_text.py index f8a3e9e..ae16260 100644 --- a/src/blackbox/audio_to_text.py +++ b/src/blackbox/audio_to_text.py @@ -3,9 +3,10 @@ from fastapi.responses import JSONResponse import speech_recognition as sr import filetype import io - +from injector import singleton from .blackbox import Blackbox +@singleton class AudioToText(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index 79378d1..55ad618 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -9,8 +9,9 @@ from .tesou import Tesou from .fastchat import Fastchat from .g2e import G2E from .text_and_image import TextAndImage -from injector import inject +from injector import inject, singleton +@singleton class BlackboxFactory: models = {} @@ -40,7 +41,7 @@ class BlackboxFactory: def __call__(self, *args, **kwargs): return self.processing(*args, **kwargs) - def create_blackbox(self, blackbox_name: str) -> Blackbox: + def call_blackbox(self, blackbox_name: str) -> Blackbox: model = self.models.get(blackbox_name) if model is None: raise ValueError("Invalid blockbox type") diff --git a/src/blackbox/blackbox_sentiment.py b/src/blackbox/emotion.py similarity index 96% rename from src/blackbox/blackbox_sentiment.py rename to src/blackbox/emotion.py index 0eb3103..4d2d060 100644 --- a/src/blackbox/blackbox_sentiment.py +++ b/src/blackbox/emotion.py @@ -6,8 +6,10 @@ from fastapi.responses import JSONResponse from .blackbox import Blackbox from lagent.llms.lmdepoly_wrapper import LMDeployClient from lagent.llms.meta_template import INTERNLM2_META as META +from injector import singleton -class Sentiment(Blackbox): +@singleton +class Emotion(Blackbox): def __init__(self, model_name, model_url) -> None: self.model = LMDeployClient( diff --git a/src/blackbox/fastchat.py b/src/blackbox/fastchat.py index 94af2b1..27c95c1 100755 --- a/src/blackbox/fastchat.py +++ b/src/blackbox/fastchat.py @@ -7,6 +7,8 @@ from .blackbox import Blackbox import requests import json +from injector import singleton +@singleton class Fastchat(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/g2e.py b/src/blackbox/g2e.py index 84f9e90..8bd5507 100755 --- a/src/blackbox/g2e.py +++ b/src/blackbox/g2e.py @@ -7,7 +7,8 @@ from .blackbox import Blackbox import requests import json from openai import OpenAI - +from injector import singleton +@singleton class G2E(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/sentiment.py b/src/blackbox/sentiment.py index d17af4c..0e60af7 100644 --- a/src/blackbox/sentiment.py +++ b/src/blackbox/sentiment.py @@ -6,7 +6,8 @@ from fastapi.responses import JSONResponse from ..sentiment_engine.sentiment_engine import SentimentEngine from .blackbox import Blackbox - +from injector import singleton +@singleton class Sentiment(Blackbox): def __init__(self) -> None: diff --git a/src/blackbox/tesou.py b/src/blackbox/tesou.py index a262c21..a8f88bc 100755 --- a/src/blackbox/tesou.py +++ b/src/blackbox/tesou.py @@ -7,7 +7,9 @@ from ..configuration import TesouConf from .blackbox import Blackbox import requests +from injector import singleton +@singleton class Tesou(Blackbox): url: str diff --git a/src/blackbox/text_and_image.py b/src/blackbox/text_and_image.py index c63fdf6..ce87987 100644 --- a/src/blackbox/text_and_image.py +++ b/src/blackbox/text_and_image.py @@ -4,7 +4,8 @@ from fastapi import Request, Response, status from fastapi.responses import JSONResponse from .blackbox import Blackbox - +from injector import singleton +@singleton class TextAndImage(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/text_to_audio.py b/src/blackbox/text_to_audio.py index 561a0c0..196b28c 100644 --- a/src/blackbox/text_to_audio.py +++ b/src/blackbox/text_to_audio.py @@ -3,7 +3,8 @@ from fastapi.responses import JSONResponse from .blackbox import Blackbox from gtts import gTTS from io import BytesIO - +from injector import singleton +@singleton class TextToAudio(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/tts.py b/src/blackbox/tts.py index 669f273..f05c082 100644 --- a/src/blackbox/tts.py +++ b/src/blackbox/tts.py @@ -6,7 +6,9 @@ from fastapi import Request, Response, status from fastapi.responses import JSONResponse from .blackbox import Blackbox from ..tts.tts_service import TTService +from injector import singleton +@singleton class TTS(Blackbox): def __init__(self, *args, **kwargs) -> None: