diff --git a/.gitignore b/.gitignore index e4c3af3..999156e 100644 --- a/.gitignore +++ b/.gitignore @@ -164,4 +164,5 @@ cython_debug/ playground.py .env* models -.idea/ \ No newline at end of file +.idea/ +promtail/ \ No newline at end of file diff --git a/README.md b/README.md index c62ad6d..c70b482 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https ``` ## More Dependencies | System | package | web | install command | -| --- | | --- | --- | +| --- | ---- | --- | --- | | python | filetype | https://pypi.org/project/filetype/ | pip install filetype | | python | fastAPI | https://fastapi.tiangolo.com/ | pip install fastapi | | python | python-multipart | https://pypi.org/project/python-multipart/ | pip install python-multipart | diff --git a/main.py b/main.py index 7480f82..4cafad9 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,22 @@ import uvicorn +import logging +from injector import Injector,inject +from src.log.handler import LogHandler +from src.configuration import EnvConf, LogConf, singleton + +@singleton +class Main(): + + @inject + def __init__(self, logConf: LogConf) -> None: + logging.basicConfig(level=logConf.level,filename=logConf.filename,format="%(asctime)s %(levelname)s %(message)s") + + def run(self): + logger = logging.getLogger(__name__) + logger.info("jarvis-models start", extra={"version": "0.0.1"}) + uvicorn.run("server:app", host="0.0.0.0", port=8001, log_level="info") if __name__ == "__main__": - uvicorn.run("router:app", host="0.0.0.0", port=8000, log_level="info") + injector = Injector() + main = injector.get(Main) + main.run() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1efc43a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +filetype==1.2.0 +fastapi==0.110.3 +python-multipart==0.0.9 +uvicorn==0.29.0 +SpeechRecognition==3.10.3 +PyYAML==6.0.1 +injector==0.21.0 diff --git a/router.py b/server.py similarity index 72% rename from router.py rename to server.py index fc8c3fd..d32b58d 100644 --- a/router.py +++ b/server.py @@ -1,13 +1,9 @@ -from typing import Annotated, Union +from typing import Union -from fastapi import FastAPI, Request, status, Form +from fastapi import FastAPI, Request, status 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 @@ -29,7 +25,7 @@ async def blackbox(blackbox_name: Union[str, None] = None, request: Request = No 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) + box = blackbox_factory.get_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 4f92659..5338ec2 100644 --- a/src/blackbox/asr.py +++ b/src/blackbox/asr.py @@ -7,12 +7,13 @@ 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 +from injector import singleton, inject @singleton class ASR(Blackbox): - def __init__(self, path = ".env.yaml") -> None: + @inject + def __init__(self,path = ".env.yaml") -> None: config = read_yaml(path) self.paraformer = RapidParaformer(config) @@ -34,6 +35,7 @@ class ASR(Blackbox): async def fast_api_handler(self, request: Request) -> Response: data = (await request.form()).get("audio") if data is None: + self.logger.warn("asr bag request","type", "fast_api_handler", "api", "asr") return JSONResponse(content={"error": "data is required"}, status_code=status.HTTP_400_BAD_REQUEST) d = await data.read() try: diff --git a/src/blackbox/audio_chat.py b/src/blackbox/audio_chat.py index cf5fb71..1108b44 100644 --- a/src/blackbox/audio_chat.py +++ b/src/blackbox/audio_chat.py @@ -1,3 +1,4 @@ +import logging from fastapi import Request, Response,status from fastapi.responses import JSONResponse from injector import inject, singleton @@ -8,11 +9,14 @@ from .tts import TTS from .blackbox import Blackbox +logger = logging.getLogger(__name__) + @singleton class AudioChat(Blackbox): @inject def __init__(self, asr: ASR, gpt: Tesou, tts: TTS): + logger.info("audio chat initint") self.asr = asr self.gpt = gpt self.tts = tts diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index 97109b9..b633b52 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -3,16 +3,16 @@ from .sentiment import Sentiment from .tts import TTS from .asr import ASR from .audio_to_text import AudioToText -from .emotion import Emotion +#from .emotion import Emotion from .blackbox import Blackbox from .text_to_audio import TextToAudio from .tesou import Tesou from .fastchat import Fastchat from .g2e import G2E from .text_and_image import TextAndImage -from .chroma_query import ChromaQuery -from .chroma_upsert import ChromaUpsert -from .chroma_chat import ChromaChat +# from .chroma_query import ChromaQuery +# from .chroma_upsert import ChromaUpsert +# from .chroma_chat import ChromaChat from .melotts import MeloTTS from .vlms import VLMS from injector import inject, singleton @@ -28,16 +28,15 @@ class BlackboxFactory: asr: ASR, tts: TTS, sentiment_engine: Sentiment, - emotion: Emotion, + #emotion: Emotion, tesou: Tesou, fastchat: Fastchat, audio_chat: AudioChat, g2e: G2E, text_and_image: TextAndImage, - chroma_query: ChromaQuery, - chroma_upsert: ChromaUpsert, - chroma_chat: ChromaChat, - melotts: MeloTTS, + #chroma_query: ChromaQuery, + #chroma_upsert: ChromaUpsert, + #chroma_chat: ChromaChat, vlms: VLMS) -> None: self.models["audio_to_text"] = audio_to_text self.models["text_to_audio"] = text_to_audio @@ -45,21 +44,20 @@ class BlackboxFactory: self.models["tts"] = tts self.models["sentiment_engine"] = sentiment_engine self.models["tesou"] = tesou - self.models["emotion"] = emotion + #self.models["emotion"] = emotion self.models["fastchat"] = fastchat self.models["audio_chat"] = audio_chat self.models["g2e"] = g2e self.models["text_and_image"] = text_and_image - self.models["chroma_query"] = chroma_query - self.models["chroma_upsert"] = chroma_upsert - self.models["chroma_chat"] = chroma_chat - self.models["melotts"] = melotts + #self.models["chroma_query"] = chroma_query + #self.models["chroma_upsert"] = chroma_upsert + #self.models["chroma_chat"] = chroma_chat self.models["vlms"] = vlms def __call__(self, *args, **kwargs): return self.processing(*args, **kwargs) - def call_blackbox(self, blackbox_name: str) -> Blackbox: + def get_blackbox(self, blackbox_name: str) -> Blackbox: model = self.models.get(blackbox_name) if model is None: raise ValueError("Invalid Blackbox Type...") diff --git a/src/blackbox/emotion.py b/src/blackbox/emotion.py index af0fce1..1fad6b9 100644 --- a/src/blackbox/emotion.py +++ b/src/blackbox/emotion.py @@ -57,4 +57,3 @@ class Emotion(Blackbox): text = [{'role': 'user', 'content': text}] sentiment = self.processing(text) return JSONResponse(content={"sentiment": sentiment}, status_code=status.HTTP_200_OK) - diff --git a/src/blackbox/g2e.py b/src/blackbox/g2e.py index 8bd5507..4a6640a 100755 --- a/src/blackbox/g2e.py +++ b/src/blackbox/g2e.py @@ -22,8 +22,8 @@ class G2E(Blackbox): def processing(self, model_name, prompt, template, context: list) -> str: if context == None: context = [] - url = 'http://120.196.116.194:48890/v1' - #url = 'http://120.196.116.194:48892/v1' + #url = 'http://120.196.116.194:48890/v1' + url = 'http://120.196.116.194:48892/v1' background_prompt = '''KOMBUKIKI是一款茶饮料,目标受众 年龄:20-35岁 性别:女性 地点:一线城市、二线城市 职业:精英中产、都市白领 收入水平:中高收入,有一定消费能力 兴趣和爱好:注重健康,有运动习惯 @@ -65,7 +65,8 @@ class G2E(Blackbox): api_key='YOUR_API_KEY', base_url=url ) - model_name = client.models.list().data[0].id + #model_name = client.models.list().data[0].id + model_name = client.models.list().data[1].id print(model_name) response = client.chat.completions.create( model=model_name, diff --git a/src/configuration.py b/src/configuration.py index 38086e6..bb4e749 100644 --- a/src/configuration.py +++ b/src/configuration.py @@ -1,9 +1,10 @@ -from dataclasses import dataclass -from injector import Injector, inject +from injector import inject,singleton import yaml import sys +import logging +@singleton class Configuration(): @inject @@ -26,19 +27,18 @@ class Configuration(): bbb: ccc: "hello world" """ - def get(self, path: str | list[str], cfg: dict = None): + def get(self, path: str | list[str], cfg: dict = None, default=None): if isinstance(path, str): if cfg is None: cfg = self.cfg return self.get(path.split("."), cfg) length = len(path) if length == 0 or not isinstance(cfg, dict): - return None + return default if length == 1: return cfg.get(path[0]) return self.get(path[1:], cfg.get(path[0])) - - + class TesouConf(): url: str @@ -53,3 +53,39 @@ class MeloConf(): @inject def __init__(self, config: Configuration) -> None: self.melotts = config.get("melotts.url") + +# 'CRITICAL': CRITICAL, +# 'FATAL': FATAL, +# 'ERROR': ERROR, +# 'WARN': WARNING, +# 'WARNING': WARNING, +# 'INFO': INFO, +# 'DEBUG': DEBUG, +# 'NOTSET': NOTSET, +DEFAULT_LEVEL="WARNING" +DEFAULT_TIME_FORMAT="%Y-%m-%d %H:%M:%S" + +@singleton +class LogConf(): + level: int + time_format = "%Y-%m-%d %H:%M:%S" + filename: str | None + @inject + def __init__(self,config: Configuration) -> None: + self.level = config.get("log.level") + c = config.get("log.level", default=DEFAULT_LEVEL).upper() + level=logging._nameToLevel.get(c) + if level is None: + self.level = logging.WARNING + else: + self.level = level + self.filename = config.get("log.filename") + self.time_format = config.get("log.time_format", default=DEFAULT_TIME_FORMAT) + +@singleton +class EnvConf(): + version: str + + @inject + def __init__(self) -> None: + self.version = "0.0.1" diff --git a/src/log/handler.py b/src/log/handler.py new file mode 100644 index 0000000..21b7c0d --- /dev/null +++ b/src/log/handler.py @@ -0,0 +1,13 @@ +import logging + +class LogHandler(logging.StreamHandler): + + def __init__(self)-> None: + logging.Handler.__init__(self=self) + + def emit(self, record) -> None: + print("emit", record) + + def handle(self, record) -> None: + print("@ handle",record) + \ No newline at end of file diff --git a/src/tts/tts_service.py b/src/tts/tts_service.py index e140ff4..e1d1b1b 100644 --- a/src/tts/tts_service.py +++ b/src/tts/tts_service.py @@ -16,7 +16,6 @@ from src.tts.vits.text.symbols import symbols from src.tts.vits.text import text_to_sequence import logging -logging.getLogger().setLevel(logging.INFO) logging.basicConfig(level=logging.INFO) dirbaspath = __file__.split("\\")[1:-1]