🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度
如果你最近关注 GitHub 趋势榜,可能会发现一个有趣的现象:过去一周,一个名为OpenMontage的项目冲上了榜首,紧随其后的是一批与AI 工作流、Agent相关的工具。这仅仅是又一个“AI 玩具”的昙花一现,还是背后隐藏着开发者工具生态的一次重要转向?
很多开发者习惯于将 GitHub 趋势榜视为“技术风向标”,但往往只停留在“收藏-吃灰”的循环。这次榜单的变化,其核心信号并非某个单一工具的爆火,而是一个更明确的趋势:AI 驱动的自动化工作流,正在从“概念演示”阶段,快速进入“工程化可用”阶段。OpenMontage 登顶,恰恰因为它是一个标志性的工程化案例——它试图用一套开源、可复现的 Agent 工作流,解决一个非常具体且高成本的创作问题:视频制作。
这意味着,对于广大开发者而言,关注的焦点应该从“哪个 AI 模型更酷”,转向“如何将这些 AI 能力像乐高积木一样,通过工作流串联起来,解决实际业务问题”。本文将为你深度解读这期趋势榜背后的技术逻辑,并以 OpenMontage 为例,拆解一个开源 AI 工作流项目的核心架构、部署方式与实践价值。你将不仅了解它是什么,更能掌握如何评估、测试乃至借鉴其设计思路,用于你自己的项目中。
1. 趋势榜背后的信号:为什么是“工作流”和“Agent”?
在分析具体项目之前,我们需要先理解这次 GitHub 趋势榜关键词(AI, OpenMontage, 工作流, Agent)背后的共性。它们共同指向了当前 AI 应用落地的核心瓶颈与破局点。
传统 AI 应用的“孤岛”困境:过去,我们使用 AI 能力的方式往往是点状的。例如:
- 调用一个文生图 API 生成图片。
- 调用一个大模型 API 进行对话或总结。
- 使用一个代码补全插件。
每个工具都很强大,但它们彼此独立。如果你想做一个“根据文案自动生成短视频”的功能,就需要自己写代码串联图片生成、语音合成、视频剪辑、背景音乐等多个服务。这个过程涉及多 API 调用、状态管理、错误处理、成本控制,复杂度极高,本质上是在重复造轮子。
工作流(Workflow)与智能体(Agent)的范式融合:“工作流”提供了自动化的流程编排能力,而“Agent”赋予了每个节点感知、决策和执行的能力。二者的结合,产生了“智能体工作流”(Agentic Workflow)。这带来的根本性变化是:
- 任务拆解自动化:用户只需给出一个高层目标(如“制作一个介绍 OpenMontage 的科普视频”),智能体可以自动将其拆解为脚本撰写、素材检索、分镜生成、视频合成、字幕添加等子任务。
- 上下文感知与传递:工作流中的每个步骤都能共享上下文。例如,视频脚本生成后,下一个负责分镜的智能体能理解脚本内容,并据此寻找匹配的视觉素材。
- 异常处理与回退:当某个步骤失败(如未找到合适素材),智能体可以触发备用方案(如调用文生图模型即时生成),保障流程最终完成。
因此,趋势榜上n8n、Dify、Coze(扣子)等工作流平台受到关注,正是因为它们降低了构建这类“智能体工作流”的门槛。而OpenMontage作为一个垂直领域的完整实现,则展示了这种范式能产生的具体价值,从而获得了大量 star。
2. OpenMontage 项目深度解析:它到底解决了什么?
根据其 GitHub 仓库描述,OpenMontage 自称是“世界首个开源智能体视频生产系统”。我们抛开宣传词汇,从开发者视角看它的核心价值主张:
核心问题:高质量短视频制作成本高、周期长,需要文案、美术、剪辑等多方协作。对于中小型内容团队、独立开发者或教育工作者,这是一道难以逾越的门槛。
OpenMontage 的解决方案:构建一个由多个 AI Agent 协同工作的自动化流水线,输入一个主题或脚本,输出一个结构完整的动态视频。
其官网或 README 中强调的一个关键区别是:既能处理静态图片序列,也能生成真正的动态视频内容。这意味着它的工作流中可能集成了动态素材检索、基础动画合成甚至简单的动态生成能力。
2.1 核心架构猜想与技术栈分析
虽然未提供完整代码,但基于其描述“Agent 从免费的素材库和开放档案库中构建语料库,检索...”,我们可以推断其架构可能包含以下组件:
- 编排层(Orchestrator):可能是基于
LangChain、LlamaIndex或自研的 Python 框架,负责定义工作流 DAG(有向无环图),调度各个 Agent。 - 智能体层(Agents):
- 脚本生成 Agent:基于大语言模型(如 GPT-4、Claude 或开源 Llama 系列),将主题扩展为详细视频脚本,包含场景描述、旁白文案。
- 素材检索 Agent:连接
Pexels、Unsplash等免费图库 API,或互联网公开档案库,根据脚本描述检索匹配的图片/视频片段。也可能集成CLIP等模型进行向量化检索。 - 视觉合成 Agent:可能使用
FFmpeg进行视频剪辑、转场、缩放,使用Stable Diffusion或DALL-EAPI 生成缺失素材,使用OpenCV进行基础图像处理。 - 音频处理 Agent:集成 TTS(文本转语音)服务生成旁白,从免费音效库检索背景音乐,并进行混音、对齐。
- 字幕生成 Agent:利用语音识别(ASR)生成字幕文件,或直接根据脚本生成,并叠加到视频中。
- 知识库与记忆:为保持视频内容一致性,可能需要一个向量数据库(如
ChromaDB、Weaviate)来存储和管理检索到的素材元数据、脚本片段等上下文信息。
2.2 与同类工具的对比
| 特性/项目 | OpenMontage | Runway/Gen-2 | Pictory / InVideo | 传统工作流(手动) |
|---|---|---|---|---|
| 核心模式 | 多 Agent 自动化工作流 | 端到端生成模型 | 模板化编辑+AI辅助 | 全手动工具链 |
| 控制粒度 | 高(可定义工作流逻辑) | 低(提示词驱动) | 中(基于模板修改) | 最高(完全手动) |
| 技术门槛 | 高(需部署、理解架构) | 低(Web 应用) | 低(Web 应用) | 高(专业软件技能) |
| 成本 | 开源,主要成本为计算/API | 订阅制,按量付费 | 订阅制 | 人力与软件授权成本 |
| 灵活性 | 极高(可定制、可扩展) | 有限(受模型能力限制) | 有限(受模板限制) | 无限(但效率低) |
| 输出确定性 | 中(依赖检索结果和编排) | 低(生成结果随机) | 中高(模板化) | 高(完全可控) |
结论:OpenMontage 的目标用户并非追求“一键大片”的普通用户,而是希望将视频制作能力以代码形式集成到自己产品中,或进行二次开发的开发者、技术型内容团队。它的价值在于提供了一个可研究、可修改、可集成的开源参考实现。
3. 环境准备与快速体验
由于 OpenMontage 是一个相对复杂的系统,完整的本地部署可能涉及多个服务。这里我们基于其项目理念,搭建一个简化的概念验证环境,帮助你理解其核心工作流。我们将使用 Python 和一些常见的开源库来模拟一个“图文生成短视频”的迷你版流程。
3.1 基础环境要求
- 操作系统:Linux (Ubuntu 20.04+), macOS 或 WSL2 (Windows)。
- Python:版本 3.9 或 3.10。
- 包管理:
pip或conda。 - 关键工具:
FFmpeg(视频处理必备)。 - API 密钥:你需要准备以下至少一项(用于模拟不同 Agent):
- OpenAI API Key 或 其他兼容 OpenAI 的 LLM API。
- Unsplash / Pexels 的访问密钥(用于素材检索)。
- (可选)Hugging Face Token,用于使用开源模型。
3.2 安装核心依赖
创建一个新的 Python 虚拟环境并安装基础包。
# 创建并激活虚拟环境 python -m venv openmontage_demo source openmontage_demo/bin/activate # Linux/macOS # 对于 Windows: openmontage_demo\Scripts\activate # 升级 pip pip install --upgrade pip # 安装核心依赖 pip install openai # 用于 LLM 调用(脚本生成) pip install requests # 用于 HTTP 请求(素材下载) pip install pillow # 用于图像处理 pip install moviepy # 用于视频合成(封装了FFmpeg) pip install langchain # 用于 Agent 和工作流编排(简化版) pip install chromadb # 用于向量存储(素材记忆) # 确保系统已安装 FFmpeg # Ubuntu/Debian: sudo apt-get install ffmpeg # macOS: brew install ffmpeg # Windows: 下载并添加至 PATH4. 核心流程拆解与代码实现
我们将实现一个极度简化的流程:输入一个主题 -> 生成脚本 -> 根据脚本关键词检索图片 -> 合成视频并添加字幕。
4.1 步骤一:脚本生成 Agent
这个 Agent 负责将简短主题扩展为包含场景和旁白的视频脚本。
# script_agent.py import openai import json import os class ScriptAgent: def __init__(self, api_key, model="gpt-3.5-turbo"): openai.api_key = api_key self.model = model def generate_script(self, topic, duration_sec=30): """根据主题生成视频脚本""" prompt = f""" 你是一个专业的短视频脚本作家。请为一个时长约{duration_sec}秒的科普短视频撰写脚本。 主题是:{topic} 请以 JSON 格式返回,包含以下字段: - "title": 视频标题 - "scenes": 一个列表,每个元素是一个场景,包含: "scene_number": 场景序号, "description": 场景视觉描述(用于找图), "narration": 该场景的旁白文案, "duration_seconds": 该场景预估时长 确保总时长接近{duration_sec}秒。 """ try: response = openai.ChatCompletion.create( model=self.model, messages=[{"role": "user", "content": prompt}], temperature=0.7, ) content = response.choices[0].message.content # 提取 JSON 部分(LLM 可能在回答中包裹其他文本) start = content.find('{') end = content.rfind('}') + 1 if start != -1 and end != 0: script_json = json.loads(content[start:end]) return script_json else: raise ValueError("未能从响应中解析出 JSON") except Exception as e: print(f"脚本生成失败: {e}") # 返回一个兜底的脚本 return { "title": f"关于{topic}的介绍", "scenes": [ { "scene_number": 1, "description": f"{topic} 的宏观概念或象征性图片", "narration": f"今天,我们来聊聊{topic}。", "duration_seconds": 5 }, { "scene_number": 2, "description": f"{topic} 的核心原理或应用场景示意图", "narration": "它背后的原理其实很有趣。", "duration_seconds": 15 }, { "scene_number": 3, "description": f"展望未来与{topic}相关的画面", "narration": "未来,它可能会改变我们的生活方式。", "duration_seconds": 10 } ] } if __name__ == "__main__": # 使用前请设置你的 OPENAI_API_KEY 环境变量 agent = ScriptAgent(api_key=os.getenv("OPENAI_API_KEY")) script = agent.generate_script("人工智能工作流") print(json.dumps(script, indent=2, ensure_ascii=False))4.2 步骤二:素材检索 Agent
这个 Agent 根据场景描述,从免费图库搜索并下载相关图片。这里以 Pexels API 为例。
# material_agent.py import requests import os from PIL import Image import io class MaterialAgent: def __init__(self, pexels_api_key): self.pexels_api_key = pexels_api_key self.headers = {"Authorization": pexels_api_key} self.download_dir = "downloaded_images" os.makedirs(self.download_dir, exist_ok=True) def search_and_download(self, query, per_page=1): """搜索并下载一张图片""" url = f"https://api.pexels.com/v1/search?query={query}&per_page={per_page}" response = requests.get(url, headers=self.headers) if response.status_code == 200: data = response.json() if data['photos']: photo = data['photos'][0] img_url = photo['src']['large'] # 使用大尺寸图片 # 下载图片 img_data = requests.get(img_url).content # 生成文件名 safe_query = "".join(c for c in query if c.isalnum() or c in (' ', '_')).rstrip() filename = f"{safe_query}_{photo['id']}.jpg" filepath = os.path.join(self.download_dir, filename) with open(filepath, 'wb') as f: f.write(img_data) print(f"已下载: {filepath}") return filepath else: print(f"未找到关于 '{query}' 的图片") return None else: print(f"Pexels API 请求失败: {response.status_code}") return None def get_scene_images(self, script_scenes): """为脚本中的每个场景获取图片""" image_paths = [] for scene in script_scenes: desc = scene['description'] print(f"正在为场景 {scene['scene_number']} 搜索图片: {desc}") img_path = self.search_and_download(desc) if img_path: image_paths.append(img_path) else: # 如果没找到,使用一个默认的占位图 default_path = self._create_placeholder_image(desc, scene['scene_number']) image_paths.append(default_path) return image_paths def _create_placeholder_image(self, text, scene_num): """创建一个简单的文字占位图""" from PIL import Image, ImageDraw, ImageFont img = Image.new('RGB', (1280, 720), color=(73, 109, 137)) d = ImageDraw.Draw(img) # 尝试加载字体,如果失败则使用默认字体 try: font = ImageFont.truetype("arial.ttf", 40) except IOError: font = ImageFont.load_default() d.text((100, 300), f"Scene {scene_num}: {text}", fill=(255, 255, 255), font=font) filepath = os.path.join(self.download_dir, f"placeholder_scene_{scene_num}.jpg") img.save(filepath) print(f"已创建占位图: {filepath}") return filepath # 注意:使用 Pexels API 需要先注册并获取 API Key: https://www.pexels.com/api/4.3 步骤三:视频合成 Agent
这个 Agent 使用 MoviePy 将图片、音频合成为视频,并添加字幕。
# video_agent.py from moviepy.editor import * import os class VideoAgent: def __init__(self, output_dir="output"): self.output_dir = output_dir os.makedirs(self.output_dir, exist_ok=True) def create_video(self, script, image_paths, narration_audio_paths=None): """ 根据脚本和图片路径创建视频 script: 脚本字典 image_paths: 按场景顺序排列的图片路径列表 narration_audio_paths: 按场景顺序排列的旁白音频路径列表(可选) """ clips = [] total_duration = 0 for i, (scene, img_path) in enumerate(zip(script['scenes'], image_paths)): scene_duration = scene['duration_seconds'] # 创建图片剪辑 img_clip = ImageClip(img_path).set_duration(scene_duration).resize(height=720) # 统一高度为720p # 如果图片宽度不足1280,则居中放置 if img_clip.w < 1280: img_clip = img_clip.on_color(size=(1280, 720), color=(0,0,0), col_opacity=1) # 添加字幕文本 txt_clip = TextClip(scene['narration'], fontsize=28, color='white', font='Arial', size=(1200, 100), method='caption') txt_clip = txt_clip.set_position(('center', 'bottom')).set_duration(scene_duration).set_start(0) # 组合图片和文字 scene_clip = CompositeVideoClip([img_clip, txt_clip]) clips.append(scene_clip) total_duration += scene_duration # 拼接所有场景 final_clip = concatenate_videoclips(clips, method="compose") # 如果有旁白音频,进行混音(这里简化处理,假设已生成音频文件) # 实际项目中,需要调用 TTS 服务生成 narration_audio_paths # if narration_audio_paths: # audio_clips = [AudioFileClip(path) for path in narration_audio_paths] # final_audio = concatenate_audioclips(audio_clips) # final_clip = final_clip.set_audio(final_audio) # 输出文件 output_path = os.path.join(self.output_dir, f"{script['title'].replace(' ', '_')}.mp4") final_clip.write_videofile(output_path, fps=24, codec='libx264', audio_codec='aac') print(f"视频已生成: {output_path}") return output_path if __name__ == "__main__": # 示例用法 agent = VideoAgent() # 这里需要传入真实的 script 和 image_paths # agent.create_video(script, image_paths)5. 工作流编排与主程序
现在,我们将上述 Agent 串联起来,形成一个完整的工作流。
# main_workflow.py import os import json from script_agent import ScriptAgent from material_agent import MaterialAgent from video_agent import VideoAgent def main(): # 1. 初始化配置 OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") PEXELS_API_KEY = os.getenv("PEXELS_API_KEY") # 或在代码中直接替换 if not OPENAI_API_KEY: print("错误:请设置 OPENAI_API_KEY 环境变量") return topic = "GitHub AI 趋势与工作流工具" print(f"开始生成视频,主题: {topic}") # 2. 初始化各个 Agent script_agent = ScriptAgent(api_key=OPENAI_API_KEY) material_agent = MaterialAgent(pexels_api_key=PEXELS_API_KEY) # 如果没有Pexels key,会使用占位图 video_agent = VideoAgent() # 3. 执行工作流 print("步骤1: 生成视频脚本...") script = script_agent.generate_script(topic, duration_sec=30) print(f"脚本生成成功,标题: {script['title']}") print(json.dumps(script, indent=2, ensure_ascii=False)) print("\n步骤2: 检索并下载场景图片...") image_paths = material_agent.get_scene_images(script['scenes']) print(f"共获取 {len(image_paths)} 张图片") print("\n步骤3: 合成最终视频...") # 注意:此处跳过了 TTS 生成旁白音频的步骤,仅使用字幕 final_video_path = video_agent.create_video(script, image_paths) print(f"\n🎉 视频制作完成!文件保存在: {final_video_path}") if __name__ == "__main__": main()6. 运行与效果验证
设置环境变量(在终端中执行):
export OPENAI_API_KEY='你的OpenAI API Key' export PEXELS_API_KEY='你的Pexels API Key' # 可选,没有则用占位图运行主程序:
python main_workflow.py预期输出与验证:
- 程序会依次打印:“生成视频脚本”、“检索并下载场景图片”、“合成最终视频”。
- 在
downloaded_images/文件夹下可以看到下载或生成的图片。 - 在
output/文件夹下会生成一个以脚本标题命名的.mp4文件。 - 用视频播放器打开该文件,你应该能看到一个由几张图片依次播放、底部带有字幕的简易视频。
成功标准:程序无报错运行完毕,并生成一个可播放的视频文件。这证明我们模拟的“智能体工作流”管道是通的。
7. 常见问题与排查思路
在实际部署和运行此类复杂工作流时,你会遇到比示例更多的问题。以下是一个排查清单:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 脚本生成失败 | 1. API Key 无效或未设置。 2. 网络问题导致请求超时。 3. 模型返回内容格式不符合预期。 | 1. 检查环境变量echo $OPENAI_API_KEY。2. 使用 curl测试 API 连通性。3. 打印 LLM 的原始响应,检查 JSON 解析错误。 | 1. 重新设置正确的 API Key。 2. 配置网络代理或重试。 3. 在代码中添加更健壮的 JSON 提取和错误处理逻辑。 |
| 图片下载失败 | 1. Pexels API 密钥无效或配额用尽。 2. 查询词太抽象,无匹配结果。 3. 网络或权限问题。 | 1. 检查 Pexels 账户的 API 使用情况。 2. 在 Pexels 网站手动搜索该关键词验证。 3. 查看 requests库返回的状态码和错误信息。 | 1. 更换 API Key 或使用备用图库(如 Unsplash)。 2. 优化查询词,或让 LLM 生成更具体的图片描述。 3. 实现重试机制和备用占位图方案(如示例所示)。 |
| 视频合成报错 | 1.FFmpeg未安装或不在系统 PATH。2. 图片尺寸不一致或格式 MoviePy 不支持。 3. 内存不足处理大文件。 | 1. 在终端运行ffmpeg -version检查。2. 检查图片路径列表,用 PIL 打开验证。 3. 观察合成时的系统资源监控。 | 1. 正确安装 FFmpeg 并配置环境变量。 2. 在素材检索后增加图片预处理步骤(统一尺寸、格式转换)。 3. 降低输出视频分辨率或码率,或分批次处理。 |
| 工作流卡住或顺序错误 | 1. 某个 Agent 任务耗时过长或阻塞。 2. 异步任务未正确处理。 3. 依赖关系未正确定义。 | 1. 在每个 Agent 步骤添加超时和日志。 2. 检查代码逻辑,确保前一步输出是下一步的正确输入。 | 1. 引入任务队列(如 Celery)和超时机制。 2. 使用 asyncio或concurrent.futures处理可并行的任务。3. 使用工作流引擎(如 Apache Airflow, Prefect)明确定义 DAG。 |
| 最终视频质量差 | 1. 素材与文案不匹配。 2. 转场生硬,字幕样式不佳。 3. 没有背景音乐和旁白。 | 1. 人工审核生成的脚本和检索到的素材。 2. 对比专业视频工具的输出。 | 1. 改进检索 Agent,使用多模态模型(如 CLIP)进行图文匹配度打分。 2. 使用更专业的视频编辑库,或引入模板引擎。 3. 集成 TTS 和 BGM 检索 Agent,完善音频流水线。 |
8. 从 Demo 到生产:最佳实践与工程化建议
我们的简化版 Demo 仅展示了核心概念。要将 OpenMontage 这类系统用于生产或构建自己的智能体工作流,你需要考虑以下工程化问题:
状态管理与持久化:
- 挑战:工作流可能很长,需要断点续跑。每个 Agent 的输入输出需要保存。
- 建议:使用数据库(如 PostgreSQL)记录工作流实例、任务状态和中间产物。为每个任务生成唯一的
execution_id。
错误处理与重试:
- 挑战:外部 API 调用不稳定,网络可能中断。
- 建议:为每个对外部服务的调用实现指数退避重试机制。设置全局超时和单个任务超时。实现“熔断器”模式,防止单一服务故障拖垮整个工作流。
可观测性与监控:
- 挑战:工作流内部状态黑盒,出问题难排查。
- 建议:在每个关键步骤注入详细日志(结构化日志如 JSON)。记录每个任务的开始时间、结束时间、输入参数、输出结果和错误信息。集成监控系统(如 Prometheus + Grafana)跟踪关键指标(任务成功率、耗时、API 调用次数)。
模块化与可扩展性:
- 挑战:需要频繁更换或升级某个 Agent(如从 GPT-3.5 升级到 GPT-4)。
- 建议:定义清晰的 Agent 接口。使用依赖注入或配置文件来管理 Agent 的实现类。考虑采用微服务架构,将每个 Agent 部署为独立服务,通过消息队列(如 RabbitMQ, Kafka)通信。
成本与资源优化:
- 挑战:LLM API 调用和图像生成/处理成本可能很高。
- 建议:实现缓存层,对相同的输入复用输出结果。对非关键任务使用更便宜的小模型或开源模型。对图片、视频等大文件使用对象存储(如 S3, MinIO),并在工作流中传递引用而非文件本身。
安全性:
- 挑战:用户输入可能包含恶意指令,工作流可能访问外部不可信资源。
- 建议:对用户输入进行严格的清洗和过滤。为工作流设置沙箱环境,限制其网络访问和文件系统权限。对所有外部 API 的密钥进行加密存储和轮换。
9. 总结:趋势下的开发者行动指南
回到开篇的问题,GitHub 趋势榜上 OpenMontage 和工作流工具的崛起,给开发者传递的明确信号是:AI 应用的竞争,正在从模型能力的竞争,转向工作流编排和工程化落地的竞争。
对于不同角色的开发者,行动建议如下:
- 对于前端/全栈开发者:不必深究所有 AI 模型的原理,但需要学习如何通过 API 或 SDK 调用这些能力。重点关注像Dify、Coze这样的低代码工作流平台,它们能让你快速将 AI 能力组合成应用。理解 Agent 的基本概念和工作流设计模式。
- 对于后端/架构开发者:你的核心价值在于构建稳定、可扩展、可观测的智能体工作流基础设施。研究LangChain、LlamaIndex等框架的源码,学习任务调度、状态管理、错误处理的最佳实践。考虑如何将现有的微服务与 AI 能力结合。
- 对于 AI 工程师/研究者:你的战场从“炼模型”部分转移到了“用模型”和“连接模型”。深入研究智能体(Agent)的规划、工具使用、反思等机制。尝试复现 OpenMontage 这类项目,思考如何优化其中每个环节的 Agent(如更好的检索、更精准的生成)。
- 对于所有技术决策者:在技术选型时,评估一个 AI 项目不应只看它用了什么“SOTA”模型,更要看它的工作流设计是否清晰、是否易于维护和扩展、是否具备良好的错误处理和数据流转机制。OpenMontage 提供了一个优秀的参考架构。
最终,掌握“智能体工作流”的思维和技能,意味着你能将分散的 AI 能力整合成解决复杂问题的自动化系统。这不仅是跟上趋势,更是构建下一代智能应用的核心竞争力。建议你将本文的简化 Demo 作为起点,选择一个你业务中的具体痛点(不一定是视频,可以是内容审核、数据分析、客服对话等),尝试设计并实现一个属于你自己的智能体工作流。
🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度