diff --git a/skillagent/skillengine.py b/skillagent/skillengine.py index 307ca68..e70a104 100644 --- a/skillagent/skillengine.py +++ b/skillagent/skillengine.py @@ -4,6 +4,7 @@ import json from traceback import format_exc import asyncio import yaml +import inspect from functools import partial import hashlib from pathlib import Path @@ -247,13 +248,32 @@ class IndustrialSkillEngine: context = await self._get_expanded_context(skill_name, user_prompt, context=context) # 决策:是直接回答还是执行脚本 - decision = await self.llm(f'上下文: {context}\n问题: {user_prompt}\n决定动作:EXEC: {{"cmd": 找到的命令, "params": 找到的参数字典}} 或 ANSWER: 或 REPLY: ') + decision = await self.llm(f'上下文: {context}\n问题: {user_prompt}\n决定动作:EXEC: {{"cmd": 找到的命令, "params": 找到的参数字典}} 或 ANSWER: 或 REPLY: 或 CALL: {{"function", "params":找到的参数字典}}') output = { "status": "PROCESSING", "hint": f"决策完成:{decision=}" } await self.write_output(output) - if "REPLY" in decision: + if "CALL: " in decision: + st = decision[6:] + d = DictObject(**json.loads(st)) + env = self.request._run_ns + f = env.get(d.function) + if f is None: + e = Exception(f'function({d.function} is not in env') + exception(f'{e}') + raise e + ret = '' + if inspect.iscoroutinefunction(f): + ret = await f(self.request, params_kw=d.params) + else: + ret = f(self.request, params_kw=d.params) + await self.write_output({ + "status": "SUCCEEDED", + "content": ret + }) + return + if "REPLY: " in decision: sessionkey = getID() await self.write_output({ "status": "REPLY",