bugfix
This commit is contained in:
parent
ea1e64ad3e
commit
86dae10616
@ -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()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user