当前位置: 首页 > article >正文

异步任务卡顿?Dify自定义节点不生效?深度拆解Event Loop与Celery集成失效根源,

第一章Dify自定义节点异步处理的核心挑战与现象定位在 Dify 低代码编排环境中当开发者通过自定义 Python 节点Custom LLM Node 或 Code Node引入耗时操作如外部 API 调用、文件 IO、模型推理时同步阻塞行为会直接导致工作流卡顿、超时中断及 UI 响应延迟。典型现象包括节点状态长时间停留在 “Running”、日志中出现TimeoutError: Task timed out after 30s、下游节点无法接收上游返回数据以及 WebSockets 连接频繁重连。常见异步失配场景在自定义节点中直接使用requests.get()等同步 HTTP 客户端阻塞事件循环未显式声明async def函数却尝试await异步对象Dify 后端基于 FastAPI 的异步运行时要求节点函数签名兼容async def但开发者误写为普通函数现象快速定位方法# 在自定义节点中插入诊断日志需确保日志输出可见 import asyncio import time async def main(inputs: dict) - dict: start time.time() # 模拟易出问题的同步调用应替换为 aiohttp import requests try: # ❌ 错误示范同步请求阻塞整个协程 resp requests.get(https://httpbin.org/delay/5, timeout10) duration time.time() - start return {status: success, duration_sec: round(duration, 2), data: resp.json()} except Exception as e: return {status: error, message: str(e)}关键约束对比表约束维度同步实现推荐异步实现HTTP 客户端requestsaiohttp或httpx.AsyncClient函数声明def main(...)async def main(...)等待方式time.sleep(1)await asyncio.sleep(1)第二章Event Loop机制深度解析与Dify运行时环境剖析2.1 Node.js与Python混合架构下的事件循环隔离原理在混合架构中Node.js 的单线程事件循环与 Python 的 GIL 及 asyncio 事件循环天然互斥必须通过进程级隔离实现协同。跨语言通信机制使用 Unix Domain Socket 或 gRPC 实现零拷贝 IPC事件序列化采用 Protocol Buffers 保证时序一致性事件循环桥接示例// Node.js 端向 Python 进程投递异步任务 const { spawn } require(child_process); const pyProc spawn(python3, [worker.py]); pyProc.stdin.write(JSON.stringify({ event: process_data, payload: [1,2,3] }) \n);该调用不阻塞主线程JSON 消息经 stdin 流式写入由 Python 子进程的 asyncio.StreamReader 异步解析避免事件循环嵌套。资源调度对比维度Node.jsPython默认调度器libuv 事件循环asyncio.EventLoopI/O 多路复用epoll/kqueueselect/epoll (Unix)2.2 Dify前端请求生命周期与后端Worker线程绑定关系实测请求绑定触发时机Dify 前端发起 /chat/completions 请求时网关依据 session_id 和 user_id 生成唯一 worker_key并路由至固定 Worker 实例const workerKey ${sessionId}_${userId.split(-)[0]}; fetch(/v1/chat/completions, { headers: { X-Worker-Key: workerKey } });该键值确保同一会话的全部流式响应由同一 Worker 处理避免上下文错乱。线程绑定验证结果通过并发压测100 session × 5 req/sec统计 Worker 分配分布Worker ID绑定会话数平均延迟(ms)w-0132217w-0235209w-0333224关键约束条件Worker 实例必须启用 sticky session基于 X-Worker-Key前端需在首次请求中携带 session_id后续请求复用同一键2.3 自定义节点中同步阻塞调用对主线程Event Loop的挤压效应验证阻塞调用复现场景function blockingSleep(ms) { const start Date.now(); while (Date.now() - start ms) {} // 同步忙等无yield } blockingSleep(200); // 阻塞主线程200ms该函数通过忙等待模拟CPU密集型同步操作完全占用JavaScript执行线程导致Event Loop无法轮询微任务队列与宏任务队列。事件调度延迟对比操作类型预期延迟实测延迟含阻塞setTimeout(cb, 0)~1ms200msPromise.resolve().then(cb)0.1ms200ms关键结论同步阻塞直接冻结Event Loop所有异步回调被强制延后执行自定义节点若未采用Worker或queueMicrotask隔离将破坏渲染帧率与响应性。2.4 使用Performance.now()与async_hooks追踪任务排队延迟的实战诊断核心原理协同Performance.now() 提供高精度时间戳微秒级而 async_hooks 可捕获异步资源的生命周期事件init、before、after、destroy。二者结合可精准定位任务在事件循环队列中的等待时长。关键代码实现const async_hooks require(async_hooks); const perfHooks require(perf_hooks); const queueStart new Map(); const hook async_hooks.createHook({ init(asyncId, type, triggerAsyncId) { if (type TIMERWRAP || type PROMISE) { queueStart.set(asyncId, perfHooks.performance.now()); } }, before(asyncId) { const start queueStart.get(asyncId); if (start) { console.log(Task queued for ${(perfHooks.performance.now() - start).toFixed(2)}ms); queueStart.delete(asyncId); } } }); hook.enable();该代码在异步资源初始化时记录入队时间在执行前计算排队延迟。TIMERWRAP 覆盖 setTimeout/setIntervalPROMISE 涵盖 Promise.then 队列任务。典型排队延迟场景对比场景平均排队延迟触发条件高负载下 Promise.then8.3msEvent loop backlog 50setTimeout(fn, 0)12.7msTimer queue overflow2.5 浏览器DevTools Network Node.js --inspect双端联动调试方法论核心联动机制通过 Chrome DevTools 的 Network 面板捕获前端请求同时启动 Node.js 服务时启用--inspect参数实现前后端请求链路与执行栈的双向映射。启动配置示例node --inspect0.0.0.0:9229 --inspect-brk app.js--inspect启用 V8 调试协议--inspect-brk在首行断点确保调试器连接后才执行端口9229需与 Chromechrome://inspect中配置一致。关键调试能力对比能力Network 面板Node.js --inspect请求溯源✅ 查看 Headers/Params/Timing❌ 不直接支持服务端断点❌ 仅展示响应结果✅ 支持源码级断点与变量监视第三章Celery集成失效的根因建模与关键断点验证3.1 Celery Worker启动模式与Dify API Server进程模型的资源竞争分析Celery Worker多进程启动典型配置# celery_app.py app Celery(dify_tasks) app.conf.worker_concurrency 4 # 并发Worker子进程数 app.conf.worker_prefetch_multiplier 1 # 每个进程预取1条任务 app.conf.broker_pool_limit None # 禁用连接池复用避免FD耗尽该配置下每个Worker进程独占Python解释器及内存空间与Dify API Server默认Gunicorn sync模式4 worker共享同一宿主机CPU与内存。当两者均启用多进程时总进程数达8易触发OOM Killer或CPU争抢。关键资源冲突维度对比资源类型Celery WorkerDify API Server文件描述符每进程≈20–50含Broker连接、日志句柄每Gunicorn worker≈15–30含HTTP连接、DB连接池内存占用≈120–180 MB/进程含模型加载缓存≈80–130 MB/进程含LLM上下文缓存3.2 任务序列化/反序列化过程中Pydantic v2与Celery 5.x兼容性陷阱复现核心冲突根源Celery 5.x 默认使用 pickle 序列化而 Pydantic v2 的 BaseModel 实例在 __getstate__ 中排除了私有字段如__pydantic_core_schema__导致反序列化时模型校验上下文丢失。复现代码片段from pydantic import BaseModel from celery import Celery class TaskPayload(BaseModel): user_id: int email: str app Celery(tasks, brokerredis://) app.task def process_user(payload: TaskPayload): return payload.dict() # 反序列化后 schema 已损坏调用 dict() 报 AttributeError该任务在 worker 端反序列化后payload虽仍为TaskPayload类型但内部_schema为空dict()触发PydanticUserError。兼容性对比表特性Pydantic v1Pydantic v2序列化支持原生支持__getstate__完整导出默认裁剪核心 schema 字段Celery 5.x 行为可安全 round-trip反序列化后模型不可用3.3 Broker连接池耗尽与Result Backend超时配置不匹配的压测验证压测现象复现在 2000 并发任务下Celery Worker 日志频繁出现ConnectionPoolTimeoutError与TimeoutError: Result not ready。关键配置对比组件默认超时s连接池大小Redis Broker-10broker_pool_limit10Redis Result Backend1.0result_expires3600但读取超时由redis_socket_timeout控制—修复后的连接池配置# celeryconfig.py broker_pool_limit 50 redis_socket_timeout 5.0 result_backend_transport_options { socket_timeout: 5.0, socket_connect_timeout: 5.0, retry_on_timeout: True }该配置使 Broker 连接池容量与 Result Backend 网络等待时间对齐避免因连接争抢导致任务元数据写入失败或结果读取提前中断。第四章高可靠异步节点工程化落地实践4.1 基于Celery Signals与Dify Task ID双向映射的状态同步方案数据同步机制通过 Celery 的task_prerun和task_success信号捕获任务生命周期事件并与 Dify 后端的异步任务 ID 建立实时双向映射。# 注册信号监听器 task_prerun.connect def on_task_prerun(sender, task_id, task, args, kwargs, **kw): dify_task_id kwargs.get(dify_task_id) if dify_task_id: redis.set(fdify:{dify_task_id}:celery, task_id, ex3600)该代码在任务执行前将 Dify 任务 ID 映射至 Celery task_id有效期 1 小时避免长期内存占用。状态回传流程前端轮询 Dify API 获取任务状态Dify 查询 Redis 获取对应 Celery task_id调用 Celery inspect 接口获取真实运行状态字段来源用途dify_task_idDify Web UI用户侧唯一标识celery_task_idCelery Broker执行层调度标识4.2 自定义节点中使用asyncio.to_thread()安全桥接阻塞IO的封装模式核心封装原则在自定义节点中需将阻塞型 IO如数据库查询、文件读写隔离至线程池执行避免阻塞事件循环。asyncio.to_thread() 是 Python 3.9 提供的轻量级桥接方案。典型封装结构async def safe_db_fetch(query: str) - list: # 在独立线程中执行阻塞调用 return await asyncio.to_thread( sqlite3.connect(app.db).execute, query )该调用将 sqlite3.execute() 安全移交至默认线程池返回 Awaitable[list]参数 query 被完整传递无隐式状态共享风险。关键安全约束被封装函数必须是纯阻塞、无协程依赖的同步函数禁止在线程内访问事件循环或 asyncio 原语如 asyncio.get_event_loop()4.3 Redis Stream作为轻量级任务队列替代Celery的可行性验证与性能对比核心能力对比Redis Stream 原生支持消息持久化、消费者组、ACK 语义与失败重投Celery 依赖 Broker如 RabbitMQ/Redis Worker 进程模型资源开销显著更高典型消费逻辑示例# 使用 redis-py 消费 Stream 任务 stream_key task:stream group_name worker-group consumer_name w1 redis.xgroup_create(stream_key, group_name, id0, mkstreamTrue) for msg in redis.xreadgroup(group_name, consumer_name, {stream_key: }, count1, block5000): stream, messages msg for msg_id, fields in messages: task json.loads(fields[bpayload]) try: process_task(task) redis.xack(stream_key, group_name, msg_id) # 手动确认 except Exception: pass # 可配置延迟重入或死信投递该代码展示了基于消费者组的可靠消费模式xreadgroup 实现负载均衡xack 显式控制消息生命周期block 参数避免轮询空耗相比 Celery 的自动序列化与中间件链此处逻辑更透明、可控性更强。吞吐量基准对比单节点1KB JSON 任务方案平均吞吐msg/s99% 延迟ms内存占用MBRedis Stream 自研消费者28,40012.642Celery Redis Broker9,70048.31864.4 Dify插件沙箱环境中启用uvlooptrio双运行时的异步加速实验运行时叠加原理Dify插件沙箱默认使用标准 asyncio 事件循环但可通过环境变量强制注入 uvloop 并桥接 trio 的 nurseries 机制实现 I/O 密集型任务的双重加速。关键配置代码import os os.environ[PYTHONASYNCIODEBUG] 0 os.environ[UVLOOP] 1 # 启用 uvloop 替换默认 loop import trio import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())该段代码在沙箱初始化阶段执行UVLOOP1 触发 Dify 插件加载器优先选择 uvloopset_event_loop_policy 确保 asyncio 子任务继承高性能循环trio 通过 trio.to_thread.run_sync() 安全调用 asyncio 兼容函数。性能对比1000次HTTP请求运行时组合平均延迟(ms)吞吐量(QPS)asyncio (default)12878uvloop trio63159第五章从卡顿到确定性响应——异步治理的终局思考响应延迟的根源不在并发量而在资源争用模式某金融风控服务在峰值期 P99 延迟突增至 1.2s排查发现并非 CPU 或网络瓶颈而是日志模块同步写入磁盘引发的 goroutine 阻塞。将log.Printf替换为带缓冲的异步日志通道后P99 下降至 47ms。结构化异步边界设计IO 操作数据库、HTTP 调用必须封装为显式异步任务禁止隐式阻塞调用状态变更与副作用分离状态更新走内存原子操作审计/通知等副作用投递至独立 worker 队列超时必须分层设置API 层 800ms下游服务调用层 300msDB 查询层 150msGo 中的确定性调度实践func processOrder(ctx context.Context, order Order) error { // 使用带 cancel 的子上下文约束单个环节 dbCtx, dbCancel : context.WithTimeout(ctx, 150*time.Millisecond) defer dbCancel() if err : db.Insert(dbCtx, order); err ! nil { return fmt.Errorf(db write failed: %w, err) // 不掩盖原始 timeout 错误 } // 后续异步触发风控校验非关键路径 go func() { _ riskCheckAsync(order.ID) }() return nil }异步链路可观测性基线指标采集方式告警阈值任务队列积压数Prometheus 自定义 exporter 500 条持续 2min异步任务 P95 执行时长OpenTelemetry trace span duration 2s失败重试不是兜底而是契约再协商当支付回调异步失败时系统不盲目重试而是依据幂等键查询最新状态若 30 秒内无变更则触发人工介入工单并向商户返回「处理中」状态页而非错误码。

