From b11c7168bf92a39956d173b176bddf198998e7bb Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Fri, 7 Mar 2025 07:55:14 +0800 Subject: [PATCH] 'commit' --- AI/AiService/MarkdownToJsonConverter.py | 32 +++---- .../{CallDeepSeekStream.py => Start.py} | 78 ++++++------------ .../MarkdownToJsonConverter.cpython-310.pyc | Bin 0 -> 5323 bytes 3 files changed, 34 insertions(+), 76 deletions(-) rename AI/AiService/{CallDeepSeekStream.py => Start.py} (80%) create mode 100644 AI/AiService/__pycache__/MarkdownToJsonConverter.cpython-310.pyc diff --git a/AI/AiService/MarkdownToJsonConverter.py b/AI/AiService/MarkdownToJsonConverter.py index 35d02520..c0e31d7f 100644 --- a/AI/AiService/MarkdownToJsonConverter.py +++ b/AI/AiService/MarkdownToJsonConverter.py @@ -1,3 +1,4 @@ +import asyncio import json import re from CommonUtil import * @@ -107,30 +108,31 @@ class MarkdownToJsonConverter: return result - def generate_descriptions_for_json_batch(self, json_data): + async def generate_descriptions_for_json_batch(self, json_data): """ 批量生成描述语句,并替换 JSON 中的 text 属性 """ for item in json_data: if "data" in item and "title" in item["data"]: title = item["data"]["title"] - description = self.generate_description(title) + description = await self.generate_description(title) item["data"]["text"] = description if "data" in item and "items" in item["data"]: for sub_item in item["data"]["items"]: if "title" in sub_item: title = sub_item["title"] - description = self.generate_description(title) + description = await self.generate_description(title) sub_item["text"] = description - print(item) + yield json.dumps(item, ensure_ascii=False) + await asyncio.sleep(0.5) # 控制逐行输出的速度 - def generate_description(self, title): + async def generate_description(self, title): """ 调用 AI 接口,生成描述语句(限制在 20 个字以内) """ try: - response = self.client.chat.completions.create( + response = await self.client.chat.completions.create( model=MODEL_NAME, messages=[ {"role": "system", "content": "你是一个专业的助手,能够根据上下文生成简洁的描述信息。"}, @@ -151,7 +153,7 @@ class MarkdownToJsonConverter: print(f"调用 AI 生成描述信息时出错:{e}") return title - def convert_markdown_to_json(self, markdown_content): + async def convert_markdown_to_json(self, markdown_content): """ 将 Markdown 内容转换为 JSON 格式 """ @@ -174,17 +176,5 @@ class MarkdownToJsonConverter: listAll.append(item) # 生成描述 - self.generate_descriptions_for_json_batch(listAll) - - -if __name__ == "__main__": - # 读取 Sample.md 内容 - with open("Sample.md", "r", encoding="utf-8") as file: - markdown_content = file.read() - - # 创建转换器实例 - converter = MarkdownToJsonConverter(client) - - # 转换 Markdown 为 JSON - converter.convert_markdown_to_json(markdown_content) - + async for item in self.generate_descriptions_for_json_batch(listAll): + yield item diff --git a/AI/AiService/CallDeepSeekStream.py b/AI/AiService/Start.py similarity index 80% rename from AI/AiService/CallDeepSeekStream.py rename to AI/AiService/Start.py index 6cf7c091..302ee8f0 100644 --- a/AI/AiService/CallDeepSeekStream.py +++ b/AI/AiService/Start.py @@ -10,6 +10,8 @@ import markdown_to_json import json import asyncio +from AiService.MarkdownToJsonConverter import MarkdownToJsonConverter + # 阿里云中用来调用 deepseek v3 的密钥 MODEL_API_KEY = "sk-01d13a39e09844038322108ecdbd1bbc" MODEL_NAME = "qwen-plus" @@ -143,37 +145,13 @@ def expand_text_with_ai(json_dict): return json_dict -async def ConvertMarkdownToJson(markdown_content): - """ - 生成一个 AsyncIterable,逐行返回 JSON 字符串 - """ - # 将 Markdown 转换为字典 - json_dict = markdown_to_dict(markdown_content) - - # 调用 AI 扩写每个有 title 属性的节点 - json_dict = expand_text_with_ai(json_dict) - - # 提取一级目录 - level1_json = extract_level1(json_dict) - print(level1_json) - for item in level1_json: - yield json.dumps(item, ensure_ascii=False) - await asyncio.sleep(0.5) # 控制逐行输出的速度 - - # 生成目录部分 - contents_json = extract_contents(json_dict) - print(contents_json) - yield json.dumps(contents_json, ensure_ascii=False) - await asyncio.sleep(0.5) - - # 提取二级目录及其三级目录内容 - level2_and_level3_json = extract_level2_and_level3(json_dict) - print(level2_and_level3_json) - for item in level2_and_level3_json: - yield json.dumps(item, ensure_ascii=False) - await asyncio.sleep(0.5) - - # 添加结束标记 +async def convertMarkdownToJson(markdown_content): + # 创建转换器实例 + converter = MarkdownToJsonConverter(client) + # 转换 Markdown 为 JSON + async for item in converter.convert_markdown_to_json(markdown_content): + yield item + # 添加结束标记 yield '{"type": "end" }' @@ -265,7 +243,7 @@ async def aippt_outline( @app.post("/api/tools/aippt") # 修改为 POST 方法 async def aippt(content: str = Body(..., embed=True, description="Markdown 内容")): # 使用 Body 接收请求体参数 return StreamingResponse( - ConvertMarkdownToJson(content), # 传入 content + convertMarkdownToJson(content), # 传入 content media_type="text/plain", # 使用 text/plain 格式 headers={ "Cache-Control": "no-cache", @@ -279,26 +257,16 @@ async def aippt(content: str = Body(..., embed=True, description="Markdown 内 # 运行应用 if __name__ == "__main__": - # # 获取本机所有 IPv4 地址 - # ips = get_local_ips() - # if not ips: - # print("无法获取本机 IP 地址,使用默认地址 127.0.0.1") - # ips = ["127.0.0.1"] - # - # # 打印所有 IP 地址 - # print("服务将在以下 IP 地址上运行:") - # for ip in ips: - # print(f"http://{ip}:5173") - # - # # 启动 FastAPI 应用,绑定到所有 IP 地址 - # uvicorn.run(app, host="0.0.0.0", port=5173) - - # 读取Sample.md - with open("Sample.md", "r", encoding="utf-8") as f: - markdown_content = f.read() - json_dict = markdown_to_dict(markdown_content) - - # 调用 AI 扩写每个有 title 属性的节点 - json_dict = expand_text_with_ai(json_dict) - - print(json_dict) + # 获取本机所有 IPv4 地址 + ips = get_local_ips() + if not ips: + print("无法获取本机 IP 地址,使用默认地址 127.0.0.1") + ips = ["127.0.0.1"] + + # 打印所有 IP 地址 + print("服务将在以下 IP 地址上运行:") + for ip in ips: + print(f"http://{ip}:5173") + + # 启动 FastAPI 应用,绑定到所有 IP 地址 + uvicorn.run(app, host="0.0.0.0", port=5173) \ No newline at end of file diff --git a/AI/AiService/__pycache__/MarkdownToJsonConverter.cpython-310.pyc b/AI/AiService/__pycache__/MarkdownToJsonConverter.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ab76b3e097b4e5d2c17bf52e4d03ec82236d2a6 GIT binary patch literal 5323 zcmb7IU2q%K72aQIwN@NAxB)}ys5R{%z@A{2PA5$RAqkK)afS(y!8m9X?Z%NKOZMGW zel+Wjoj9=_;y4UR2*iL)%TIv(v~+^w#N&s)^{LPM)ETsE`za5dzR;=Zckasa4|Ype zbMNlGd+xb+&;8Ch-&JnS8ePEUJoVT1Hy#p%uc@*4lF@hu#cD!j2!@yuT7$dTD)P3} zD&a0=0W zQf{Y}%WlnOkC@ChS&Al|zv!9DRuqd2;fRiq!1qCgNQ(}oGHEkw$0b*>%*;WiK<28z zLb!diaoff=!`hc)hudCEXWMt>vh8hKcC>9t?={(xbjoa7Wd)60$6YOvNN3Y_BB9aD zv;#){%;`A&p@t3>n{~<2Y?e&fiHv!~%siQ}({{$J!W)ZhSEDGR zE-GT-iPem^((omQq&@wwhO}i{DXI?4cv9?<9WtbpZ^x*L75;}I{h?lebf`3Ob~SU} zyL)zK>VkLWeVDv7{+WOA=JcKZiuOX)>-7~Q$3u*O>V^-dvqmzLVNq%+nY3lQijhv) zu6B^+IuD!2t+>K1&8oRPH?C>5R_C+n?!1{Ox0jpyhfD0$6qwtpg$j#MU!zo$wHv;d zwdY4KF*j+ULin{@RE}5_#)KX?{*cfv42dYxfG{8qNC$ykL+;mLbZMKg|HU4~QHmmD zakn1su0=~SlrfQQ928jGkxvRDBGi!JP|y%hNpcG;VJ%NrX0?plH+%zlf@ z)l!Gj8H1TwL`#)>sjH@Kv(svc%Wf#y)n#T4S4rg%{?t?k(Sbwns@z(g$}C_+}H!C3Q9e7Q{X5_4YB-MJouxZd2dd7=ZB|1FV37f zF-tKWp-{KFG6-1dtZBKbWwUe_y6hygt)prC5JSop;L)^Eft#val>G!9Zw7|C6ZY$O1+8% z8L9B(|82@8{!Y<~R?73#F+8-x*Buf5{1gRK0%VV3NDh3OplB$gQV)V{QE*i9DM+Yw z0;C`A2{|Dy9X3KnxL-g^qc;f3nh|lr_-Ted3I+lV5v~D#3vYj@TXD!6tMboc`bt>! zZl0dL^Opa9zjyW$BCbDteP;3tfB3`F_=JCUz`On~dD+grds8(f7PBG`Wlpuzs@n<(_Ba-Ch950FMuzg{S8Uv1NnY>5aZ zfW>^u&NDM%=Mo)YNDKI1(8wNyHaA>O(8%1}1sZ5_dV@7`0P8_Uk5qKB7~ZyqxF0u_ z{kfbBTC0LyK4)2E!R2|_;JV9l&0KEzN7t?T6?-tT^%yEe(EwzLE>W2a&FSGN+Uv?a z==*nQE~-iYRMxBx@KtA70&v<3+R&{qy)}V{z5w3)D5W{l5rNeM-gvGP=s9?z7!3Fe zfVn&-?m!fNfv2_dTV)fH4IjJHfHRcG?kv9z9AbTs3cV_H?r`w5iaynVuI^@A?4UKk zafYQ=5an&Th;%nUGn@o`8=#BiTkruDr29j+X9q^6FMQw+p7%#aW~Oe=+_>hAe1w$c z-M-~tnS#3nE&|d>?m`X_^Zxk0-}^~L38U=8k<-E|(0LBzI%;Mu0$|cgrPIWxaQ*%1 zxa!unn^}`3Z8Kq*RthnboXk}SrLJn^JG(45oV1Q-Q|TOnYQ{9X$}!Z9kW7L*9vxT$ zPpw+4MYHk;cxG9SsYh0t)Jh!8F%H4R0V1b4D79j!q+U&_6{ColQL$F45jFg%mU?Rd zGUXqIO{+QJ_nBr1z6e_sME`QbZKc|X)CnD-j_}e}Q3F+y?MP8KbfXHWlo$0x7xy^wK146O%2*T3c9O!h zNPUW6M~}CQK(Z(l)L{2pjq34(*O@0|ArZ+WAi#+o+7K$~%bDc$)9l;qysp^7pbM2=gCoB0

