ai可视化后端完成
This commit is contained in:
parent
365b8a488c
commit
0e0080ec94
@ -5,6 +5,7 @@ import os
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
|
import openai
|
||||||
from openai import OpenAI
|
from openai import OpenAI
|
||||||
|
|
||||||
from pywxdump.api.remote_server import gc
|
from pywxdump.api.remote_server import gc
|
||||||
@ -56,9 +57,12 @@ class BaseLLMApi(object):
|
|||||||
self.BASE_URL = ""
|
self.BASE_URL = ""
|
||||||
|
|
||||||
def set_default_message(self):
|
def set_default_message(self):
|
||||||
|
"""
|
||||||
|
要确保message中至少有两个元素,第一个元素为系统消息,第二个元素为用户消息,且第二个元素中有{{content}}
|
||||||
|
"""
|
||||||
self.message = [
|
self.message = [
|
||||||
{"role": "system", "content": "You are a helpful assistant"},
|
{"role": "system", "content": "You are a helpful assistant"},
|
||||||
{"role": "user", "content": "Hello"},
|
{"role": "user", "content": "Hello {{content}}"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -125,6 +129,10 @@ class BaseLLMApi(object):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if message is None:
|
if message is None:
|
||||||
|
self.message[1]["content"] = self.message[1].get("content").replace("{{content}}", " ")
|
||||||
|
message = self.message
|
||||||
|
else:
|
||||||
|
self.message[1]["content"] = self.message[1].get("content").replace("{{content}}", message)
|
||||||
message = self.message
|
message = self.message
|
||||||
|
|
||||||
response = self.http_client.chat.completions.create(
|
response = self.http_client.chat.completions.create(
|
||||||
@ -137,6 +145,7 @@ class BaseLLMApi(object):
|
|||||||
else:
|
else:
|
||||||
return self.process_msg(response.response.read().decode("utf-8"))
|
return self.process_msg(response.response.read().decode("utf-8"))
|
||||||
|
|
||||||
|
|
||||||
def process_msg(self,x):
|
def process_msg(self,x):
|
||||||
return x
|
return x
|
||||||
|
|
||||||
@ -431,543 +440,7 @@ class DeepSeekApi(BaseLLMApi):
|
|||||||
}
|
}
|
||||||
|
|
||||||
}"""},
|
}"""},
|
||||||
{"role": "user", "content": """你好,以下是我要提取的内容: [
|
{"role": "user", "content": """你好,以下是我要提取的内容: {{content}}"""},
|
||||||
{
|
|
||||||
"sender": "ಠ_ಠ 闲鱼一条ಠ_ಠ",
|
|
||||||
"content": "[强]",
|
|
||||||
"timestamp": "2025-04-29 07:03:10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "JustinZ",
|
|
||||||
"content": "OK",
|
|
||||||
"timestamp": "2025-04-29 07:59:23"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "AHapi²⁰²⁵",
|
|
||||||
"content": "[旺柴]贿赂三星 这词",
|
|
||||||
"timestamp": "2025-04-29 08:01:17"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "好名字",
|
|
||||||
"content": "这个我弄完,ai做的小程序有bug,流程走不通,还改不了[捂脸]\n\n[引用](2025-04-28 12:02:27)苍何:用AI一句话开发了个名片制作微信小程序,前后台系统都有,还能一键发布!",
|
|
||||||
"timestamp": "2025-04-29 08:16:23"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "贾👦🏻",
|
|
||||||
"content": "可以微调 不过源码需要买的\n\n[引用](2025-04-29 08:16:23)好名字:这个我弄完,ai做的小程序有bug,流程走不通,还改不了[捂脸]",
|
|
||||||
"timestamp": "2025-04-29 08:54:33"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "好名字",
|
|
||||||
"content": "微调一次,然后再想调就需要开会员了",
|
|
||||||
"timestamp": "2025-04-29 09:13:32"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "贾👦🏻",
|
|
||||||
"content": "需求变更一个字 就需要重新购买[破涕为笑]",
|
|
||||||
"timestamp": "2025-04-29 09:14:09"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "AHapi²⁰²⁵",
|
|
||||||
"content": "表情",
|
|
||||||
"timestamp": "2025-04-29 09:14:22"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "Qwen3深夜正式开源,小尺寸也能大力出奇迹。\n欢迎来到这个荒诞又灿烂的时代。\n\n<a href=\"http://mp.weixin.qq.com/s?__biz=MzIyMzA5NjEyMA==&mid=2647670717&idx=1&sn=edec1f6cda0c1227e72cd07abf4228ff&chksm=f19a699bb993eb9ed2850ba329f382668bc7edc8a2d7d4a94de2d29c15cf87aa05bf6b48dc6d&mpshare=1&scene=1&srcid=0429TzXAJtS5jA2QI9hLEroV&sharer_shareinfo=7fd7493f3ccf9923f55b48a05619ce1b&sharer_shareinfo_first=fc872ba73c219b858d700a9db530b5b1#rd\" target=\"_blank\">点击查看详情</a>",
|
|
||||||
"timestamp": "2025-04-29 09:20:23"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "沙皮狗的忧伤",
|
|
||||||
"content": "苍老师,没写一篇",
|
|
||||||
"timestamp": "2025-04-29 09:26:19"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "我熬不动",
|
|
||||||
"timestamp": "2025-04-29 09:26:49"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "AHapi²⁰²⁵",
|
|
||||||
"content": "不要卷别人[旺柴]别人写了 就不卷他们了",
|
|
||||||
"timestamp": "2025-04-29 09:27:25"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "新闻得第一时间,做不到写了也没啥用",
|
|
||||||
"timestamp": "2025-04-29 09:27:55"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "还不如写些应用",
|
|
||||||
"timestamp": "2025-04-29 09:28:03"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "大风(Wind)",
|
|
||||||
"content": "看看哪些是5-7点发推文的,基本都是卷王了",
|
|
||||||
"timestamp": "2025-04-29 09:28:23"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "沉默王二",
|
|
||||||
"content": "身体能扛住确实离谱",
|
|
||||||
"timestamp": "2025-04-29 09:28:44"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "是啊,太肝了",
|
|
||||||
"timestamp": "2025-04-29 09:29:03"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "我前天熬夜测vidu,人已经废了好几天",
|
|
||||||
"timestamp": "2025-04-29 09:29:39"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "AHapi²⁰²⁵",
|
|
||||||
"content": "5-7点还好 早点睡也还行",
|
|
||||||
"timestamp": "2025-04-29 09:30:02"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "大风(Wind)",
|
|
||||||
"content": "效果咋样\n\n[引用](2025-04-29 09:29:39)苍何:\n我前天熬夜测vidu,人已经废了好几天",
|
|
||||||
"timestamp": "2025-04-29 09:30:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "大风(Wind)",
|
|
||||||
"content": "5点发布的\n\n[引用](2025-04-29 09:30:02)AHapi²⁰²⁵:\n5-7点还好 早点睡也还行",
|
|
||||||
"timestamp": "2025-04-29 09:30:21"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "大风(Wind)",
|
|
||||||
"content": "2小时内出文",
|
|
||||||
"timestamp": "2025-04-29 09:30:52"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "沉默王二",
|
|
||||||
"content": "意味着阿里的 coder 们也在加班和熬夜",
|
|
||||||
"timestamp": "2025-04-29 09:31:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "体验完刚上线的Vidu Q1,后劲有点大(附AI视频创作教程)\nAI视频清晰度,一致性都上了一个台阶\n\n<a href=\"http://mp.weixin.qq.com/s?__biz=MzU4NTE1Mjg4MA==&mid=2247493267&idx=1&sn=0189fb501578ce8e27142fbe2f590d03&chksm=fc9a946728c367005c19cb5a335300d05d51a441f9f20424a0a72c904a47bdf003252576318a&mpshare=1&scene=1&srcid=04297l70B2zsuypDfjUh0rh5&sharer_shareinfo=181efb947f938ab90786c776bf7bbda7&sharer_shareinfo_first=181efb947f938ab90786c776bf7bbda7#rd\" target=\"_blank\">点击查看详情</a>",
|
|
||||||
"timestamp": "2025-04-29 09:39:42"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "@大风(Wind) 你看看,效果还可以",
|
|
||||||
"timestamp": "2025-04-29 09:40:01"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "AHapi²⁰²⁵",
|
|
||||||
"content": "他们加班熬夜 赚的还是多啊[Facepalm]我们加班熬夜 就一点屁钱\n\n[引用](2025-04-29 09:31:00)沉默王二:意味着阿里的 coder 们也在加班和熬夜",
|
|
||||||
"timestamp": "2025-04-29 09:40:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "阿里新出的夸克AI相机,强大到我有点陌生。\n夸克AI相机超多新奇的玩法,太抽象了。\n\n<a href=\"http://mp.weixin.qq.com/s?__biz=MzU4NTE1Mjg4MA==&mid=2247493275&idx=1&sn=93556ddd1da7fb8733a23a7c4adbb76b&chksm=fc2a2d25774cce23c75acd8850b85c585c0bcf78d14b810e157efaec5106abf563cf58e26aef&mpshare=1&scene=1&srcid=0429vDf8NbEzNLBQQyFlABmU&sharer_shareinfo=28b94477ec8201b88aa30338e82e8999&sharer_shareinfo_first=28b94477ec8201b88aa30338e82e8999#rd\" target=\"_blank\">点击查看详情</a>",
|
|
||||||
"timestamp": "2025-04-29 09:42:38"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "我熬夜写了这一篇[旺柴]",
|
|
||||||
"timestamp": "2025-04-29 09:42:54"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "AHapi²⁰²⁵",
|
|
||||||
"content": "成功还得肝啊",
|
|
||||||
"timestamp": "2025-04-29 09:43:15"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "2025年04月29日 AI科技早报\n\n1、阿里开源8款Qwen3模型,集成MCP,性能超DeepSeek-R1、OpenAI o1。\n\n2、Qafind Labs发布ChatDLM扩散语言模型,推理速度高达2800 tokens/s。\n\n3、腾讯开源Kuikly跨端框架,基于Kotlin支持多平台开发,已应用于QQ。\n\n4、OpenAI 推出 ChatGPT 购物功能,用户可通过 ChatGPT 便捷购物。\n\n5、字节Seed团队提出PHD-Transformer,突破预训练长度扩展瓶颈。\n\n6、百度发布文心快码3.5版本与多模态AI智能体Zulu,助力工程师提效。\n\n7、Kimi与财新传媒合作,提供专业财经内容,推动AI+传统媒体融合。\n\n8、苹果加速「N50」智能眼镜项目,融合AI技术预计2027年亮相。\n\n9、研究显示OpenAI o3在病毒学领域超越94%人类专家,生物安全引关注。\n\n10、华为测试自研AI芯片Ascend 910D,旨在替代英伟达H100芯片。\n\n11、🔥【记得收藏】早报同步更新到开源 AI 知识库:https://u55dyuejxc.feishu.cn/wiki/FkmNwxYHDigJ3akIUGHc8MSTn4d",
|
|
||||||
"timestamp": "2025-04-29 10:00:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "问一下win11电脑,你长时间没清理,运行慢,一般用什么来清理电脑? 不要360啊,那个太流氓了,想知道各位大佬有没有优秀的软件推荐一下",
|
|
||||||
"timestamp": "2025-04-29 11:10:26"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "ccclean",
|
|
||||||
"timestamp": "2025-04-29 11:11:59"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "我拍了拍\"银色子弹-捷\"[炸弹]",
|
|
||||||
"timestamp": "2025-04-29 11:12:04"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "🤑程序儒",
|
|
||||||
"content": "360极速版、Wise Care 365",
|
|
||||||
"timestamp": "2025-04-29 11:13:07"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "AHapi²⁰²⁵",
|
|
||||||
"content": "仅2MB,Windows瞬间超级丝滑!\n这才是,真神器!\n\n<a href=\"https://mp.weixin.qq.com/s/es77Jc6Du03ppJD5XJeQUg\" target=\"_blank\">点击查看详情</a>",
|
|
||||||
"timestamp": "2025-04-29 11:13:38"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "好的,我去尝试一下",
|
|
||||||
"timestamp": "2025-04-29 11:21:41"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "感谢",
|
|
||||||
"timestamp": "2025-04-29 11:21:53"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "ಠ_ಠ 闲鱼一条ಠ_ಠ",
|
|
||||||
"content": "请问哪位哥还有扣子的邀请码吗?",
|
|
||||||
"timestamp": "2025-04-29 11:37:49"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "贾👦🏻",
|
|
||||||
"content": "RootUser_2105656329 邀请你体验扣子空间,快来和 Agent 一起开始你的工作吧!\nhttps://www.coze.cn/space-preview?invite_code=SCL7DAL0",
|
|
||||||
"timestamp": "2025-04-29 11:40:37"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "ಠ_ಠ 闲鱼一条ಠ_ಠ",
|
|
||||||
"content": "感谢[抱拳]",
|
|
||||||
"timestamp": "2025-04-29 11:42:45"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "9527",
|
|
||||||
"content": "RootUser_2106519373 邀请你体验扣子空间,快来和 Agent 一起开始你的工作吧!\nhttps://www.coze.cn/space-preview?invite_code=A8IT4MUE",
|
|
||||||
"timestamp": "2025-04-29 11:47:43"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "9527",
|
|
||||||
"content": "RootUser_2106519373 邀请你体验扣子空间,快来和 Agent 一起开始你的工作吧!\nhttps://www.coze.cn/space-preview?invite_code=7QUCYZKC",
|
|
||||||
"timestamp": "2025-04-29 11:47:53"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "AHapi²⁰²⁵",
|
|
||||||
"content": "Qwen3:心性\n可与之「坐而论道」\n\n<a href=\"http://mp.weixin.qq.com/s?__biz=MzkxMzc1NzM1Mw==&mid=2247484627&idx=1&sn=7c7a94d29958190891ad226b5ec5cc38&chksm=c015d84ed34eb92b1984f9dd3398a5c6aff8c2353926ddf32d9c3ba63ec6b9397c44f9acde43&mpshare=1&scene=1&srcid=0429iLCl6ZCYkHKLUVjGjJSC&sharer_shareinfo=2cbd22d2f91edbb0c1b4fbe3d89519d0&sharer_shareinfo_first=2cbd22d2f91edbb0c1b4fbe3d89519d0#rd\" target=\"_blank\">点击查看详情</a>",
|
|
||||||
"timestamp": "2025-04-29 15:36:25"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "(分享)视频号视频",
|
|
||||||
"timestamp": "2025-04-29 21:08:34"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "维金",
|
|
||||||
"content": "挺牛的",
|
|
||||||
"timestamp": "2025-04-29 21:10:30"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "NowIsFuture",
|
|
||||||
"content": "表情",
|
|
||||||
"timestamp": "2025-04-29 21:15:45"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "群里有没有做智能体开发的小伙伴 我现在有个问题",
|
|
||||||
"timestamp": "2025-04-29 21:20:53"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "还有没有coze邀请码啊?",
|
|
||||||
"timestamp": "2025-04-29 21:27:15"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "大佬们",
|
|
||||||
"timestamp": "2025-04-29 21:27:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "Angora",
|
|
||||||
"content": "HT2QP13K 这个你试试\n\n[引用](2025-04-29 21:27:16)昏沉沉的:还有没有coze邀请码啊?",
|
|
||||||
"timestamp": "2025-04-29 21:28:38"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "感谢",
|
|
||||||
"timestamp": "2025-04-29 21:29:36"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "Angora",
|
|
||||||
"content": "表情",
|
|
||||||
"timestamp": "2025-04-29 21:30:03"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "虫虫",
|
|
||||||
"content": "新手学习神经网络",
|
|
||||||
"timestamp": "2025-04-29 23:38:02"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "虫虫",
|
|
||||||
"content": "RNN|什么是循环神经网络?为什么它能“记住”过去?\nRNN(卷积神经网络)\n\n<a href=\"http://mp.weixin.qq.com/s?__biz=Mzk3NTI3NzE1OA==&mid=2247483990&idx=1&sn=ec2b8b7a0a083101d5efc7edf44a6b08&chksm=c5c9a8cc4ae1e6ed32141e22e4685bb085725c7577406e6432ea09fdc09080cab67ea7b26bc9&mpshare=1&scene=1&srcid=0429B4XDtHLFVkYtCmYDKAlu&sharer_shareinfo=fe79b1f510734762eebf9ac7f0e05049&sharer_shareinfo_first=fe79b1f510734762eebf9ac7f0e05049#rd\" target=\"_blank\">点击查看详情</a>",
|
|
||||||
"timestamp": "2025-04-29 23:38:02"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "2025年04月30日 AI科技早报\n\n1、习近平总书记调研上海 “模速空间” ,关注人工智能发展。\n\n2、通义App及网页版新增开源模型 Qwen3,用户可体验智能对话功能。\n\n3、马斯克将发Grok 3.5早期测试版,仅限订阅用户,专攻专业领域解答。\n\n4、Meta推AI助手Meta AI APP,融合社交,支持文字语音互动及图像生成。\n\n5、ChatGPT被指对未成年生成色情内容,OpenAI确认并将紧急修复。\n\n6、宇树科技G1机器人完成13.2公里长跑,118分钟续航回应马拉松摔倒质疑。\n\n7、微软与OpenAI因算力、模型权限及 AGI 开发等问题分歧加剧,关系趋紧。\n\n8、智象未来HiDream-I1模型被谷歌收录,多项指标超GPT-4o与Flux1.1。\n\n9、联合包裹计划与 Figure AI 合作部署人形机器人,提升物流效率。\n\n10、星纪魅族与蚂蚁国际将推智能眼镜线下支付功能,预计第三季度落地。\n\n11、🔥【记得收藏】早报同步更新到开源 AI 知识库:https://u55dyuejxc.feishu.cn/wiki/FkmNwxYHDigJ3akIUGHc8MSTn4d",
|
|
||||||
"timestamp": "2025-04-30 10:00:20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "手搓完字节AI硬件,我做了个五一智能旅行小装置(附万字沉浸式教程)\n用AI硬件做了个智能旅行小装置\n\n<a href=\"http://mp.weixin.qq.com/s?__biz=MzU4NTE1Mjg4MA==&mid=2247493285&idx=1&sn=786bab4a79aa7268132e73868682a7a2&chksm=fc1640a0ed5d05149a71694489c36fc4f883b929f0adadc3091ed3b33868cd485821805a5852&mpshare=1&scene=1&srcid=0430ZGlkKd3PTEbnmA0gggS0&sharer_shareinfo=25ac984fb16d1db62435b2184986e7f3&sharer_shareinfo_first=fca869d864c78f40983f522434577929#rd\" target=\"_blank\">点击查看详情</a>",
|
|
||||||
"timestamp": "2025-04-30 11:05:21"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "枫哥 Prompter",
|
|
||||||
"content": "[强]牛气冲天\n\n[引用](2025-04-30 11:05:21)苍何:手搓完字节AI硬件,我做了个五一智能旅行小装置(附万字沉浸式教程)",
|
|
||||||
"timestamp": "2025-04-30 12:59:03"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "听说",
|
|
||||||
"content": "塞到玩偶里,出门你走路上都是最靓的仔\n\n[引用](2025-04-30 11:05:21)苍何:手搓完字节AI硬件,我做了个五一智能旅行小装置(附万字沉浸式教程)",
|
|
||||||
"timestamp": "2025-04-30 13:02:39"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "兔子先生",
|
|
||||||
"content": "定制女友角色\n\n[引用](2025-04-30 11:05:21)苍何:手搓完字节AI硬件,我做了个五一智能旅行小装置(附万字沉浸式教程)",
|
|
||||||
"timestamp": "2025-04-30 13:13:35"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "图片",
|
|
||||||
"timestamp": "2025-04-30 15:13:20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "@苍何 这个设备相当于是语音话筒吗? 真正大模型在云端高的是吗?",
|
|
||||||
"timestamp": "2025-04-30 15:13:57"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "那这样的话手机本身也能做为这个终端啊,未什么要这个设备呢? 请教一下",
|
|
||||||
"timestamp": "2025-04-30 15:14:27"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "产品\n\n[引用](2025-04-30 15:14:27):那这样的话手机本身也能做为这个终端啊,未什么要这个设备呢? 请教一下",
|
|
||||||
"timestamp": "2025-04-30 15:17:57"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "可以嵌入到其他东西里面",
|
|
||||||
"timestamp": "2025-04-30 15:18:10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "比如娃娃",
|
|
||||||
"timestamp": "2025-04-30 15:18:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "各种高端玩具倒是可以啊",
|
|
||||||
"timestamp": "2025-04-30 15:32:42"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "这样的玩具需要联网是必要的,wifi 或者蓝牙 或4G",
|
|
||||||
"timestamp": "2025-04-30 15:33:43"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "tina ",
|
|
||||||
"content": "是天猫精灵或者小度的迷你版?",
|
|
||||||
"timestamp": "2025-04-30 15:49:02"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "向波",
|
|
||||||
"content": "嗯嗯,比较贵的是电池、大模型云服务、BOM材料、代工费几个部分",
|
|
||||||
"timestamp": "2025-04-30 15:50:52"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "向波",
|
|
||||||
"content": "物联网卡一年几块钱,还好",
|
|
||||||
"timestamp": "2025-04-30 15:51:04"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "其他都还好,大模型云服务这个可能贵",
|
|
||||||
"timestamp": "2025-04-30 15:52:12"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "虫虫",
|
|
||||||
"content": "想想可能也还好 一个设备 一年能对话多少次 总共tokens消耗量有限 \n\n[引用](2025-04-30 15:52:12)银色子弹-捷:其他都还好,大模型云服务这个可能贵",
|
|
||||||
"timestamp": "2025-04-30 15:57:56"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "tina ",
|
|
||||||
"content": "这装置,应用在什么上?",
|
|
||||||
"timestamp": "2025-04-30 15:58:56"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "虫虫",
|
|
||||||
"content": "比如毛茸茸玩具[机智]",
|
|
||||||
"timestamp": "2025-04-30 15:59:52"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "兔子先生",
|
|
||||||
"content": "AI小智",
|
|
||||||
"timestamp": "2025-04-30 16:00:44"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "兔子先生",
|
|
||||||
"content": "前段时间非常火",
|
|
||||||
"timestamp": "2025-04-30 16:00:50"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "兔子先生",
|
|
||||||
"content": "卖的非常好",
|
|
||||||
"timestamp": "2025-04-30 16:00:58"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "虫虫",
|
|
||||||
"content": "小智用户还是爱好者",
|
|
||||||
"timestamp": "2025-04-30 16:01:19"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "虫虫",
|
|
||||||
"content": "还没有到终端产品形态",
|
|
||||||
"timestamp": "2025-04-30 16:01:30"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "tina ",
|
|
||||||
"content": "玩具的用户越来越少,市场也会越来越小\n\n[引用](2025-04-30 15:59:52)虫虫:比如毛茸茸玩具[机智]",
|
|
||||||
"timestamp": "2025-04-30 16:02:14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "虫虫",
|
|
||||||
"content": "宏观上判断不太准 但是现在市场还是有的",
|
|
||||||
"timestamp": "2025-04-30 16:07:36"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "兔子先生",
|
|
||||||
"content": "不是玩具少,而是你不是他的用户,玩具市场目前逐年上升\n\n[引用](2025-04-30 16:02:14)苏州跨境财务:玩具的用户越来越少,市场也会越来越小",
|
|
||||||
"timestamp": "2025-04-30 16:21:28"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "兔子先生",
|
|
||||||
"content": "图片",
|
|
||||||
"timestamp": "2025-04-30 16:30:30"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "兔子先生",
|
|
||||||
"content": "日不落直播间即将来临[旺柴]",
|
|
||||||
"timestamp": "2025-04-30 16:30:48"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "我是觉得玩具 接入蓝牙 的方式更实在,其他物联网卡的,我角度看是小众的小众了",
|
|
||||||
"timestamp": "2025-04-30 16:33:08"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "银色子弹-捷",
|
|
||||||
"content": "最大的玩具就是AI家庭机器人,如果这个发展壮大,其他的小玩具就安然失色了",
|
|
||||||
"timestamp": "2025-04-30 16:34:07"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "是的 我了解的也是这样\n\n[引用](2025-04-30 16:21:28):不是玩具少,而是你不是他的用户,玩具市场目前逐年上升",
|
|
||||||
"timestamp": "2025-04-30 16:51:17"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "🌕风林火山.培哲",
|
|
||||||
"content": "Manus邀请码现在还有人要吗",
|
|
||||||
"timestamp": "2025-04-30 17:10:54"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "沙皮狗的忧伤",
|
|
||||||
"content": "有嘛",
|
|
||||||
"timestamp": "2025-04-30 17:11:10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "🌕风林火山.培哲",
|
|
||||||
"content": "要有魔法上网才行",
|
|
||||||
"timestamp": "2025-04-30 17:11:38"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "🌕风林火山.培哲",
|
|
||||||
"content": "为了激活我科学上网买了一个月",
|
|
||||||
"timestamp": "2025-04-30 17:12:15"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "沙皮狗的忧伤",
|
|
||||||
"content": "🔮我有",
|
|
||||||
"timestamp": "2025-04-30 17:13:06"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "沙皮狗的忧伤",
|
|
||||||
"content": "我填了申请,就没信了",
|
|
||||||
"timestamp": "2025-04-30 17:13:31"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "沙皮狗的忧伤",
|
|
||||||
"content": "去官网",
|
|
||||||
"timestamp": "2025-04-30 17:13:35"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "贾👦🏻",
|
|
||||||
"content": "图片",
|
|
||||||
"timestamp": "2025-04-30 17:13:54"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "贾👦🏻",
|
|
||||||
"content": "来\n\n[引用](2025-04-30 17:10:54)深圳-电脑厂家-培哲:Manus邀请码现在还有人要吗",
|
|
||||||
"timestamp": "2025-04-30 17:13:59"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "贾👦🏻",
|
|
||||||
"content": "\"贾👦🏻\" 拍了拍 \"深圳-电脑厂家-培哲\" 看[胜利]烟花[烟花]",
|
|
||||||
"timestamp": "2025-04-30 17:16:56"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "蜗牛",
|
|
||||||
"content": "我也需要",
|
|
||||||
"timestamp": "2025-04-30 17:17:03"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "贾👦🏻",
|
|
||||||
"content": "扔出来 拼手速 哈哈",
|
|
||||||
"timestamp": "2025-04-30 17:17:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "蜗牛",
|
|
||||||
"content": "@深圳-电脑厂家-培哲",
|
|
||||||
"timestamp": "2025-04-30 17:20:05"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "视频",
|
|
||||||
"timestamp": "2025-04-30 17:49:27"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "AHapi²⁰²⁵",
|
|
||||||
"content": "图片",
|
|
||||||
"timestamp": "2025-04-30 17:54:37"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "苍何",
|
|
||||||
"content": "这个是显眼包",
|
|
||||||
"timestamp": "2025-04-30 17:57:48"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "hhh",
|
|
||||||
"timestamp": "2025-04-30 17:58:28"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "翟朗博369 ᯤ⁹ᴳ",
|
|
||||||
"content": "@深圳-电脑厂家-培哲 还有吗",
|
|
||||||
"timestamp": "2025-04-30 18:01:03"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "梦ㄆ宇",
|
|
||||||
"content": "[憨笑]",
|
|
||||||
"timestamp": "2025-04-30 18:14:12"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sender": "昏沉沉的",
|
|
||||||
"content": "图片",
|
|
||||||
"timestamp": "2025-04-30 22:24:10"
|
|
||||||
}
|
|
||||||
]"""},
|
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -988,7 +461,7 @@ class DeepSeekApi(BaseLLMApi):
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
deepseek_api = DeepSeekApi("sk-2ed4377a895d4ce18e086258c254fc8e")
|
deepseek_api = DeepSeekApi("sk-2ed4377a895d4ce18e086258c254fc8e")
|
||||||
|
|
||||||
response = deepseek_api.send_msg(module=0)
|
response = deepseek_api.send_msg(module=0,message="""""")
|
||||||
print(response)
|
print(response)
|
||||||
|
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ def export_json_mini_time_limit(wxid, outpath, db_config, my_wxid="我",
|
|||||||
start_part = start_createtime.replace(" ", "_").replace(":", "-") if start_createtime else "all"
|
start_part = start_createtime.replace(" ", "_").replace(":", "-") if start_createtime else "all"
|
||||||
end_part = end_createtime.replace(" ", "_").replace(":", "-") if end_createtime else "now"
|
end_part = end_createtime.replace(" ", "_").replace(":", "-") if end_createtime else "now"
|
||||||
time_suffix = f"_{start_part}_to_{end_part}"
|
time_suffix = f"_{start_part}_to_{end_part}"
|
||||||
filename = f"{wxid}_mini{time_suffix}.json"
|
filename = f"{wxid}_mini{time_suffix}_ai.json"
|
||||||
save_path = os.path.join(outpath, filename)
|
save_path = os.path.join(outpath, filename)
|
||||||
with open(save_path, "w", encoding="utf-8") as f:
|
with open(save_path, "w", encoding="utf-8") as f:
|
||||||
json.dump(mini_data, f, ensure_ascii=False, indent=indent)
|
json.dump(mini_data, f, ensure_ascii=False, indent=indent)
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
# Date: 2024/01/02
|
# Date: 2024/01/02
|
||||||
# -------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------
|
||||||
import datetime
|
import datetime
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import shutil
|
import shutil
|
||||||
@ -29,8 +30,6 @@ from .export.exportJSON import export_json_mini, export_json_mini_time_limit
|
|||||||
from .rjson import ReJson, RqJson
|
from .rjson import ReJson, RqJson
|
||||||
from .utils import error9999, gc, asyncError9999, rs_loger
|
from .utils import error9999, gc, asyncError9999, rs_loger
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
rs_api = APIRouter()
|
rs_api = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
@ -151,7 +150,6 @@ def get_msgs(wxid: str = Body(...), start: int = Body(...), limit: int = Body(..
|
|||||||
end_createtime = datetime.datetime.now().timestamp()
|
end_createtime = datetime.datetime.now().timestamp()
|
||||||
msgs, users = db.get_msgs(wxids=wxid, start_index=start, page_size=limit, ) #
|
msgs, users = db.get_msgs(wxids=wxid, start_index=start, page_size=limit, ) #
|
||||||
|
|
||||||
|
|
||||||
return ReJson(0, {"msg_list": msgs, "user_list": users})
|
return ReJson(0, {"msg_list": msgs, "user_list": users})
|
||||||
|
|
||||||
|
|
||||||
@ -478,8 +476,9 @@ def get_export_json(wxid: str = Body(..., embed=True)):
|
|||||||
|
|
||||||
|
|
||||||
class ExportJsonMiniRequest(BaseModel):
|
class ExportJsonMiniRequest(BaseModel):
|
||||||
start_createtime: str
|
start_createtime: int
|
||||||
end_createtime: str
|
end_createtime: int
|
||||||
|
|
||||||
|
|
||||||
@rs_api.api_route('/export_json_mini_select_time', methods=["GET", 'POST'])
|
@rs_api.api_route('/export_json_mini_select_time', methods=["GET", 'POST'])
|
||||||
def get_export_json(wxid: str = Body(..., embed=True), time: ExportJsonMiniRequest = Body(..., embed=True)):
|
def get_export_json(wxid: str = Body(..., embed=True), time: ExportJsonMiniRequest = Body(..., embed=True)):
|
||||||
@ -487,6 +486,7 @@ def get_export_json(wxid: str = Body(..., embed=True),time: ExportJsonMiniReques
|
|||||||
导出json,选择时间,迷你版本
|
导出json,选择时间,迷你版本
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
my_wxid = gc.get_conf(gc.at, "last")
|
my_wxid = gc.get_conf(gc.at, "last")
|
||||||
if not my_wxid: return ReJson(1001, body="my_wxid is required")
|
if not my_wxid: return ReJson(1001, body="my_wxid is required")
|
||||||
db_config = gc.get_conf(my_wxid, "db_config")
|
db_config = gc.get_conf(my_wxid, "db_config")
|
||||||
@ -498,10 +498,15 @@ def get_export_json(wxid: str = Body(..., embed=True),time: ExportJsonMiniReques
|
|||||||
if not os.path.exists(outpath):
|
if not os.path.exists(outpath):
|
||||||
os.makedirs(outpath)
|
os.makedirs(outpath)
|
||||||
|
|
||||||
start_createtime = time.start_createtime # 格式为 "2025-05-01 18:06:00"
|
start_createtime = time.start_createtime / 1000.0 # 格式为 时间戳
|
||||||
end_createtime = time.end_createtime
|
end_createtime = time.end_createtime / 1000.0
|
||||||
|
|
||||||
code, ret,filename = export_json_mini_time_limit(wxid, outpath, db_config, my_wxid=my_wxid,start_createtime=start_createtime, end_createtime=end_createtime)
|
|
||||||
|
start_createtime = datetime.datetime.fromtimestamp(float(start_createtime)).strftime("%Y-%m-%d %H:%M:%S") #转换成日期格式
|
||||||
|
end_createtime = datetime.datetime.fromtimestamp(float(end_createtime)).strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
code, ret, filename = export_json_mini_time_limit(wxid, outpath, db_config, my_wxid=my_wxid,
|
||||||
|
start_createtime=start_createtime, end_createtime=end_createtime)
|
||||||
if code:
|
if code:
|
||||||
# 成功创建,执行生成可视化页面的逻辑
|
# 成功创建,执行生成可视化页面的逻辑
|
||||||
# with open(os.path.join(gc.work_path, "export", my_wxid, "html", wxid, filename), "w", encoding="utf-8") as f:
|
# with open(os.path.join(gc.work_path, "export", my_wxid, "html", wxid, filename), "w", encoding="utf-8") as f:
|
||||||
@ -515,7 +520,6 @@ def get_export_json(wxid: str = Body(..., embed=True),time: ExportJsonMiniReques
|
|||||||
return ReJson(2001, body=ret)
|
return ReJson(2001, body=ret)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ExportHtmlRequest(BaseModel):
|
class ExportHtmlRequest(BaseModel):
|
||||||
wxid: str
|
wxid: str
|
||||||
|
|
||||||
@ -554,6 +558,179 @@ def get_export_html(wxid: str = Body(..., embed=True)):
|
|||||||
|
|
||||||
# end 导出聊天记录 *******************************************************************************************************
|
# end 导出聊天记录 *******************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
# AI可视化生成 **********************************************
|
||||||
|
#TODO:查询当前登录用户文件夹下是否有导出数据,是否已经存在ui界面
|
||||||
|
|
||||||
|
def recursive_listdir(path,list:List):
|
||||||
|
"""
|
||||||
|
遍历文件夹获取所有文件 包括子目录
|
||||||
|
"""
|
||||||
|
|
||||||
|
files = os.listdir(path)
|
||||||
|
for file in files:
|
||||||
|
file_path = os.path.join(path, file)
|
||||||
|
if os.path.isdir(file_path):
|
||||||
|
recursive_listdir(file_path,list)
|
||||||
|
elif os.path.isfile(file_path):
|
||||||
|
list.append(file_path)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@rs_api.api_route('/ai_ui_json_list', methods=["GET", 'POST'])
|
||||||
|
def get_ai_ui_json_list():
|
||||||
|
"""
|
||||||
|
获取可视化json文件列表
|
||||||
|
"""
|
||||||
|
my_wxid = gc.get_conf(gc.at, "last")
|
||||||
|
if not my_wxid: return ReJson(1001, body="my_wxid is required")
|
||||||
|
|
||||||
|
|
||||||
|
# 遍历json文件夹,查找最后带_ai的文件
|
||||||
|
work_path = os.path.join(gc.work_path, "export", my_wxid, "json")
|
||||||
|
if not os.path.exists(work_path):
|
||||||
|
return ReJson(0,body={"ui_dict_list":[],"ai_dict_list":[]})
|
||||||
|
file_list:List[str]=[]
|
||||||
|
recursive_listdir(work_path,list=file_list)
|
||||||
|
|
||||||
|
# 解析文件名
|
||||||
|
ui_list = []
|
||||||
|
for file in file_list:
|
||||||
|
if file.split('.')[0].split('_')[-1] == 'ai':
|
||||||
|
# 可进行ai可视化的文件
|
||||||
|
ui_list.append(file)
|
||||||
|
|
||||||
|
# 构造字典对象
|
||||||
|
ui_dict_list = []
|
||||||
|
for s in ui_list:
|
||||||
|
wxid = s.split('.')[0].split('_')[0] # wxid
|
||||||
|
time_start = " ".join(s.split('.')[0].split('_')[2:4]) # time start
|
||||||
|
time_end = " ".join(s.split('.')[0].split('_')[5:7]) # time end
|
||||||
|
flag = s.split('.')[0].split('_')[-1] # flag
|
||||||
|
ui_dict_list.append({"wxid": wxid, "time_start": time_start, "time_end": time_end, "flag": flag})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 遍历ai_json文件夹,获取所有文件名
|
||||||
|
work_path = os.path.join(gc.work_path, "export", my_wxid, "ai_json")
|
||||||
|
if not os.path.exists(work_path):
|
||||||
|
return ReJson(0,body={"ui_dict_list":ui_dict_list,"ai_dict_list":[]})
|
||||||
|
file_list:List[str]=[]
|
||||||
|
recursive_listdir(work_path,list=file_list)
|
||||||
|
|
||||||
|
# 解析文件名
|
||||||
|
ai_list = []
|
||||||
|
for file in file_list:
|
||||||
|
ai_list.append(file)
|
||||||
|
|
||||||
|
ai_dict_list = []
|
||||||
|
|
||||||
|
# 构造字典对象
|
||||||
|
for s in ai_list:
|
||||||
|
wxid = s.split('.')[0].split('_')[0] # wxid
|
||||||
|
time_start = " ".join(s.split('.')[0].split('_')[2:4]) # time start
|
||||||
|
time_end = " ".join(s.split('.')[0].split('_')[5:7]) # time end
|
||||||
|
ai_dict_list.append({"wxid": wxid, "time_start": time_start, "time_end": time_end})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return ReJson(0,body={"ui_dict_list":ui_dict_list,"ai_dict_list":ai_dict_list})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_file_path(work_path: str, file_name: str) -> str | None:
|
||||||
|
"""
|
||||||
|
获取ai_json文件路径
|
||||||
|
"""
|
||||||
|
path_list = os.listdir(work_path)
|
||||||
|
for path in path_list:
|
||||||
|
full_path = os.path.join(work_path, path)
|
||||||
|
if os.path.isfile(full_path) and path == file_name:
|
||||||
|
return full_path
|
||||||
|
elif os.path.isdir(full_path):
|
||||||
|
result = get_file_path(full_path, file_name)
|
||||||
|
if result is not None:
|
||||||
|
return result
|
||||||
|
return None
|
||||||
|
|
||||||
|
class FileNameRequest(BaseModel):
|
||||||
|
wxid: str
|
||||||
|
start_time: int
|
||||||
|
end_time: int
|
||||||
|
|
||||||
|
@rs_api.api_route('/db_to_ai_json', methods=["GET", 'POST'])
|
||||||
|
def db_to_ai_json(file_name: FileNameRequest = Body(..., embed=True)):
|
||||||
|
"""
|
||||||
|
导出聊天记录到ai_json
|
||||||
|
"""
|
||||||
|
start_time = file_name.start_time /1000.0
|
||||||
|
end_time = file_name.end_time /1000.0
|
||||||
|
wxid = file_name.wxid
|
||||||
|
start_time = datetime.datetime.fromtimestamp(float(start_time)).strftime("%Y-%m-%d %H:%M:%S") #转换成日期格式
|
||||||
|
end_time = datetime.datetime.fromtimestamp(float(end_time)).strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
file_name = wxid + '_mini_' + start_time.replace(' ', '_').replace(':', '-') + '_' + end_time.replace(' ', '_').replace(':', '-') + '_ai'
|
||||||
|
# file_name = wxid + '_aiyes_' + start_time.replace(' ', '_').replace(':', '-') + '_' + end_time.replace(' ', '_').replace(':', '-')
|
||||||
|
file_name = file_name + '.json'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
my_wxid = gc.get_conf(gc.at, "last")
|
||||||
|
if not my_wxid: return ReJson(1001, body="my_wxid is required")
|
||||||
|
|
||||||
|
result = get_file_path(os.path.join(gc.work_path, "export", my_wxid, "json"), file_name)
|
||||||
|
|
||||||
|
if result is None:
|
||||||
|
return ReJson(1002, body=f"file not found: {file_name}")
|
||||||
|
|
||||||
|
# 获取文件内容
|
||||||
|
with open(result, "r", encoding="utf-8") as f:
|
||||||
|
json_data = json.load(f)
|
||||||
|
if not json_data:
|
||||||
|
return ReJson(1002, body=f"json_data is empty: {file_name}")
|
||||||
|
|
||||||
|
#通过llm处理,生成ai_json
|
||||||
|
from .api_utils.llm import DeepSeekApi
|
||||||
|
# 获取apikey
|
||||||
|
apikey = gc.get_conf(my_wxid, "deepseek_setting").get("API_KEY")
|
||||||
|
if not apikey:
|
||||||
|
return ReJson(1002, body="deepseek_setting.API_KEY is required")
|
||||||
|
llm_api = DeepSeekApi(api_key=apikey)
|
||||||
|
json_data = llm_api.send_msg(module=0,message=json_data)
|
||||||
|
|
||||||
|
# 保存到ai_json
|
||||||
|
ai_json_path = os.path.join(gc.work_path, "export", my_wxid, "ai_json")
|
||||||
|
if not os.path.exists(ai_json_path):
|
||||||
|
os.makedirs(ai_json_path)
|
||||||
|
|
||||||
|
assert isinstance(ai_json_path, str)
|
||||||
|
file_name = wxid + '_aiyes_' + start_time.replace(' ', '_').replace(':', '-') + '_' + end_time.replace(' ',
|
||||||
|
'_').replace(
|
||||||
|
':', '-')
|
||||||
|
file_name = file_name + '.json'
|
||||||
|
ai_json_file_path = os.path.join(ai_json_path, file_name)
|
||||||
|
with open(ai_json_file_path, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(json_data, f, ensure_ascii=False)
|
||||||
|
|
||||||
|
return ReJson(0, body=f"save to {ai_json_file_path}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# AI可视化生成 *******************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# start 聊天记录分析api **************************************************************************************************
|
# start 聊天记录分析api **************************************************************************************************
|
||||||
class DateCountRequest(BaseModel):
|
class DateCountRequest(BaseModel):
|
||||||
wxid: str = ""
|
wxid: str = ""
|
||||||
@ -741,6 +918,7 @@ def dify_setting(request: Request = None, dify: DifyApiModel = Body(None, embed=
|
|||||||
return ReJson(0, body=gc.get_conf(my_wxid, "dify_setting"))
|
return ReJson(0, body=gc.get_conf(my_wxid, "dify_setting"))
|
||||||
return ReJson(2001, body="status_code is not 200")
|
return ReJson(2001, body="status_code is not 200")
|
||||||
|
|
||||||
|
|
||||||
class DeepSeekApiModel(BaseModel):
|
class DeepSeekApiModel(BaseModel):
|
||||||
api_key: str
|
api_key: str
|
||||||
|
|
||||||
|
@ -105,8 +105,15 @@ const handleClose = (key: string, keyPath: string[]) => {
|
|||||||
<el-menu-item index='/decrypt'>解密数据</el-menu-item>
|
<el-menu-item index='/decrypt'>解密数据</el-menu-item>
|
||||||
<el-menu-item index='/merge'>数据库合并</el-menu-item>
|
<el-menu-item index='/merge'>数据库合并</el-menu-item>
|
||||||
</el-sub-menu>
|
</el-sub-menu>
|
||||||
|
|
||||||
|
<el-menu-item index='/chat2ui_select'>
|
||||||
|
<statistics-icon></statistics-icon>
|
||||||
|
<template #title>AI可视化</template>
|
||||||
|
</el-menu-item>
|
||||||
|
|
||||||
</el-menu>
|
</el-menu>
|
||||||
|
|
||||||
|
|
||||||
<el-menu default-active="1" class="el-menu-vertical-demo" :collapse="isCollapse" @open="handleOpen"
|
<el-menu default-active="1" class="el-menu-vertical-demo" :collapse="isCollapse" @open="handleOpen"
|
||||||
@close="handleClose" :router='true'>
|
@close="handleClose" :router='true'>
|
||||||
<el-menu-item index='/about'>
|
<el-menu-item index='/about'>
|
||||||
|
@ -21,12 +21,13 @@ const Result = ref("");
|
|||||||
const requestExport = async () => {
|
const requestExport = async () => {
|
||||||
Result.value = "正在处理中...";
|
Result.value = "正在处理中...";
|
||||||
try {
|
try {
|
||||||
|
console.log(datetime.value); // 打印datetime.value的值,查看是否正确传递给后端
|
||||||
Result.value = await http.post('/api/rs/export_json_mini_select_time', {
|
Result.value = await http.post('/api/rs/export_json_mini_select_time', {
|
||||||
'wxid': props.wxid,
|
'wxid': props.wxid,
|
||||||
// 'datetime': datetime.value,
|
// 'datetime': datetime.value,
|
||||||
"time":{
|
"time":{
|
||||||
"start_time":datetime.value[0],
|
"start_createtime":datetime.value[0],
|
||||||
"end_time":datetime.value[1]
|
"end_createtime":datetime.value[1]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -38,6 +39,8 @@ const requestExport = async () => {
|
|||||||
|
|
||||||
// 处理时间选择器的数据
|
// 处理时间选择器的数据
|
||||||
const handDatetimeChildData = (val: any) => {
|
const handDatetimeChildData = (val: any) => {
|
||||||
|
// 明确指定 timer 参数的类型为 Date,解决隐式 any 类型问题
|
||||||
|
|
||||||
datetime.value = val;
|
datetime.value = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,10 +48,10 @@ const handDatetimeChildData = (val: any) => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<!-- <div>-->
|
<div>
|
||||||
<!-- <strong>时间(默认全部):</strong>-->
|
<strong>时间(默认全部):</strong>
|
||||||
<!-- <DateTimeSelect @datetime="handDatetimeChildData"/>-->
|
<DateTimeSelect @datetime="handDatetimeChildData"/>
|
||||||
<!-- </div>-->
|
</div>
|
||||||
|
|
||||||
<div style="position: relative;">
|
<div style="position: relative;">
|
||||||
<el-button type="primary" @click="requestExport()">导出</el-button>
|
<el-button type="primary" @click="requestExport()">导出</el-button>
|
||||||
|
@ -109,7 +109,7 @@ watch(() => datetime.value, (newVal: any, oldVal: any) => {
|
|||||||
start-placeholder="开始时间"
|
start-placeholder="开始时间"
|
||||||
end-placeholder="结束时间"
|
end-placeholder="结束时间"
|
||||||
:default-time="defaultTime"
|
:default-time="defaultTime"
|
||||||
format="YYYY-MM-DD HH:mm"
|
format="YYYY-MM-DD HH:mm:ss"
|
||||||
/>
|
/>
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
</template>
|
</template>
|
||||||
|
@ -23,6 +23,12 @@ const router = createRouter({
|
|||||||
name: 'chat',
|
name: 'chat',
|
||||||
component: () => import((`@/views/ChatView.vue`))
|
component: () => import((`@/views/ChatView.vue`))
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/chat2ui_select',
|
||||||
|
name: 'chat2ui_select',
|
||||||
|
component: () => import((`@/views/Chat2UiSelectVue.vue`))
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
path: '/chat2ui',
|
path: '/chat2ui',
|
||||||
name: 'chat2ui',
|
name: 'chat2ui',
|
||||||
|
0
pywxdump/ui/src/views/Chat2UiSelectVue.vue
Normal file
0
pywxdump/ui/src/views/Chat2UiSelectVue.vue
Normal file
Loading…
Reference in New Issue
Block a user