相关文章:

异步任务卡顿?Dify自定义节点不生效?深度拆解Event Loop与Celery集成失效根源,

第一章:Dify自定义节点异步处理的核心挑战与现象定位在 Dify 低代码编排环境中,当开发者通过自定义 Python 节点(Custom LLM Node 或 Code Node)引入耗时操作(如外部 API 调用、文件 IO、模型推理)时&#…...

waifu2x:动漫图像超分辨率技术全解析

waifu2x:动漫图像超分辨率技术全解析 【免费下载链接】waifu2x Image Super-Resolution for Anime-Style Art 项目地址: https://gitcode.com/gh_mirrors/waifu/waifu2x 当数字艺术家小周尝试将300x300像素的角色草图放大到1200x1200像素时,传统软…...

Ubuntu 22.04开机卡在/dev/sda3?别慌!可能是磁盘空间不足惹的祸

Ubuntu 22.04开机卡在/dev/sda3?磁盘空间不足的排查与解决指南 当你满怀期待地按下Ubuntu 22.04的电源键,却看到系统卡在/dev/sda3: clean的提示画面时,那种焦虑感想必很多开发者都深有体会。作为一名长期使用Ubuntu进行嵌入式开发的工程师&a…...

Activiti7数据库表结构全解析:25张表的作用与关联关系详解

