This commit is contained in:
yumoqing 2026-02-12 13:30:39 +08:00
parent ea1e64ad3e
commit 86dae10616

View File

@ -103,12 +103,12 @@ class IndustrialSkillEngine:
req_file = skill_md.parent / "requirements.txt" req_file = skill_md.parent / "requirements.txt"
has_deps = req_file.exists() has_deps = req_file.exists()
self.registry[name] = { self.registry[name] = DictObject(**{
"root": skill_md.parent, "root": skill_md.parent,
"meta": meta, "meta": meta,
"content": content, "content": content,
"has_deps": has_deps "has_deps": has_deps
} })
await env.session_setvalue(key, self.registry) await env.session_setvalue(key, self.registry)
# --- 2. 自动化依赖环境隔离 (venv 思想) --- # --- 2. 自动化依赖环境隔离 (venv 思想) ---
@ -145,12 +145,8 @@ class IndustrialSkillEngine:
print(f"⚠️ 执行失败,尝试让 AI 自愈修复参数...") print(f"⚠️ 执行失败,尝试让 AI 自愈修复参数...")
new_prompt = f"命令 '{command}' 失败,错误信息: {res.stderr}。请根据错误重新生成正确的命令,或提示用户补全参数。" new_prompt = f"命令 '{command}' 失败,错误信息: {res.stderr}。请根据错误重新生成正确的命令,或提示用户补全参数。"
# 这里会递归调用逻辑进行修复 # 这里会递归调用逻辑进行修复
return await self.run(new_prompt, is_retry=True) return await self._run(new_prompt, is_retry=True)
await self.write_output({
"status": "FAILED",
"error": f"Error: {res.stderr}"
})
raise Exception(f"Error: {res.stderr}") raise Exception(f"Error: {res.stderr}")
return res.stdout return res.stdout
@ -175,10 +171,11 @@ class IndustrialSkillEngine:
choice = await self.llm(f"上下文:{context or ''}\n用户问题: {user_prompt}\n可选深入文档: {found_docs}\n需要读取哪个?(仅返回路径,不需则返回 None)") choice = await self.llm(f"上下文:{context or ''}\n用户问题: {user_prompt}\n可选深入文档: {found_docs}\n需要读取哪个?(仅返回路径,不需则返回 None)")
if choice != "None" and any(choice in doc for doc in found_docs): if choice != "None" and any(choice in doc for doc in found_docs):
with open(skill["root"] / choice, 'r') as f: with open(skill["root"] / choice, 'r') as f:
await self.write_output({ output = {
"status": "PROCESSING", "status": "PROCESSING",
"hint": f"📂 深度加载: {choice}" "hint": f"📂 深度加载: {choice}"
}) }
await self.write_output(output)
base_content += f"\n\n--- 深度参考 ({choice}) ---\n{f.read()}" base_content += f"\n\n--- 深度参考 ({choice}) ---\n{f.read()}"
return base_content return base_content
@ -190,20 +187,33 @@ class IndustrialSkillEngine:
data = await self.task_queue.get() data = await self.task_queue.get()
if not data: if not data:
break; break;
debug(f'{data=}, {type(data)=}')
yield data yield data
await asyncio.sleep(0.1) await asyncio.sleep(0.1)
# --- 5. 主运行接口 --- # --- 5. 主运行接口 ---
async def run(self, user_prompt: str, context=None, is_retry=False): async def run(self, parmas_kw):
try:
user_input = json.dumps(params_kw, ensure_ascii=False)
await self._run(user_input)
except Exception as e:
await self.write_output({
'status': 'FAILED',
'error': f"{e}'
})
self.write_output(None)
async def _run(self, user_prompt: str, context=None, is_retry=False):
# 如果是重试,跳过技能选择 # 如果是重试,跳过技能选择
await self.boot() await self.boot()
debug(f'{self.registry=}')
if not is_retry: if not is_retry:
await self.write_output({ await self.write_output({
"status": "PROCESSING", "status": "PROCESSING",
"hint": "寻找合适的skill" "hint": "寻找合适的skill"
}) })
skill_map = {n: v["description"] for n, v in self.registry.items()} skill_map = {n: v.meta.description for n, v in self.registry.items()}
target = await self.llm(f"用户意图: {user_prompt}\n可选技能清单: {skill_map}\n请返回匹配的技能名:") target = await self.llm(f"用户意图: {user_prompt}\n可选技能清单: {skill_map}\n请返回匹配的技能名:")
self.state["current_skill"] = target self.state["current_skill"] = target
await self.write_output({ await self.write_output({
@ -213,11 +223,7 @@ class IndustrialSkillEngine:
skill_name = self.state["current_skill"] skill_name = self.state["current_skill"]
if skill_name not in self.registry: if skill_name not in self.registry:
await self.write_output({ raise Exception(f"技能名{skill_name}未注册")
"status": "FAILED",
"error": f"技能名{skill_name}未注册"
})
raise Exception("Skill not found.")
# 获取递归上下文 # 获取递归上下文
context = await self._get_expanded_context(skill_name, user_prompt, context=context) context = await self._get_expanded_context(skill_name, user_prompt, context=context)
@ -240,7 +246,7 @@ class IndustrialSkillEngine:
asyncio.sleep(0.5) asyncio.sleep(0.5)
user_reply = await env.session_getvalue(sessionkey) user_reply = await env.session_getvalue(sessionkey)
prompt = f"{user_prompt}\n补充输入:{user_reply}" prompt = f"{user_prompt}\n补充输入:{user_reply}"
await self.run(prompt, context=context, is_retry=True) await self._run(prompt, context=context, is_retry=True)
return return
if "EXEC:" in decision: if "EXEC:" in decision:
cmd = decision.split("EXEC:")[1].strip() cmd = decision.split("EXEC:")[1].strip()