From 12402f6d9d3dcdf7eb0f934d94ba4899f9e956cb Mon Sep 17 00:00:00 2001 From: superobk Date: Wed, 17 Apr 2024 15:52:46 +0800 Subject: [PATCH 1/5] fix: g2e blockbox --- src/blackbox/g2e.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/blackbox/g2e.py b/src/blackbox/g2e.py index e35d295..90095a1 100755 --- a/src/blackbox/g2e.py +++ b/src/blackbox/g2e.py @@ -29,8 +29,9 @@ class G2E(Blackbox): 品牌理念和定位 健康、优雅、精致、知性、现代、正面、悦己 KOMBUKIKI茶的同名代言虚拟角色KOMBUKIKI角色设定: 性别:女 + 姓名:琪琪 性格特质: 勇敢、独立、坚韧、积极、正面、自爱。 具有探险精神,拥有一颗开放的心,在面对困难和挑战时能够保持积极的态度 MBTI类型:ENFP - 背景故事: KIKI对旅行和冒险充满热情和渴望,正在寻找生活中的新体验和挑战,从而踏上追寻自我成长的旅程 + 背景故事: 琪琪对旅行和冒险充满热情和渴望,正在寻找生活中的新体验和挑战,从而踏上追寻自我成长的旅程 品牌故事 KOMBUKIKI:每一口,旅行的开始在忙碌的日常中,KOMBUKIKI康普茶不仅是一种饮料,它是一个承载梦想和自由的容器。对于那些渴望旅行,寻求生活质感的20至35岁女性来说,KOMBUKIKI是她们心灵的伙伴。KOMBUKIKI的每一瓶,都是一段故事的开端。我们的康普茶瓶身设计灵感来自旅行手账,最大的特色是其邮票形状的包装贴纸。每个贴纸上描绘着不同的旅游景点,从繁华的都市到静谧的乡村,每一瓶都是对该地点的独特致敬。当顾客扫描瓶身上的二维码,将展开一系列充满诗意的故事,带领她们走进一个个迷人的旅行梦境。在KOMBUKIKI的世界里,每一口康普茶不仅是滋味的享受,更是心灵的旅行。它不仅卖给顾客一种饮料,更是卖给她们一种情绪价值,一种对自由和旅行的渴望。这是一个专为那些处于人生转变期,对成长话题感兴趣的年轻女性所设计的品牌。KOMBUKIKI,不仅是康普茶,它是每个人心中对旅行渴望的象征,是一场心灵和味觉的双重旅行。口号 每一口,启程至心中的远方 是每个人心中对旅行渴望的象征, 是一场心灵和味觉的双重旅行。 @@ -40,9 +41,9 @@ class G2E(Blackbox): KOMBUKIKI康普茶价格 内地常规版:25 RMB 澳门常规版:28-29 MOP''' - prompt1 = ''''你是KOMBUKIKI,活泼的康普茶看板娘,同时你对澳门十分熟悉,是一个澳门旅游专家,请回答任何关于澳门旅游的问题,回答尽量简练明了。 + prompt1 = ''''你是琪琪,活泼的康普茶看板娘,同时你对澳门十分熟悉,是一个澳门旅游专家,请回答任何关于澳门旅游的问题,回答尽量简练明了。 ''' - inject_prompt = '用活泼的语气说话回答,回答严格限制50字以内。' + inject_prompt = '(用活泼的语气说话回答,回答严格限制50字以内)' prompt_template = [ @@ -50,13 +51,12 @@ class G2E(Blackbox): ] - messages = prompt_template + [ + messages = prompt_template + context + [ { "role": "user", "content": prompt + inject_prompt } ] - client = OpenAI( api_key='YOUR_API_KEY', base_url=url @@ -73,15 +73,6 @@ class G2E(Blackbox): fastchat_content = response.choices[0].message.content - context.append(messages) - - assistant_response = { - "role": "assistant", - "content": fastchat_content - } - - context.append(assistant_response) - return fastchat_content async def fast_api_handler(self, request: Request) -> Response: From 2c7000340e4839ce05405bf8f90a70c5d401082f Mon Sep 17 00:00:00 2001 From: superobk Date: Mon, 22 Apr 2024 14:42:01 +0800 Subject: [PATCH 2/5] Code relocation --- sample/requirements_out_of_pytorch.txt | 82 ++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 sample/requirements_out_of_pytorch.txt diff --git a/sample/requirements_out_of_pytorch.txt b/sample/requirements_out_of_pytorch.txt new file mode 100644 index 0000000..93fb277 --- /dev/null +++ b/sample/requirements_out_of_pytorch.txt @@ -0,0 +1,82 @@ +aiohttp==3.8.4 +aiosignal==1.3.1 +anyio==3.6.2 +appdirs==1.4.4 +async-timeout==4.0.2 +async-tio==1.3.2 +attrs==23.1.0 +audioread==3.0.0 +certifi==2022.12.7 +cffi==1.15.1 +charset-normalizer==2.1.1 +cn2an==0.5.19 +colorama==0.4.6 +coloredlogs==15.0.1 +Cython==0.29.34 +decorator==5.1.1 +filelock==3.9.0 +flatbuffers==23.3.3 +frozenlist==1.3.3 +fsspec==2023.4.0 +h11==0.14.0 +httpcore==0.17.0 +httpx==0.24.0 +huggingface-hub==0.14.1 +humanfriendly==10.0 +idna==3.4 +jieba==0.42.1 +Jinja2==3.1.2 +joblib==1.2.0 +lazy_loader==0.2 +librosa==0.10.0.post2 +llvmlite==0.40.0 +MarkupSafe==2.1.2 +mpmath==1.2.1 +msgpack==1.0.5 +multidict==6.0.4 +networkx==3.0 +numba==0.57.0 +numpy==1.24.1 +onnxruntime==1.14.1 +openai==0.27.6 +OpenAIAuth==0.3.6 +packaging==23.1 +Pillow==9.3.0 +pooch==1.6.0 +proces==0.1.4 +prompt-toolkit==3.0.38 +protobuf==4.22.4 +PyAudio==0.2.13 +pycparser==2.21 +pypinyin==0.48.0 +pyreadline3==3.4.1 +PySocks==1.7.1 +pywin32==306 +PyYAML==6.0 +regex==2023.5.5 +requests==2.28.1 +revChatGPT==5.0.0 +scikit-learn==1.2.2 +scipy==1.10.1 +sniffio==1.3.0 +socksio==1.0.0 +soundfile==0.12.1 +soxr==0.3.5 +sympy==1.11.1 +threadpoolctl==3.1.0 +tiktoken==0.3.3 +tokenizers==0.13.3 +tqdm==4.65.0 +transformers==4.28.1 +typeguard==2.13.3 +typing_extensions==4.4.0 +urllib3==1.26.13 +wcwidth==0.2.6 +WMI==1.5.1 +yarl==1.9.2 +filetype +fastapi +python-multipart +uvicorn[standard] +SpeechRecognition +gtts \ No newline at end of file From 21d159de9bce4cf8219c93b30d45442d1cf5b843 Mon Sep 17 00:00:00 2001 From: Limbo <57550280+Alu-XXX@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:43:19 +0800 Subject: [PATCH 3/5] add sentiment blackbox --- src/blackbox/blackbox_sentiment.py | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/blackbox/blackbox_sentiment.py diff --git a/src/blackbox/blackbox_sentiment.py b/src/blackbox/blackbox_sentiment.py new file mode 100644 index 0000000..0eb3103 --- /dev/null +++ b/src/blackbox/blackbox_sentiment.py @@ -0,0 +1,48 @@ +from typing import Any, Coroutine + +from fastapi import Request, Response, status +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 + +class Sentiment(Blackbox): + + def __init__(self, model_name, model_url) -> None: + self.model = LMDeployClient( + model_name=model_name, + url=model_url, + meta_template=META, + top_p=0.8, + top_k=100, + temperature=0, + repetition_penalty=1.0, + stop_words=['<|im_end|>']) + + def __call__(self, *args, **kwargs): + return self.processing(*args, **kwargs) + + def valid(self, *args, **kwargs) -> bool: + data = args[0] + return isinstance(data, str) + + def processing(self, *args, **kwargs) -> int: + text = args[0] + text = "Please use one word to infer the emotion of the following passage:\n" + text + "\nJust print out that signle word pls." + text = [{'role': 'user', 'content': text}] + return self.model.stream_chat(text) + + async def fast_api_handler(self, request) -> Response: + try: + data = await request.json() + except: + return JSONResponse(content={"error": "json parse error"}, status_code=status.HTTP_400_BAD_REQUEST) + text = data.get("text") + if text is None: + return JSONResponse(content={"error": "text is required"}, status_code=status.HTTP_400_BAD_REQUEST) + text = "Please use one word to infer the emotion of the following passage:\n" + text + "\nJust print out that signle word pls." + text = [{'role': 'user', 'content': text}] + sentiment = self.processing(text) + return JSONResponse(content={"sentiment": sentiment }, status_code=status.HTTP_200_OK) + \ No newline at end of file From 201d0f374ce036f1b9e8a6fb702ead44b910549f Mon Sep 17 00:00:00 2001 From: superobk Date: Thu, 25 Apr 2024 14:57:08 +0800 Subject: [PATCH 4/5] feat: text_and_image blockbox --- src/blackbox/blackbox_factory.py | 4 ++++ src/blackbox/g2e.py | 9 ++++++--- src/blackbox/text_and_image.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/blackbox/text_and_image.py diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index d7e22b2..60ffb31 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -10,6 +10,7 @@ from .text_to_audio import TextToAudio from .tesou import Tesou from .fastchat import Fastchat from .g2e import G2E +from .text_and_image import TextAndImage class BlackboxFactory: @@ -25,6 +26,7 @@ class BlackboxFactory: self.fastchat = Fastchat() self.audio_chat = AudioChat(self.asr, self.tesou, self.tts) self.g2e = G2E() + self.text_and_image = TextAndImage() def __call__(self, *args, **kwargs): return self.processing(*args, **kwargs) @@ -52,4 +54,6 @@ class BlackboxFactory: return self.audio_chat if blackbox_name == "g2e": return self.g2e + if blackbox_name == 'text_and_image': + return self.text_and_image raise ValueError("Invalid blockbox type") \ No newline at end of file diff --git a/src/blackbox/g2e.py b/src/blackbox/g2e.py index 90095a1..84f9e90 100755 --- a/src/blackbox/g2e.py +++ b/src/blackbox/g2e.py @@ -22,7 +22,7 @@ class G2E(Blackbox): if context == None: context = [] url = 'http://120.196.116.194:48890/v1' - + #url = 'http://120.196.116.194:48892/v1' background_prompt = '''KOMBUKIKI是一款茶饮料,目标受众 年龄:20-35岁 性别:女性 地点:一线城市、二线城市 职业:精英中产、都市白领 收入水平:中高收入,有一定消费能力 兴趣和爱好:注重健康,有运动习惯 @@ -47,8 +47,11 @@ class G2E(Blackbox): prompt_template = [ - {"role": "system", "content": background_prompt + prompt1}, + {"role": "system", "content": background_prompt + prompt1}, ] + #prompt_template = [ + # {"role": "system", "content": ''}, + #] messages = prompt_template + context + [ @@ -61,8 +64,8 @@ class G2E(Blackbox): api_key='YOUR_API_KEY', base_url=url ) - model_name = client.models.list().data[0].id + print(model_name) response = client.chat.completions.create( model=model_name, messages=messages, diff --git a/src/blackbox/text_and_image.py b/src/blackbox/text_and_image.py new file mode 100644 index 0000000..c63fdf6 --- /dev/null +++ b/src/blackbox/text_and_image.py @@ -0,0 +1,28 @@ +from typing import Any, Coroutine + +from fastapi import Request, Response, status +from fastapi.responses import JSONResponse +from .blackbox import Blackbox + + +class TextAndImage(Blackbox): + + def __call__(self, *args, **kwargs): + return self.processing(*args, **kwargs) + + def processing(self, text: str, image: bytes): + # TODO: implement the processing logic + return "text and image processing..." + + def valid(self, *args, **kwargs) -> bool: + return True + + async def fast_api_handler(self, request: Request) -> Response: + # If the request is a form data, you can use the following code + data = (await request.form()).get("image") + if data is None: + return JSONResponse(content={"error": "image is required"}, status_code=status.HTTP_400_BAD_REQUEST) + imageBytes = await data.read() + text = (await request.form()).get("text") + result = self.processing(text, imageBytes) + return JSONResponse(content={"result": result }, status_code=status.HTTP_200_OK) \ No newline at end of file From c062abbe198d32105cbfb25db882202b949ee446 Mon Sep 17 00:00:00 2001 From: superobk Date: Thu, 25 Apr 2024 15:07:18 +0800 Subject: [PATCH 5/5] doc: update swagger --- src/blackbox/blackbox_factory.py | 8 ------ src/blackbox/calculator.py | 42 -------------------------------- src/blackbox/sum.py | 27 -------------------- swagger.yml | 21 ++++++++++++++-- 4 files changed, 19 insertions(+), 79 deletions(-) delete mode 100644 src/blackbox/calculator.py delete mode 100644 src/blackbox/sum.py diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index 60ffb31..49d931d 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -1,11 +1,9 @@ from .audio_chat import AudioChat -from .sum import SUM from .sentiment import Sentiment from .tts import TTS from .asr import ASR from .audio_to_text import AudioToText from .blackbox import Blackbox -from .calculator import Calculator from .text_to_audio import TextToAudio from .tesou import Tesou from .fastchat import Fastchat @@ -18,8 +16,6 @@ class BlackboxFactory: self.tts = TTS() self.asr = ASR(".env.yaml") self.sentiment = Sentiment() - self.sum = SUM() - self.calculator = Calculator() self.audio_to_text = AudioToText() self.text_to_audio = TextToAudio() self.tesou = Tesou() @@ -36,16 +32,12 @@ class BlackboxFactory: return self.audio_to_text if blackbox_name == "text_to_audio": return self.text_to_audio - if blackbox_name == "calculator": - return self.calculator if blackbox_name == "asr": return self.asr if blackbox_name == "tts": return self.tts if blackbox_name == "sentiment_engine": return self.sentiment - if blackbox_name == "sum": - return self.sum if blackbox_name == "tesou": return self.tesou if blackbox_name == "fastchat": diff --git a/src/blackbox/calculator.py b/src/blackbox/calculator.py deleted file mode 100644 index 67c3363..0000000 --- a/src/blackbox/calculator.py +++ /dev/null @@ -1,42 +0,0 @@ -from fastapi import status -from fastapi.responses import JSONResponse -from .blackbox import Blackbox - - -class Calculator(Blackbox): - - """This class just for example, it show how to implement Blackbox interface.""" - - def __call__(self, *args, **kwargs): - return self.processing(*args, **kwargs) - - def valid(self, *args, **kwargs) -> bool: - data = args[0] - return isinstance(data, dict) and "op" in data and "left" in data and "right" in data - - def processing(self, data: dict) -> int | float: - if not self.valid(data): - raise ValueError("Invalid data") - a = data["left"] - b = data["right"] - op = data["op"] - if op == "add": - return a + b - if op == "sub": - return a - b - if op == "mul": - return a * b - if op == "div": - return a / b - raise ValueError("Invalid operation") - - async def fast_api_handler(self, request) -> any: - try: - data = await request.json() - except: - return JSONResponse(content={"error": "json parse error"}, status_code=status.HTTP_400_BAD_REQUEST) - try: - result = self.processing(data) - except ValueError as e: - return JSONResponse(content={"error": str(e)}, status_code=status.HTTP_400_BAD_REQUEST) - return JSONResponse(content={"result": result}, status_code=status.HTTP_200_OK) \ No newline at end of file diff --git a/src/blackbox/sum.py b/src/blackbox/sum.py deleted file mode 100644 index 79a8137..0000000 --- a/src/blackbox/sum.py +++ /dev/null @@ -1,27 +0,0 @@ -from typing import Any, Coroutine - -from fastapi import Request, Response, status -from fastapi.responses import JSONResponse -from .blackbox import Blackbox - - -class SUM(Blackbox): - - def __call__(self, *args, **kwargs): - return self.processing(*args, **kwargs) - - def valid(self, *args, **kwargs) -> bool: - data = args[0] - return isinstance(data, list) - - def processing(self, *args, **kwargs): - return sum(args) - - async def fast_api_handler(self, request: Request) -> Response: - try: - data = await request.json() - except: - return JSONResponse(content={"error": "json parse error"}, status_code=status.HTTP_400_BAD_REQUEST) - if not self.valid(data): - return JSONResponse(content={"error": "format error"}, status_code=status.HTTP_400_BAD_REQUEST) - return JSONResponse(content={"result": self.processing(data)}, status_code=status.HTTP_200_OK) \ No newline at end of file diff --git a/swagger.yml b/swagger.yml index a6ffc62..6546996 100644 --- a/swagger.yml +++ b/swagger.yml @@ -54,10 +54,19 @@ components: audio: type: string format: binary + TextAndImageInput: + type: object + properties: + text: + type: string + image: + type: string + format: binary Input: oneOf: - $ref: "#/components/schemas/TextToAudioInput" - $ref: "#/components/schemas/AudioToTextInput" + - $ref: "#/components/schemas/TextAndImageInput" TextResult: type: object properties: @@ -71,5 +80,13 @@ components: type: string description: "Blackbox name" enum: - - "text_to_audio" - - "audio_to_text" + - text_to_audio + - audio_to_text + - asr + - tts + - sentiment_engine + - tesou + - fastchat + - audio_chat + - g2e + - text_and_image \ No newline at end of file