diff --git a/main.py b/main.py index 687793c..01c54cc 100644 --- a/main.py +++ b/main.py @@ -18,3 +18,7 @@ async def blackbox(blackbox_name: Union[str, None] = None, request: Request = No except ValueError: return await JSONResponse(content={"error": "value error"}, status_code=status.HTTP_400_BAD_REQUEST) return await box.fast_api_handler(request) + +@app.post("/workflows") +async def workflows(reqest: Request): + print("workflows") \ No newline at end of file diff --git a/runtime/ast/runtime.py b/runtime/ast/runtime.py index bd82f5d..8449e82 100644 --- a/runtime/ast/runtime.py +++ b/runtime/ast/runtime.py @@ -4,7 +4,8 @@ class Runtime: self.parent = parent self.records = records - def run(self, ast): + def run(self, ast, records={}): + self.records.update(records) if ast["type"] == "Program": return self.program(ast) @@ -44,6 +45,8 @@ class Runtime: for arg in args: unquoted_args.append(self.unquote(arg)) fu = self.records.get(id) + if fu == None: + raise Exception("Function not found: " + id) return fu(*unquoted_args) def unquote(self, ast): diff --git a/src/blackbox/audio_to_text.py b/src/blackbox/audio_to_text.py index e8f1201..f8a3e9e 100644 --- a/src/blackbox/audio_to_text.py +++ b/src/blackbox/audio_to_text.py @@ -8,6 +8,9 @@ from .blackbox import Blackbox class AudioToText(Blackbox): + def __call__(self, *args, **kwargs): + return self.processing(*args, **kwargs) + def valid(self, *args, **kwargs) -> bool : data = args[0] kind = filetype.guess(data) @@ -15,7 +18,8 @@ class AudioToText(Blackbox): return False return kind.extension == "wav" - async def processing(self, data: bytes | io.BytesIO): + def processing(self, *args, **kwargs): + data = args[0] if data is None: raise ValueError("Data is required") if isinstance(data, bytes): diff --git a/src/blackbox/blackbox.py b/src/blackbox/blackbox.py index c20b483..8907073 100644 --- a/src/blackbox/blackbox.py +++ b/src/blackbox/blackbox.py @@ -8,7 +8,7 @@ class Blackbox(ABC): the methods processing, valid and fast_api_handler. If implemented correctly, the blackbox class can be used in the main.py file """ - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): pass """ @@ -18,7 +18,7 @@ class Blackbox(ABC): Output same as above. """ @abstractmethod - async def processing(self, *args, **kwargs) -> any: + async def processing(self, *args, **kwargs): pass """ @@ -34,5 +34,9 @@ class Blackbox(ABC): to the method. """ @abstractmethod - def fast_api_handler(self, request: Request) -> Response: + async def fast_api_handler(self, request: Request) -> Response: + pass + + @abstractmethod + def __call__(self, *args, **kwargs): pass \ No newline at end of file diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index e540701..7014a84 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -14,14 +14,21 @@ 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() - def create_blackbox(self, blackbox_name: str, blackbox_config: dict) -> Blackbox: + def __call__(self, *args, **kwargs): + return self.processing(*args, **kwargs) + + def create_blackbox(self, blackbox_name: str) -> Blackbox: if blackbox_name == "audio_to_text": - return AudioToText(blackbox_config) + return self.audio_to_text if blackbox_name == "text_to_audio": - return TextToAudio(blackbox_config) + return self.text_to_audio if blackbox_name == "calculator": - return Calculator(blackbox_config) + return self.calculator if blackbox_name == "asr": return self.asr if blackbox_name == "tts": @@ -29,5 +36,5 @@ class BlackboxFactory: if blackbox_name == "sentiment_engine": return self.sentiment if blackbox_name == "sum": - return SUM() + return self.sum raise ValueError("Invalid blockbox type") \ No newline at end of file diff --git a/src/blackbox/calculator.py b/src/blackbox/calculator.py index 1bee3a9..67c3363 100644 --- a/src/blackbox/calculator.py +++ b/src/blackbox/calculator.py @@ -7,6 +7,9 @@ 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 diff --git a/src/blackbox/sentiment.py b/src/blackbox/sentiment.py index a77180a..0981204 100644 --- a/src/blackbox/sentiment.py +++ b/src/blackbox/sentiment.py @@ -12,6 +12,9 @@ class Sentiment(Blackbox): def __init__(self) -> None: self.engine = SentimentEngine('resources/sentiment_engine/models/paimon_sentiment.onnx') + def __call__(self, *args, **kwargs): + return self.processing(*args, **kwargs) + def valid(self, *args, **kwargs) -> bool: data = args[0] return isinstance(data, str) diff --git a/src/blackbox/sum.py b/src/blackbox/sum.py index f472a90..79a8137 100644 --- a/src/blackbox/sum.py +++ b/src/blackbox/sum.py @@ -7,13 +7,15 @@ 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) -> Coroutine[Any, Any, Any]: - data = args[0] - return sum(data) + def processing(self, *args, **kwargs): + return sum(args) async def fast_api_handler(self, request: Request) -> Response: try: diff --git a/src/blackbox/text_to_audio.py b/src/blackbox/text_to_audio.py index bd90516..561a0c0 100644 --- a/src/blackbox/text_to_audio.py +++ b/src/blackbox/text_to_audio.py @@ -6,6 +6,9 @@ from io import BytesIO class TextToAudio(Blackbox): + def __call__(self, *args, **kwargs): + return self.processing(*args, **kwargs) + def valid(self, data: any) -> bool: return isinstance(data, str) diff --git a/src/blackbox/tts.py b/src/blackbox/tts.py index 7c1cd2c..68caa4d 100644 --- a/src/blackbox/tts.py +++ b/src/blackbox/tts.py @@ -18,6 +18,9 @@ class TTS(Blackbox): self.tts_service = TTService(*config['catmaid']) super().__init__(config) + def __call__(self, *args, **kwargs): + return self.processing(*args, **kwargs) + def processing(self, *args, **kwargs) -> io.BytesIO: text = args[0] audio = self.tts_service.read(text) diff --git a/test_data/test.mp3 b/test_data/test.mp3 new file mode 100644 index 0000000..642f21c Binary files /dev/null and b/test_data/test.mp3 differ diff --git a/test_data/testone.wav b/test_data/testone.wav new file mode 100644 index 0000000..6c351c9 Binary files /dev/null and b/test_data/testone.wav differ