Merge pull request #64 from wugren/MVP

Story maker support telegram
This commit is contained in:
Liu Zhicong
2023-09-25 11:04:26 -07:00
committed by GitHub
3 changed files with 35 additions and 19 deletions
+13 -4
View File
@@ -13,13 +13,17 @@ enable_function = []
[[roles.manager.prompt]] [[roles.manager.prompt]]
role="system" role="system"
content=""" content="""
你是一个语音故事制作总导演,与客户对接并向团队下达指令。你的团队分为下面个成员:writer,speecher。一个故事制作分成两个阶段:让writer写出故事,再交由speecher演播故事生成音频文件。你的基本工作模式是: 当前的职位是语音故事制作总负责人,负责与客户对接并向团队下达指令,不需要自己直接完成任务。你的团队分为下面个成员:writer,speecher。一个故事制作分成两个阶段:让writer写出故事,再交由speecher演播故事生成音频文件。你的基本工作模式是:
1. 收到客户的明确的指令后,让writer写出故事 1. 收到客户的明确的指令后,让writer写出故事
2. 将writer写出的故事交给speecher演播 2. 将writer写出的故事交给speecher演播
3. 获得音频文件之后,将音频文件的存放路径给客户 3. 获得音频文件之后,整个任务已完成,将音频文件的存放路径以如下格式返回给客户
```
故事制作完成。
audio file:音频文件路径
```
4. 当你决定要和成员通信时,请使用下面形式输出需要通信的消息 4. 当你决定要和成员通信时,请使用下面形式输出需要通信的消息
``` ```
##/send_msg 成员名称 ##/send_msg ""
内容 内容
``` ```
""" """
@@ -39,4 +43,9 @@ agent = "speecher"
enable_function = ["text_to_speech"] enable_function = ["text_to_speech"]
[[roles.speecher.prompt]] [[roles.speecher.prompt]]
role="system" role="system"
content="" content="""你现在的职责是演播一个故事,故事完成之后请以如下格式返回:
```
故事演播完成。
audio file:音频文件路径
```
"""
+17 -10
View File
@@ -26,10 +26,10 @@ class TelegramTunnel(AgentTunnel):
return result_tunnel return result_tunnel
else: else:
return None return None
AgentTunnel.register_loader("TelegramTunnel",load_tg_tunnel) AgentTunnel.register_loader("TelegramTunnel",load_tg_tunnel)
async def load_from_config(self,config:dict)->bool: async def load_from_config(self,config:dict)->bool:
self.tg_token = config["token"] self.tg_token = config["token"]
self.target_id = config["target"] self.target_id = config["target"]
@@ -57,20 +57,20 @@ class TelegramTunnel(AgentTunnel):
await self.on_message(bot,update) await self.on_message(bot,update)
return next_update_id return next_update_id
return update_id return update_id
async def start(self) -> bool: async def start(self) -> bool:
if self.is_start: if self.is_start:
logger.warning(f"tunnel {self.tunnel_id} is already started") logger.warning(f"tunnel {self.tunnel_id} is already started")
return False return False
self.is_start = True self.is_start = True
logger.info(f"tunnel {self.tunnel_id} is starting...") logger.info(f"tunnel {self.tunnel_id} is starting...")
self.bot = Bot(self.tg_token) self.bot = Bot(self.tg_token)
self.update_queue = asyncio.Queue() self.update_queue = asyncio.Queue()
self.bot_updater = Updater(self.bot,update_queue=self.update_queue) self.bot_updater = Updater(self.bot,update_queue=self.update_queue)
async def _run_app(): async def _run_app():
try: try:
@@ -116,7 +116,7 @@ class TelegramTunnel(AgentTunnel):
if update.effective_user.is_bot: if update.effective_user.is_bot:
logger.warning(f"ignore message from telegram bot {update.effective_user.id}") logger.warning(f"ignore message from telegram bot {update.effective_user.id}")
return None return None
cm : ContactManager = ContactManager.get_instance() cm : ContactManager = ContactManager.get_instance()
reomte_user_name = f"{update.effective_user.id}@telegram" reomte_user_name = f"{update.effective_user.id}@telegram"
contact : Contact = cm.find_contact_by_telegram(update.effective_user.username) contact : Contact = cm.find_contact_by_telegram(update.effective_user.username)
@@ -148,6 +148,14 @@ class TelegramTunnel(AgentTunnel):
await update.message.reply_text(f"{self.target_id} process message error") await update.message.reply_text(f"{self.target_id} process message error")
else: else:
if resp_msg.body_mime is None: if resp_msg.body_mime is None:
if resp_msg.body is not None:
pos = resp_msg.body.find("audio file")
if pos != -1:
audio_file = resp_msg.body[pos+11:].strip()
if audio_file.startswith("\""):
audio_file = audio_file[1:-1]
await update.message.reply_voice(audio_file)
return
await update.message.reply_text(resp_msg.body) await update.message.reply_text(resp_msg.body)
else: else:
if resp_msg.body_mime.startswith("image"): if resp_msg.body_mime.startswith("image"):
@@ -157,9 +165,8 @@ class TelegramTunnel(AgentTunnel):
photo_file.close() photo_file.close()
else: else:
await update.message.reply_text(resp_msg.body) await update.message.reply_text(resp_msg.body)
else: else:
await update.message.reply_text(resp_msg.body) await update.message.reply_text(resp_msg.body)
+5 -5
View File
@@ -390,11 +390,11 @@ class Workflow:
result_func.append(this_func) result_func.append(this_func)
if len(result_func) > 0: if len(result_func) > 0:
return result_func return result_func
return None return None
async def _role_execute_func(self,the_role:AIRole,inenr_func_call_node:dict,prompt:AgentPrompt,org_msg:AgentMsg,stack_limit = 5) -> str: async def _role_execute_func(self,the_role:AIRole,inenr_func_call_node:dict,prompt:AgentPrompt,org_msg:AgentMsg,stack_limit = 5) -> str:
from .compute_kernel import ComputeKernel from .compute_kernel import ComputeKernel
func_name = inenr_func_call_node.get("name") func_name = inenr_func_call_node.get("name")
arguments = json.loads(inenr_func_call_node.get("arguments")) arguments = json.loads(inenr_func_call_node.get("arguments"))
@@ -418,7 +418,7 @@ class Workflow:
if stack_limit > 0: if stack_limit > 0:
inner_func_call_node = task_result.result_message.get("function_call") inner_func_call_node = task_result.result_message.get("function_call")
if inner_func_call_node: if inner_func_call_node:
return await self._role_execute_func(the_role,inner_func_call_node,prompt,org_msg,stack_limit-1) return await self._role_execute_func(the_role,inner_func_call_node,prompt,org_msg,stack_limit-1)
else: else:
return task_result.result_str return task_result.result_str
@@ -440,7 +440,7 @@ class Workflow:
prompt.append(await self._get_prompt_from_session(workflow_chat_session)) prompt.append(await self._get_prompt_from_session(workflow_chat_session))
msg_prompt = AgentPrompt() msg_prompt = AgentPrompt()
msg_prompt.messages = [{"role":"user","content":f"{msg.sender}:{msg.body}"}] msg_prompt.messages = [{"role":"user","content":f"user name is {msg.sender}, his question is :{msg.body}"}]
prompt.append(msg_prompt) prompt.append(msg_prompt)
self._format_msg_by_env_value(prompt) self._format_msg_by_env_value(prompt)