Fix story maker bug

This commit is contained in:
wugren
2023-09-22 00:09:21 +08:00
parent 4e45130140
commit 5c2dd13ab2
10 changed files with 147 additions and 133 deletions
@@ -1,6 +1,7 @@
instance_id = "fairy_tale_writer" instance_id = "fairy_tale_writer"
fullname = "tracy wang" fullname = "tracy wang"
llm_model_name = "gpt-3.5-turbo-16k-0613" llm_model_name = "gpt-3.5-turbo-16k-0613"
enable_function = []
[[prompt]] [[prompt]]
role = "system" role = "system"
+2
View File
@@ -1,5 +1,7 @@
instance_id = "agent:xxxxxxabcde" instance_id = "agent:xxxxxxabcde"
fullname = "musk" fullname = "musk"
enable_function = []
[[prompt]] [[prompt]]
role = "system" role = "system"
content = "你有丰富的管理技能,擅长将复杂工作拆解成简单的任务,让团队成员高效协作。" content = "你有丰富的管理技能,擅长将复杂工作拆解成简单的任务,让团队成员高效协作。"
+2 -2
View File
@@ -1,7 +1,7 @@
instance_id = "studio_director" instance_id = "studio_director"
fullname = "tracy wang" fullname = "tracy wang"
llm_model_name = "gpt-3.5-turbo-16k-0613" enable_function = ["text_to_speech"]
[[prompt]] [[prompt]]
role = "system" role = "system"
content = "你是一个演播导演,请将下面故事改编成朗读剧本,提取旁白和角色台词,每个角色需要有性别、年龄、以及每句台词的语气。并调用text_to_speech function生成音频数据。" content = "你是一个故事播音员,请将下面故事改编成播音剧本,提取旁白和角色台词,以及每个角色需要有性别、年龄、以及每句台词的语气,最后生成音频文件。"
+5 -1
View File
@@ -8,10 +8,12 @@ name = "story_maker"
name = "manager" name = "manager"
fullname = "总导演" fullname = "总导演"
agent="manager" agent="manager"
enable_function = []
[[roles.manager.prompt]] [[roles.manager.prompt]]
role="system" role="system"
content=""" content="""
你是一个语音故事制作总导演,与客户对接并向团队下达指令。你的团队分为下面几个成员:writer,studio_director。一个故事制作分成两个阶段:让writer写出故事,再交由studio_director演播故事。你的基本工作模式是: 你是一个语音故事制作总导演,与客户对接并向团队下达指令。你的团队分为下面几个成员:writer,studio_director。一个故事制作分成两个阶段:让writer写出故事,再交由studio_director演播故事生成音频文件。你的基本工作模式是:
1. 收到客户的明确的指令后,让writer写出故事 1. 收到客户的明确的指令后,让writer写出故事
2. 将writer写出的故事交给studio_director演播 2. 将writer写出的故事交给studio_director演播
3. 当你决定要和成员通信时,请使用下面形式输出需要通信的消息 3. 当你决定要和成员通信时,请使用下面形式输出需要通信的消息
@@ -25,6 +27,7 @@ content="""
name = "writer" name = "writer"
agent = "fairy_tale_writer" agent = "fairy_tale_writer"
fullname = "作家" fullname = "作家"
enable_function = []
[[roles.writer.prompt]] [[roles.writer.prompt]]
role="system" role="system"
content="" content=""
@@ -32,6 +35,7 @@ content=""
[roles.studio_director] [roles.studio_director]
name = "studio_director" name = "studio_director"
agent = "studio_director" agent = "studio_director"
enable_function = ["text_to_speech"]
[[roles.studio_director.prompt]] [[roles.studio_director.prompt]]
role="system" role="system"
content="" content=""
+4 -2
View File
@@ -288,12 +288,13 @@ class AIAgent:
result_len = 0 result_len = 0
for inner_func in all_inner_function: for inner_func in all_inner_function:
func_name = inner_func.get_name() func_name = inner_func.get_name()
if self.enable_function_list: if self.enable_function_list is not None:
if len(self.enable_function_list) > 0: if len(self.enable_function_list) > 0:
if func_name not in self.enable_function_list: if func_name not in self.enable_function_list:
logger.debug(f"ageint {self.agent_id} ignore inner func:{func_name}") logger.debug(f"ageint {self.agent_id} ignore inner func:{func_name}")
continue continue
else:
continue
this_func = {} this_func = {}
this_func["name"] = func_name this_func["name"] = func_name
this_func["description"] = inner_func.get_description() this_func["description"] = inner_func.get_description()
@@ -322,6 +323,7 @@ class AIAgent:
logger.error(f"llm execute inner func:{func_name} error:{e}") logger.error(f"llm execute inner func:{func_name} error:{e}")
logger.info("llm execute inner func result:" + result_str)
inner_functions,inner_function_len = self._get_inner_functions() inner_functions,inner_function_len = self._get_inner_functions()
prompt.messages.append({"role":"function","content":result_str,"name":func_name}) prompt.messages.append({"role":"function","content":result_str,"name":func_name})
task_result:ComputeTaskResult = await ComputeKernel.get_instance().do_llm_completion(prompt,self.llm_model_name,self.max_token_size,inner_functions) task_result:ComputeTaskResult = await ComputeKernel.get_instance().do_llm_completion(prompt,self.llm_model_name,self.max_token_size,inner_functions)
+6 -4
View File
@@ -87,7 +87,7 @@ class AIBus:
await asyncio.sleep(0.2) await asyncio.sleep(0.2)
retry_times += 1 retry_times += 1
if retry_times > 5*120: # default timeout is 120 sec if retry_times > 5*240: # default timeout is 240 sec
msg.status = AgentMsgStatus.ERROR msg.status = AgentMsgStatus.ERROR
return None return None
@@ -107,12 +107,14 @@ class AIBus:
# Wait for a message # Wait for a message
message = await handler.queue.get() message = await handler.queue.get()
#try: try:
# Try to handle the message # Try to handle the message
await handler.handle_message(message) await handler.handle_message(message)
#except Exception as e: except Exception as e:
# If an error occurs, put the message back into the queue # If an error occurs, put the message back into the queue
# logger.error(f"handle message {message.msg_id} failed! {e}") logger.error(f"handle message {message.msg_id} failed! {e}")
logger.exception(e)
raise e
#self.queues[name].put_nowait(message) #self.queues[name].put_nowait(message)
return return
+2 -2
View File
@@ -118,7 +118,7 @@ class ComputeKernel:
if task_req.state == ComputeTaskState.ERROR: if task_req.state == ComputeTaskState.ERROR:
break break
if check_times >= 20: if check_times >= 120:
task_req.state = ComputeTaskState.ERROR task_req.state = ComputeTaskState.ERROR
break break
@@ -129,7 +129,7 @@ class ComputeKernel:
if task_req.state == ComputeTaskState.DONE: if task_req.state == ComputeTaskState.DONE:
return task_req.result return task_req.result
return "error!" raise Exception("error!")
def text_embedding(self,input:str,model_name:Optional[str] = None): def text_embedding(self,input:str,model_name:Optional[str] = None):
+4 -3
View File
@@ -100,16 +100,16 @@ class OpenAI_ComputeNode(ComputeNode):
if max_token_size is None: if max_token_size is None:
max_token_size = 4000 max_token_size = 4000
result_token = int(max_token_size * 0.4) result_token = max_token_size
logger.info(f"call openai {mode_name} prompts: {prompts}")
if llm_inner_functions is None: if llm_inner_functions is None:
logger.info(f"call openai {mode_name} prompts: {prompts}")
resp = openai.ChatCompletion.create(model=mode_name, resp = openai.ChatCompletion.create(model=mode_name,
messages=prompts, messages=prompts,
max_tokens=result_token, max_tokens=result_token,
temperature=0.7) temperature=0.7)
else: else:
logger.info(f"call openai {mode_name} prompts: {prompts} functions: {json.dumps(llm_inner_functions)}")
resp = openai.ChatCompletion.create(model=mode_name, resp = openai.ChatCompletion.create(model=mode_name,
messages=prompts, messages=prompts,
functions=llm_inner_functions, functions=llm_inner_functions,
@@ -139,6 +139,7 @@ class OpenAI_ComputeNode(ComputeNode):
result.result_message = resp["choices"][0]["message"] result.result_message = resp["choices"][0]["message"]
if token_usage: if token_usage:
result.result_refers["token_usage"] = token_usage result.result_refers["token_usage"] = token_usage
logger.info(f"openai success response: {result.result_str}")
return result return result
case _: case _:
task.state = ComputeTaskState.ERROR task.state = ComputeTaskState.ERROR
+2 -2
View File
@@ -83,9 +83,9 @@ class TextToSpeechFunction(AIFunction):
continue continue
if audio is not None: if audio is not None:
path = os.path.join(os.curdir, "{}.mp3".format(random.sample('zyxwvutsrqponmlkjihgfedcba', 10))) path = os.path.join(os.path.realpath(os.curdir), "{}.mp3".format(''.join(random.sample('zyxwvutsrqponmlkjihgfedcba', 10))))
audio.export(path, format="mp3") audio.export(path, format="mp3")
return "complete.file path:{}".format(path) return "已经生成音频文件, 文件路径为{}".format(path)
else: else:
return "failed" return "failed"
+5 -3
View File
@@ -376,10 +376,12 @@ class Workflow:
result_func = [] result_func = []
for inner_func in all_inner_function: for inner_func in all_inner_function:
func_name = inner_func.get_name() func_name = inner_func.get_name()
if the_role.enable_function_list: if the_role.enable_function_list is not None:
if len(the_role.enable_function_list) > 0: if len(the_role.enable_function_list) > 0:
if func_name not in the_role.enable_function_list: if func_name not in the_role.enable_function_list:
logger.debug(f"ageint {self.agent_id} ignore inner func:{func_name}") logger.debug(f"agent {self.agent_id} ignore inner func:{func_name}")
continue
else:
continue continue
this_func = {} this_func = {}
this_func["name"] = func_name this_func["name"] = func_name
@@ -404,7 +406,7 @@ class Workflow:
result_str:str = await func_node.execute(**arguments) result_str:str = await func_node.execute(**arguments)
inner_functions = self._get_inner_functions() inner_functions = self._get_inner_functions(the_role)
prompt.messages.append({"role":"function","content":result_str,"name":func_name}) prompt.messages.append({"role":"function","content":result_str,"name":func_name})
task_result:ComputeTaskResult = await ComputeKernel.get_instance().do_llm_completion(prompt, task_result:ComputeTaskResult = await ComputeKernel.get_instance().do_llm_completion(prompt,
the_role.agent.llm_model_name,the_role.agent.max_token_size, the_role.agent.llm_model_name,the_role.agent.max_token_size,