feat: dotchain

This commit is contained in:
2024-08-01 11:33:09 +08:00
parent abb5195e55
commit bbf3fe2909
16 changed files with 1571 additions and 13 deletions

View File

@ -102,6 +102,16 @@ def cosyvoicetts_loader():
from .cosyvoicetts import CosyVoiceTTS
return Injector().get(CosyVoiceTTS)
@model_loader(lazy=blackboxConf.lazyloading)
def workflow_loader():
from .workflow import Workflow
return Injector().get(Workflow)
@model_loader(lazy=blackboxConf.lazyloading)
def sum_loader():
from .sum import Sum
return Injector().get(Sum)
@singleton
class BlackboxFactory:
models = {}
@ -124,6 +134,8 @@ class BlackboxFactory:
self.models["chat"] = chat_loader
self.models["chat_llama"] = chat_llama_loader
self.models["cosyvoicetts"] = cosyvoicetts_loader
self.models["workflow"] = workflow_loader
self.models["sum"] = sum_loader
def __call__(self, *args, **kwargs):
return self.processing(*args, **kwargs)

24
src/blackbox/sum.py Normal file
View File

@ -0,0 +1,24 @@
from .blackbox import Blackbox
from injector import singleton
@singleton
class Sum(Blackbox):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
return self.processing(*args, **kwargs)
def processing(self, *args, **kwargs):
total = 0
for arg in args[0]:
total += arg
return total
def valid(self, *args, **kwargs) -> bool:
return super().valid(*args, **kwargs)
async def fast_api_handler(self, request):
json = await request.json()
return self.processing(json)

61
src/blackbox/workflow.py Normal file
View File

@ -0,0 +1,61 @@
from .sum import Sum
from fastapi import Request
from .blackbox import Blackbox
from injector import singleton, inject
from ..dotchain.runtime.interpreter import program_parser
from ..dotchain.runtime.runtime import Runtime
from ..dotchain.runtime.tokenizer import Tokenizer
from ..dotchain.runtime.ast import Literal
@singleton
class Workflow(Blackbox):
@inject
def __init__(self, sum: Sum):
self.sum_blackbox = sum
def __call__(self, *args, **kwargs):
return self.processing(*args, **kwargs)
def sum(self, *args, **kwargs):
return Literal(self.sum_blackbox.processing(*args, **kwargs))
async def processing(self, *args, **kwargs):
request = args[0]
json = await request.json()
result = None
def set_result(r):
nonlocal result
result = r
def get_value(d: dict, key):
value = d.get(key)
if value is dict:
return value
if value is list:
return value
return Literal(value)
script = json["script"]
t = Tokenizer()
t.init(script)
runtime = Runtime(
context={"json": json},
exteral_fun={
"get_value": get_value,
"print": print,
"set_result": set_result,
"sum": self.sum,
}
)
ast = program_parser(t)
ast.exec(runtime)
return result
def valid(self, *args, **kwargs) -> bool:
return super().valid(*args, **kwargs)
async def fast_api_handler(self, request: Request):
return await self.processing(request)