O_UPELA%_`omTMk*+cp8?OpktdjW`g*Vb=RODr zUQn7E^ZRam-Ft!#hAfvc*)O2oRq~d}^7kX!&)oP5X#}ewCB=c+4=)FLFg4s~=Ei%= zRAKhTn!Sk&!HoXpbES#Xcv~93P#QlMs0v8e^p$b%)R+9#@XW`3rO7E6Z3UV0XE9gB zZA;@M?43R3o&UUa=T2$zqBk+(jeK?Q?x6SaiP)2kpqx#OvFU3=Frq(rX@RUlh5zNn zvRpmH8p=|^>VoCZUYznKaEKh9xpiu0YG7ew?%jP?Z-~v(IRb1@?aUcw#??Aa%SyI` z8tI+MV@O1Y5fNG#Wy?b7wKk)1|Kl#m)@$_*`}4$z2oa;71t%pOsQinAi;adU@{dAl z0X~aS6Kt9P_APHl zMRQpYVjIzY0)?kAsaH~Turp1n7Nt2!iGEWXS%>Jd4lJ!2+^iZu#GGDfZuQgeO3`LX zbfH5ur)QMCE~C*Wae_vfNgTs@7kP*u!$t#Y1}aq)9feafp@>We8I}H{an!WPsn=2o znM;I_=@cgfS%kEWxu*$l`T4p@C`6hCBm9D}Pk=<2GFA7}zeEpmla?pz zR2&=hZ2_EtOH}yVinI-