Activiti7数据库表结构全解析:25张表的作用与关联关系详解 在当今企业级应用开发中,工作流引擎已成为实现业务流程自动化的核心组件。作为一款轻量级、高性能的开源工作流引擎,Activiti7凭借其清晰的架构设计和高效的执行能力,在众…...

Go 结构体设计艺术:领域驱动建模与高内聚代码的映射实践

Go 结构体设计艺术:领域驱动建模与高内聚代码的映射实践 导读:结构体是 Go 语言数据建模的核心载体。如何从复杂的业务领域中抽象出清晰的结构体设计?本文基于领域驱动设计(DDD)思想,结合电商、支付、用户系统等真实场景,系统讲解 Go 结构体设计的核心原则、常见模式与反…...

VMware虚拟机安装openEuler 22.03 LTS SP3全流程指南(附镜像下载与网络配置)

VMware虚拟机安装openEuler 22.03 LTS SP3全流程指南(附镜像下载与网络配置) 在数字化转型浪潮中,企业级操作系统正面临从传统闭源向开源生态的转型。作为国产操作系统的代表之一,openEuler凭借其高性能、高安全性及完善的社区支持…...

Wan2.1 VAE部署成本优化:选择最佳GPU实例与按需启停策略

Wan2.1 VAE部署成本优化:选择最佳GPU实例与按需启停策略 1. 引言 最近和几个做AI应用开发的朋友聊天,大家不约而同地提到了同一个问题:模型部署的成本。尤其是像Wan2.1 VAE这种在图像生成、编辑中扮演关键角色的模型,虽然推理速…...

云容笔观·东方红颜影像生成系统结合LaTeX:自动化生成学术论文插图与封面

云容笔观东方红颜影像生成系统结合LaTeX:自动化生成学术论文插图与封面 每次写论文,最头疼的环节是什么?对我而言,除了反复修改的引言,就是制作那些示意图、流程图和封面了。找图库素材不匹配,自己用专业软…...

TMC9660芯片实战:如何用一块板子搞定BLDC电机闭环控制(附开发板调试心得)

TMC9660芯片实战:如何用一块板子搞定BLDC电机闭环控制(附开发板调试心得) 在电机控制领域,BLDC(无刷直流电机)因其高效率、长寿命和低噪音等优势,正逐步取代传统有刷电机。然而,实现…...

Qwen3-4B-Instruct参数详解:理解instruct微调机制与CPU推理时的batch_size权衡

Qwen3-4B-Instruct参数详解:理解instruct微调机制与CPU推理时的batch_size权衡 1. 引言:从“能回答”到“会思考”的模型进化 如果你用过早期的AI模型,可能会发现一个现象:你问它一个问题,它确实能给你一段文字&…...

ElastixAI 携 FPGA 方案打造新一代人工智能超级计算技术,打破神秘面纱

近年来,大模型训练几乎完全依赖 GPU,但随着生成式 AI 应用的爆发,一个新的问题逐渐显现:大模型推理(Inference)与 GPU 架构并不完全匹配。美国 AI 硬件初创公司 ElastixAI 提出了一种不同思路:利…...

PID调参避坑指南:从电机抖动到平稳控制的5个关键步骤

PID调参避坑指南:从电机抖动到平稳控制的5个关键步骤 在机器人竞赛和智能车开发中,电机控制是决定系统性能的核心环节。许多开发者都经历过这样的场景:当电机开始高速运转时,系统突然出现剧烈抖动,编码器读数像过山车一…...

不用Chrome插件了!教你用浏览器书签实现Postman常用功能(含CORS解决方案)

浏览器书签变身API测试神器:零插件实现Postman核心功能 每次调试API都要打开Postman?临时测试接口却不想安装插件?其实你的浏览器书签就能变身轻量级API测试工具。本文将带你用几行JavaScript代码打造一个无需安装、跨设备同步的书签版Postma…...

2024 AI-Playground:本地部署Intel Arc GPU加速的AI创作平台全指南

2024 AI-Playground:本地部署Intel Arc GPU加速的AI创作平台全指南 【免费下载链接】AI-Playground AI PC starter app for doing AI image creation, image stylizing, and chatbot on a PC powered by an Intel Arc™ GPU. 项目地址: https://gitcode.com/gh_mi…...

避坑指南:二自由度机械臂动力学仿真中SolidWorks误差问题解析

二自由度机械臂动力学仿真误差分析与高精度建模实践 在机电一体化项目的开发流程中,机械臂动力学仿真是验证控制算法有效性的关键环节。许多工程师习惯使用SolidWorks等CAD软件内置的仿真模块进行初步验证,却常常在后期控制算法实现时发现仿真结果与实物…...

AHK脚本实战:5分钟搞定QQ音乐免费歌曲下载(附完整代码)

AHK脚本实战:高效获取QQ音乐资源的自动化方案 每次听到喜欢的歌曲却苦于无法离线保存?作为AHK脚本的深度用户,我发现了一个既简单又高效的解决方案——无需安装第三方软件,仅用几行代码就能实现QQ音乐资源的自动化获取。这个方法特…...

告别SQL与文档!通义灵码2.5的MCP生态如何让数据库开发效率飙升300%

1. 从SQL苦手到数据库自由:通义灵码2.5的MCP革命 记得三年前我刚接手一个电商项目时,为了写一个包含五表联查的订单统计SQL,整整折腾了一下午——反复查阅MySQL文档、调试JOIN语句、优化索引,最后还因为漏了个外键约束导致生产环境…...

上位机软件开发实战:从数据采集到可视化全流程解析

1. 上位机开发基础入门 第一次接触上位机开发时,我也被各种专业术语绕得头晕。简单来说,上位机就像工厂里的总控室,而下位机就是车间里的机器设备。上位机软件主要负责三件事:收集设备数据、处理分析数据、展示数据给人看。 常见的…...

PasteMD企业应用:集成至内部Wiki系统,实现员工随手粘贴→自动归档Markdown

PasteMD企业应用:集成至内部Wiki系统,实现员工随手粘贴→自动归档Markdown 1. 引言:从个人工具到企业级知识管理 想象一下这个场景:一位产品经理刚开完一场需求评审会,会议记录散乱地记在记事本里,有要点…...

Matlab数据降维实战:drtoolbox从安装到避坑全指南

Matlab数据降维实战:drtoolbox从安装到避坑全指南 如果你正在Matlab的海洋里探索高维数据的奥秘,那么“降维”这个词对你来说一定不陌生。面对动辄成百上千维的特征,无论是可视化还是后续的机器学习建模,都像是一场噩梦。这时候&a…...

无需编码!用EagleEye镜像快速搭建商品识别、瑕疵检测系统

无需编码!用EagleEye镜像快速搭建商品识别、瑕疵检测系统 在零售、制造和物流行业中,商品识别与瑕疵检测是提升效率的关键环节。传统方案往往需要专业团队开发定制化系统,投入大量时间和资源。今天要介绍的EagleEye镜像,基于DAMO…...

3大维度提升Godot开发效率的游戏开发效率工具

3大维度提升Godot开发效率的游戏开发效率工具 【免费下载链接】godot-game-template Generic template for Godot games 项目地址: https://gitcode.com/gh_mirrors/go/godot-game-template 🌟价值定位:Godot开发者的效率倍增器 对于Godot引擎开…...

Flux.1-Dev深海幻境快速上手:10分钟完成从镜像部署到第一张图生成

Flux.1-Dev深海幻境快速上手:10分钟完成从镜像部署到第一张图生成 你是不是也刷到过那些由AI生成的、充满想象力的奇幻图片?比如深海中的发光水母城堡,或者悬浮在星空中的机械岛屿。以前总觉得生成这样的图片需要复杂的代码和漫长的等待&…...

时序RNN vs LSTM vs GRU:如何为你的时序数据选择最佳模型?

时序RNN vs LSTM vs GRU:如何为你的时序数据选择最佳模型? 在金融预测、工业设备监控或自然语言处理中,我们常面临一个关键抉择:面对不断涌入的时序数据流,究竟该选择哪种循环神经网络架构?传统时序RNN、LS…...

FastAPI + Nginx实战:如何让Qwen-Image生成的图片直接返回可访问URL(附完整配置)

FastAPI Nginx实战:构建高可用图像生成API服务 在当今AI技术快速发展的背景下,图像生成API已成为许多应用的核心组件。不同于传统的直接返回base64编码或二进制流的方式,直接返回可访问的URL能显著提升用户体验和系统性能。本文将深入探讨如…...

F28034 DSP实战:EPWM模块配置全解析(附寄存器操作指南)

F28034 DSP实战:EPWM模块寄存器级配置与工业应用技巧 在电机控制、数字电源和工业自动化领域,精确的PWM波形生成是核心需求。TI的F28034 DSP凭借其增强型PWM(EPWM)模块,为工程师提供了灵活的波形控制能力。本文将深入剖…...

STM32+VScode开发环境搭建全攻略:从零配置到智能提示优化

STM32VScode开发环境搭建全攻略:从零配置到智能提示优化 在嵌入式开发领域,STM32凭借其丰富的产品线和稳定的性能成为众多工程师的首选。而VScode作为轻量级代码编辑器,凭借强大的扩展性和智能提示功能,正在逐步取代传统IDE成为开…...

Phi-3 Forest Laboratory 环境配置避坑指南:从Anaconda到模型服务

Phi-3 Forest Laboratory 环境配置避坑指南:从Anaconda到模型服务 你是不是也遇到过这种情况:好不容易找到一个心仪的AI模型,比如微软新出的Phi-3,兴致勃勃地准备跑起来试试,结果第一步环境配置就卡住了。Python版本不…...

ASMR字幕制作智能解决方案:GalTransl-for-ASMR全攻略

ASMR字幕制作智能解决方案:GalTransl-for-ASMR全攻略 【免费下载链接】GalTransl-for-ASMR Automated translation solution for visual novels supporting GPT-3.5/GPT-4/Newbing/Sakura. 支持GPT-3.5/GPT-4/Newbing/Sakura等大语言模型的Galgame自动化翻译解决方案…...

3个步骤彻底移除Windows AI功能:保护隐私与优化系统的完整指南

3个步骤彻底移除Windows AI功能:保护隐私与优化系统的完整指南 【免费下载链接】RemoveWindowsAI Force Remove Copilot and Recall in Windows 项目地址: https://gitcode.com/GitHub_Trending/re/RemoveWindowsAI 在数字化办公环境中,Windows系…...