From 6e023abef659092d918b7e8b1d475facd51dae52 Mon Sep 17 00:00:00 2001 From: H Vs Date: Sat, 12 Apr 2025 15:45:56 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=A7=86=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/endpoints/pipeline_endpoint.py | 52 +++++++++++++++++++----------- common/utils.py | 12 +++++++ 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/app/endpoints/pipeline_endpoint.py b/app/endpoints/pipeline_endpoint.py index 634a280..7f811ed 100644 --- a/app/endpoints/pipeline_endpoint.py +++ b/app/endpoints/pipeline_endpoint.py @@ -574,38 +574,54 @@ async def ai_chat_text_async(request: Request,token_id, app_id, wxid, msg_data, } reply_content = remove_markdown_symbol(res["choices"][0]["message"]["content"]) - # if callback_to_user == 'wxid_mesh33pw13e721': - # logger.info(f'wxid_mesh33pw13e721 不发送到微信有关{msg_content}的AI回复到微信') - # else: - # await request.app.state.gewe_service.post_text_async(token_id, app_id, callback_to_user, reply_content) + + + if reply_content == '不回复': + end_time = time.time() # 记录任务结束时间 + execution_time = end_time - start_time # 计算执行时间 + logger.warning(f"AI回答任务完成,耗时 {execution_time:.2f} 秒,AI回答<不回复>,跳过微信回复") + await request.app.state.gewe_service.save_session_messages_to_cache_async(hash_key, {"role": "assistant", "content": reply_content}) + return + + # 昵称替换 replacements = { '{昵称}': wxid_nickname, '{好友昵称}': callback_to_user_nickname } - reply_content=replace_placeholders(reply_content, replacements) - - img_urls,reply_content=extract_and_replace_image_urls(reply_content) + + # 判断图片url + img_urls,reply_content=extract_and_replace_image_urls(reply_content) if img_urls: await request.app.state.gewe_service.post_text_async(token_id, app_id, callback_to_user, reply_content) await asyncio.sleep(random.uniform(1.5, 3)) for img_url in img_urls: await request.app.state.gewe_service.post_image_async(token_id, app_id, callback_to_user, img_url) await asyncio.sleep(random.uniform(1.5, 3)) - else: - - if reply_content == '不回复': - end_time = time.time() # 记录任务结束时间 - execution_time = end_time - start_time # 计算执行时间 - logger.warning(f"AI回答任务完成,耗时 {execution_time:.2f} 秒,AI回答<不回复>,跳过微信回复") - await request.app.state.gewe_service.save_session_messages_to_cache_async(hash_key, {"role": "assistant", "content": reply_content}) - return - else: - await request.app.state.gewe_service.post_text_async(token_id, app_id, callback_to_user, reply_content) - + # 判断视频url + video_urls,reply_content=extract_and_replace_video_urls(reply_content) + if video_urls: + await request.app.state.gewe_service.post_text_async(token_id, app_id, callback_to_user, reply_content) + await asyncio.sleep(random.uniform(1.5, 3)) + for video_url in video_urls: + parsed_url = urlparse(video_url) + filename = os.path.basename(parsed_url.path) + tmp_file_path = os.path.join(os.getcwd(),'tmp', filename) # 拼接完整路径 + thumbnail_path=tmp_file_path.replace('.mp4','.jpg') + + video_thumb_url,video_duration =download_video_and_get_thumbnail(video_url,thumbnail_path) + logger.info(f'{wxid} 视频缩略图 {video_thumb_url} 时长 {video_duration}') + ret,ret_msg,res = await request.app.state.gewe_service.post_video_async(token_id, app_id, callback_to_user, video_url,video_thumb_url,video_duration) + if ret!=200: + logger.warning(f'{wxid} 发送视频{video_url} 到 {callback_to_user} 失败,{ret_msg}') + await asyncio.sleep(random.uniform(1.5, 3)) + + # 发送AI微信回复 + await request.app.state.gewe_service.post_text_async(token_id, app_id, callback_to_user, reply_content) + await request.app.state.gewe_service.save_session_messages_to_cache_async(hash_key, {"role": "assistant", "content": reply_content}) # 回复的对话 input_wx_content_dialogue_message = [{"type": "text", "text": reply_content}] diff --git a/common/utils.py b/common/utils.py index 1476308..e7e9ccb 100644 --- a/common/utils.py +++ b/common/utils.py @@ -585,6 +585,18 @@ def extract_and_replace_image_urls(text): return image_urls, updated_text +def extract_and_replace_video_urls(text): + + pattern = r'https?://\S+\.(?:mp4)' + # 使用正则表达式提取所有视频链接 + video_links = re.findall(pattern, text) + + # 将包含视频链接的部分替换为 "如下视频" + updated_text = re.sub(pattern, '如下视频', text) + + return video_links, updated_text + + def replace_placeholders(reply_content, replacements:dict)->str: for placeholder, value in replacements.items(): reply_content:str = reply_content.replace(placeholder, value)