mirror of
https://github.com/FoundationAgents/MetaGPT.git
synced 2026-06-08 15:05:17 +02:00
commit
317e2e2946
3 changed files with 20 additions and 10 deletions
|
|
@ -7,9 +7,11 @@
|
|||
@Desc : Call learned skill
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import ast
|
||||
import importlib
|
||||
import traceback
|
||||
from copy import deepcopy
|
||||
|
||||
from metagpt.actions import Action, ActionOutput
|
||||
from metagpt.learn.skill_loader import Skill
|
||||
|
|
@ -18,7 +20,7 @@ from metagpt.logs import logger
|
|||
|
||||
class ArgumentsParingAction(Action):
|
||||
def __init__(self, last_talk: str, skill: Skill, context=None, llm=None, **kwargs):
|
||||
super(ArgumentsParingAction, self).__init__(name='', context=context, llm=llm)
|
||||
super(ArgumentsParingAction, self).__init__(name="", context=context, llm=llm)
|
||||
self.skill = skill
|
||||
self.ask = last_talk
|
||||
self.rsp = None
|
||||
|
|
@ -56,10 +58,10 @@ class ArgumentsParingAction(Action):
|
|||
return None
|
||||
begin_ix = txt.find(prefix)
|
||||
end_ix = txt.rfind(")")
|
||||
args_txt = txt[begin_ix + len(prefix): end_ix]
|
||||
args_txt = txt[begin_ix + len(prefix) : end_ix]
|
||||
logger.info(args_txt)
|
||||
fake_expression = f"dict({args_txt})"
|
||||
parsed_expression = ast.parse(fake_expression, mode='eval')
|
||||
parsed_expression = ast.parse(fake_expression, mode="eval")
|
||||
args = {}
|
||||
for keyword in parsed_expression.body.keywords:
|
||||
key = keyword.arg
|
||||
|
|
@ -70,15 +72,20 @@ class ArgumentsParingAction(Action):
|
|||
|
||||
class SkillAction(Action):
|
||||
def __init__(self, skill: Skill, args: dict, context=None, llm=None, **kwargs):
|
||||
super(SkillAction, self).__init__(name='', context=context, llm=llm)
|
||||
super(SkillAction, self).__init__(name="", context=context, llm=llm)
|
||||
self._skill = skill
|
||||
self._args = args
|
||||
self.rsp = None
|
||||
|
||||
async def run(self, *args, **kwargs) -> str | ActionOutput | None:
|
||||
"""Run action"""
|
||||
options = deepcopy(kwargs)
|
||||
if self._args:
|
||||
for k in self._args.keys():
|
||||
if k in options:
|
||||
options.pop(k)
|
||||
try:
|
||||
self.rsp = await self.find_and_call_function(self._skill.name, args=self._args, **kwargs)
|
||||
self.rsp = await self.find_and_call_function(self._skill.name, args=self._args, **options)
|
||||
except Exception as e:
|
||||
logger.exception(f"{e}, traceback:{traceback.format_exc()}")
|
||||
self.rsp = f"Error: {e}"
|
||||
|
|
@ -97,6 +104,7 @@ class SkillAction(Action):
|
|||
return None
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
ArgumentsParingAction.parse_arguments(skill_name="text_to_image",
|
||||
txt='`text_to_image(text="Draw an apple", size_type="512x512")`')
|
||||
if __name__ == "__main__":
|
||||
ArgumentsParingAction.parse_arguments(
|
||||
skill_name="text_to_image", txt='`text_to_image(text="Draw an apple", size_type="512x512")`'
|
||||
)
|
||||
|
|
|
|||
|
|
@ -46,4 +46,4 @@ async def text_to_speech(
|
|||
return f"[{text}]({url})"
|
||||
return audio_declaration + base64_data if base64_data else base64_data
|
||||
|
||||
raise openai.error.InvalidRequestError("缺少必要的参数")
|
||||
raise openai.error.InvalidRequestError(message="AZURE_TTS_SUBSCRIPTION_KEY and AZURE_TTS_REGION error", param={})
|
||||
|
|
|
|||
|
|
@ -57,7 +57,9 @@ class Assistant(Role):
|
|||
prompt = f"Refer to this sentence:\n {last_talk}\n"
|
||||
skills = self.skills.get_skill_list()
|
||||
for desc, name in skills.items():
|
||||
prompt += f"If want you to do {desc}, return `[SKILL]: {name}` brief and clear. For instance: [SKILL]: text_to_image\n"
|
||||
prompt += (
|
||||
f"If want you to do {desc}, return `[SKILL]: {name}` brief and clear. For instance: [SKILL]: {name}\n"
|
||||
)
|
||||
prompt += "If the preceding text presents a complete question and solution, rewrite and return `[SOLUTION]: {problem}` brief and clear. For instance: [SOLUTION]: Solution for distributing watermelon\n"
|
||||
prompt += "If the preceding text presents an unresolved issue and its corresponding discussion, rewrite and return `[PROBLEM]: {problem}` brief and clear. For instance: [PROBLEM]: How to distribute watermelon?\n"
|
||||
prompt += "Otherwise, rewrite and return `[TALK]: {talk}` brief and clear. For instance: [TALK]: distribute watermelon"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue