个人主页-爱因斯晨
大家好呀!最近有没有想我?博主努力回三中哦!
最近学习人工智能时遇到一个好用的网站分享给大家:
人工智能学习
近日,Coze
开源引起科技圈激烈讨论。Coze
开源是AI领域的重要举措,既通过Apache 2.0
协议降低了智能体开发门槛,让开发者可自由部署、二次开发及商用,推动技术普惠与行业标准化,又能借助开源社区构建开发者生态,助力字节跳动推广豆包大模型和云服务,重塑行业竞争格局;但同时也面临功能生态短板(如缺失部分高级功能、插件较少)、可持续性风险(算力需求与变现压力)及安全治理挑战(漏洞风险与劣质应用泛滥)等问题,是一把兼具机遇与挑战的“双刃剑”。
一、初识Coze
1.价值定位
扣子空间是新一代AI Agent开发平台。凭借”低代码“功能,使开发门槛降低。开发的AI智能体,可以通过API或SDK将 AI 应用集成到你的业务系统中。提高了编码效率。
2.核心功能
一、智能体(Bot)构建核心功能
这是 Coze
的基础且核心能力,支持零代码或低代码搭建专属 AI 智能体。
- 人设与回复逻辑定义:
可通过自然语言设定 Bot 的身份(如 “历史科普博主”“电商客服”)、性格(如 “活泼亲切”“严谨专业”)、知识范围及回复风格;还能配置触发规则(如特定关键词触发预设回复、用户提问类型匹配对应处理流程)。 - 多模态能力集成:
支持文本、图像、语音等多模态交互。例如,可接入图像生成插件(如 Stable Diffusion)让 Bot 根据文字描述生成图片;或接入语音转文字工具,实现语音提问的实时处理。 - 工具与插件调用:
内置丰富的官方工具(如 “网页搜索”“计算器”“代码解释器”),也支持接入第三方 API 或自定义插件(如企业内部数据接口、特定业务工具)。比如,搭建 “旅行规划 Bot” 时,可调用 “航班查询插件”“酒店预订 API”,实现实时信息获取与操作。
二、工作流(Workflow)自动化功能
即前文提到的 “工作流”,用于将复杂任务拆解为自动化流程,是提升 Bot 效率的关键工具(详细功能可结合前文,此处侧重 “操作与场景”)。
-
可视化流程编排:
通过拖拽节点(如 “LLM 调用”“条件判断”“数据处理”“插件执行”)在画布上搭建流程,无需代码即可实现 “多步骤任务自动化”。例如,“沉浸式历史故事短视频生成工作流” 可拆解为:
- “用户输入历史主题”→2. “LLM 节点生成故事脚本”→3. “图像生成节点根据脚本关键词生成场景图”→4. “视频合成插件拼接图文与配音”→5. “输出最终视频”。
-
灵活的节点与逻辑控制:
支持 “条件分支”(如 “若用户需求是‘简单介绍’则调用轻量模型,若为‘深度分析’则调用高级模型”)、“循环执行”(如 “多次校验数据格式直至符合要求”)、“并行处理”(如 “同时调用两个插件分别获取不同维度数据”)等复杂逻辑,适配多样业务场景。
三、知识库(Knowledge Base)管理功能
用于存储和管理 Bot 的 “专属知识”,确保 Bot 回复的准确性与针对性。
- 多格式知识导入与结构化:
支持导入文本、PDF、Word、Excel 等格式文件,或直接粘贴网页链接、手动录入知识;系统会自动对知识进行分词、索引,生成结构化知识库(如按 “章节”“关键词” 分类)。 - 智能知识召回与引用:
当 Bot 接收用户提问时,会自动从知识库中检索相关内容,并结合 LLM 生成回复(同时标注知识来源,方便溯源)。例如,企业搭建 “内部培训 Bot” 时,可将员工手册、产品资料导入知识库,Bot 即可基于这些专属内容解答员工问题,避免 “幻觉回答”。 - 知识库更新与维护:
支持随时添加、删除、修改知识内容,也可设置 “知识有效期”(如临时活动规则到期后自动失效),确保知识的时效性。
四、测试与部署功能
-
多场景测试工具:
提供 “对话测试” 功能,可模拟用户提问,实时查看 Bot 的回复效果,并针对 “回答错误”“流程卡顿” 等问题标记 “bad case”,用于后续优化;也支持批量导入测试用例,自动生成测试报告(如 “准确率”“响应速度”“工具调用成功率” 等指标)。 -
多平台一键部署:
搭建完成的 Bot 可快速部署到多种渠道,包括:
- 官方渠道:Coze 网页端、Coze 小程序;
- 第三方平台:微信公众号 / 小程序、Discord、Telegram、企业微信等(通过 API 或官方插件对接);
- 自定义场景:生成嵌入代码,直接集成到企业官网、APP 或内部系统。
五、团队协作与资源管理功能
适合多人共同开发或企业级使用。
- 工作空间与权限管理:
可创建 “团队工作空间”,邀请成员加入并分配权限(如 “管理员”“开发者”“测试者”),不同权限对应不同操作范围(如开发者可编辑 Bot,测试者仅能进行测试),保障协作效率与数据安全。 - 资源库统一管理:
工作流、知识库、插件、测试用例等资源可统一存储在 “资源库”,支持跨 Bot 复用(如将 “客户信息查询工作流” 应用到多个客服 Bot),减少重复开发。
典型适用场景
- 内容创作:如搭建 “短视频脚本生成 Bot”“文案优化 Bot”,结合工作流实现 “选题→初稿→润色→排版” 自动化;
- 企业服务:如 “智能客服 Bot”(对接知识库和订单系统,自动解答售后问题)、“办公助手 Bot”(自动汇总周报、预约会议);
- 个人工具:如 “学习助手 Bot”(定制化整理知识点)、“旅行规划 Bot”(结合实时数据生成行程);
- 开发者工具:如快速搭建 API 测试 Bot、代码解释 Bot 等。
3.差异对比
对比维度 | Coze | Dify | n8n |
---|---|---|---|
定位 | 字节跳动推出的开源无代码 AI 聊天机器人平台,主打快速构建对话式 AI 应用 | 开源的大语言模型 (LLM ) 应用开发平台,融合后端即服务(Backend as Service )和 LLMOps 理念,专注于基于大语言模型的智能应用全生命周期管理 | 开源的、可扩展的工作流自动化工具,核心能力是跨系统集成与复杂工作流编排 |
开源情况 | 开源,采用 Apache 2.0 协议 | 开源 | 开源,采用 “公平代码”(Fair Code )许可,允许商业化使用,鼓励对开源贡献者补偿 |
核心设计理念 | “即用即走”,通过可视化界面和预制模板降低 AI 开发门槛 | 融合后端即服务和 LLMOps 理念,提供从原型到生产部署全流程支持 | 以流程为核心,通过节点拼接实现系统间数据流转,强调灵活性和扩展性 |
工作流搭建 | 通过可视化界面拖拽节点搭建工作流,支持基础流程设计,部分节点支持简单脚本 | 有 Chatflow (面向对话类情景)和 Workflow (面向自动化及批处理情景),通过节点配置和变量串联搭建,支持条件分支等复杂逻辑 | 可视化拖拽高度灵活,支持条件分支、循环、并行执行等复杂逻辑,可嵌入 JavaScript/Python 代码实现复杂逻辑 |
模型支持 | 内置多模型对话系统,支持接入主流大语言模型,模型选择相对有限 | 支持数百种开源 / 专有模型,可本地部署,能动态切换模型,如白天用国产模型,夜间用 GPT-4 | 可将 LLM 接入流程,通过插件或 API 集成多种主流大语言模型,能根据业务场景动态切换模型 |
连接器数量 | 约 50 + 官方连接器,依赖官方支持,可通过 API 触发工作流,配置相对基础 | 未明确提及连接器数量,但插件机制完善,可扩展 API 和第三方工具 | 超过 400 个内置节点,支持 600 + 应用和服务连接,可连接几乎所有有 API 的应用程序 |
数据处理能力 | 可通过插件和脚本进行数据处理,能力相对有限,侧重于智能体对话和简单任务自动化 | 内置 RAG 框架,可一键上传企业文档构建知识库,实现精准问答,在与 AI 相关的数据处理上能力较强 | 可通过 JavaScript/Python 处理数据,如合并表格、加密敏感信息等,数据处理能力灵活且强大 |
部署方式 | 仅提供云服务(SaaS ) | 支持私有化部署和云服务,可根据企业需求定制部署 | 支持本地部署、云服务和 Kubernetes 集群部署,部署灵活性高 |
数据安全与合规性 | 提供加密传输和数据隔离,符合基础安全标准,闭源导致透明度较低 | 通常注重数据安全与合规,一般提供相应的数据安全措施和合规支持,但未提及具体细节 | 支持加密、RBAC 权限管理、审计日志,企业版通过 ISO 27001 认证,支持 GDPR 、HIPAA 等合规要求,数据安全性和合规性较高 |
团队协作 | 具备基础团队协作功能,如共享工作流 | 支持多工作区、权限控制,适合团队协作 | 支持团队协作,可通过权限管理等功能实现多人协同开发 |
适用场景 | 适合个人、小型团队的轻量级自动化需求,以及快速搭建对话式 AI,如智能客服、社交媒体聊天机器人等 C 端场景,可快速部署到字节系产品及微信等平台 | 适合企业级 AI 应用开发,如智能客服系统、企业级知识库问答系统、以 AI 为底层能力的 SaaS 系统开发等,可满足对模型运维和复杂工作流有较高要求的场景 | 适用于个人、中小型企业,尤其是有复杂自动化需求场景,如电商自动化运营、营销自动触发、企业 IT 自动化等,可实现跨系统的数据自动化流转 |
学习门槛 | 零代码操作,通过自然语言操作和拖拽式工作流,中文文档完善,学习门槛低,适合零基础用户 | 需一定技术基础,了解大模型相关知识和开发流程,适合有技术能力的团队,但提供了较为完善的文档和工具,上手难度适中 | 需理解 API 接口和数据处理逻辑,对技术能力有一定要求,适合自动化流程开发者、技术型运营等,但可视化设计也降低了部分难度 |
成本模型 | 目前免费,未来或按交互量收费 | 开源部分可免费使用,私有化部署等企业级服务可能需付费,按 Token 计费 + 企业订阅 | 社区版开源免费,需自托管且自行维护;企业版按用户 / 工作流付费,支持私有云部署 |
生态优势 | 深度整合抖音、飞书等字节系产品,可一键发布触达用户 | 社区活跃度高,功能迭代快速,可与多种开源模型和工具集成 | 有丰富的社区资源和大量的工作流模板分享,可通过第三方插件扩展功能,生态较为丰富 |
4.Coze和Coze空间
功能定位:“开发平台” vs “协同办公场所”
- 扣子(Coze):核心是AI 智能体开发平台,面向 “搭建者”,无论是否有编程基础,都能通过低代码方式创建、训练 AI 智能体(如智能客服、天气助手),并编排工作流(如短视频生成、数据查询流程),本质是 “生产 AI 应用的工具”。
- 扣子空间(Coze Space):核心是AI 协同办公助手,面向 “使用者”,聚焦 “高效完成实际任务”,无需搭建智能体,只需提出目标(如 “写一份产品销售报告”“设计《朝花夕拾》教案”),即可作为办公场景的协作工具,本质是 “用 AI 解决具体工作的场所”。
任务处理方式:“手动编排” vs “自动拆解”
- 扣子:需用户手动设计工作流,明确 AI 执行的每一步逻辑(如 “调用天气插件→获取数据→按格式输出”),适合需要定制化流程的场景,但依赖用户对任务逻辑的拆解能力。
- 扣子空间:支持智能任务分解,用户仅需输入目标(如 “规划北京三日游”),系统会自动拆分为 “景点筛选→行程排序→天气查询→酒店推荐” 等子任务,按逻辑依次执行;还提供 “探索模式”“规划模式” 两种处理方式,无需用户手动配置步骤。
输出成果形式:“多样化创作” vs “办公场景适配”
- 扣子:输出形式更偏向 “创作与应用交付”,包括视频、文字、网页链接、智能体应用(可发布到社交平台 / 业务系统)等,随插件生态完善可拓展更多创作类成果(如动漫视频、小说推文)。
- 扣子空间:输出更聚焦 “办公实用性成果”,如 PPT 文件、Markdown 文档、在线数据表格、思维导图等,直接匹配报告撰写、会议安排、数据分析等工作场景,无需额外格式转换即可使用。
工具调用能力:“插件接入” vs “深度集成”
- 扣子:通过 “插件市场” 接入第三方工具(如头条搜索、图像生成、OCR 识别),工具数量丰富但以 “单点功能调用” 为主,需手动关联到工作流中,适合轻量工具整合。
- 扣子空间:支持MCP 工具协议,不仅能调用墨迹天气、GitHub、高德地图等外部工具,还能与飞书全家桶(飞书文档、多维表格、日历)深度集成,工具调用更贴合办公协同场景,且无需手动配置关联逻辑,系统会自动匹配任务所需工具。
二、开发者-智能体搭建
智能体,也就是我们常说的AI Agent,但它到底是什么呢?我们可以用一个简单的公式进行描述:AI Agent =Processing(流程处理)+LLM(语言模型)+Memory(长期记忆)+ Tools(工具)。
有没有发现这个AI Agent
跟我们人有点相似,LLM
就像是我们的大脑,帮助我们做决策和分析,Processing
是我们将一件事拆分成的每一个步骤,Memory
就像是我们人类的记忆和经验,Tools
就像是我们为了完成一件事所需要用到的工具。
单纯的LLM
就是Large Language Model大语言模型,简称大模型,主要被用来理解文本和生成自然语言文本,也就是我们前些年最火所谓的AI。通常没有特定的目标和任务,就是你一句我一句这种根据输入的文本给出相应的回答的形式,大家所熟知的ChatGpt、Deepseek、豆包、Kimi、元宝、通义千问这些其实都是大语言模型。
但是单一的大语言模型能做到的对话再厉害,它也只是一个对话模型, 无法真正做到某件事情,其实AI Agent就是自动化机器人,可以给它设定很多个功能,我只需要一个指令,它就可以帮我们完成一系列动作,这和前几年火的RPA有异曲同工之妙。
我们来使用Coze在空间中设计一个智能体。
首先,我们要明白我们的目的,我要设计一个能生成成语视频的智能体。我通过输入成语,他就能给我生成一个完整的讲解视频。生成视频,我们需要有文案,图片,声音。我们可以做以下部署:
1.首先进入资源库,点击工作流
2.输入名称
3.插入大模型,重命名
4.配置开始节点
5.配置大模型
6.书写提示词
请围绕某一成语故事,生成一段成语类短视频口播文案,需遵循以下结构:
1. **悬念开场**:以“【成语相关场景/背景】+ 反常识疑问/断言”开篇,激发观众兴趣。
2. **身份代入**:用第二人称“你”描述在成语故事背景下的身份、所处情境及面临的核心难题,包含具体情境信息,直接进入主题。
3. **冲突升级**:依次展现事件发展中的外部阻碍、内部矛盾、关键抉择三层冲突。
4. **破局细节**:主角采取3个递进动作,包含:具体行动(如实地考察/制定策略)、巧思运用(如借助外力/变换方法)、核心举措(如关键言行/决定性行为)。
5. **主题收尾**:通过事件结局引出成语的形成,以“这一刻你终于明白…”句式点题,揭示成语蕴含的道理。
要求:每段不超过3句话,多用短句制造节奏;加入至少2处与成语相关的文化常识;在关键转折点使用感官描写(如动作触感/场景视觉/氛围感受);生成200-300字左右口播文案,由长短句构成,长句用逗号分隔,每个短句不超19个汉字。**输出要求**: 只输出口播字幕文案,不要输出其他任何额外内容,不输出分段说明
参考实例:
1:完璧归赵
“蔺相如捧着和氏璧,真的只是靠嘴皮子退敌吗?你是赵王派去的护卫,手按剑柄站在秦宫廊下,玉璧的冰凉透过锦盒传来,像块寒冰贴在掌心。秦王把玩玉璧时,侍臣的笑声震得梁上灰尘簌簌落,没人提割城的事,你摸出靴中短刀,刀柄的纹路已被冷汗浸软。赵军在边境被秦军牵制,国内大臣吵着要毁玉避祸,你收到密信,若玉璧留秦,家眷立斩。蔺相如突然捧玉后退,指尖抵着柱角,石屑硌进肉里。他先说玉有瑕疵,骗回璧后举过头顶,扬言要撞碎在柱上,声音比殿角铜钟还响。你看见秦王眼角抽搐,侍臣摸向腰间的剑,寒光映在玉璧上。蔺相如让秦王斋戒五日,你趁机带着玉璧混在商队里,用炭笔在璧上刻下微小记号。五日后秦宫,他指着空盒笑说,玉已归赵,要杀要剐悉听尊便。秦王摔碎案上酒樽,酒液溅湿你裤脚,却终究没下令动手。你摸着袖中带回的玉璧,刻痕还带着体温。这一刻你终于明白,‘完璧归赵’靠的从不是鲁莽,是把生死当筹码的精准算计。”
2:负荆请罪
“廉颇光着脊背负荆,真的只是服软那么简单吗?你是廉颇的亲兵,捧着荆条跟在他身后,石板路的凉气透过草鞋往上窜,棘刺在他背上划出红痕。蔺相如的门客拦在巷口,投来的白眼比冬日寒风还冷,军中副将在街角跺脚,骂将军辱没了上卿身份。秦军在边境集结,扬言要趁赵国内斗来犯,赵王的诏书催了三次,让廉颇去蔺相如府中议事,他却关在帐中喝闷酒。廉颇突然摔碎酒坛,抓起荆条就往外走,你想给他披件衣服,被他一胳膊肘推开,掌心的老茧蹭过你手背,比荆条还硬。他在蔺相如门前跪下,脊背挺得笔直,荆条的尖刺扎进皮肉,血珠滴在青石板上,像撒了把红豆。蔺相如慌忙扶起他时,你看见两人手扣在一起,指节都在用力。三日后联军出征,蔺相如坐帐筹谋,廉颇挥师冲锋,你们跟着将军杀进敌阵,听见他吼着‘蔺相如信我’。刀光剑影里,你摸着腰间的令牌,上面刻着‘赵’字。这一刻你终于明白,‘负荆请罪’藏的不是卑微,是能屈能伸的家国大义。”
3:草木皆兵
“苻坚望见八公山草木,真的是吓破了胆吗?你是前秦的传令兵,站在山顶瞭望台,晋军的旗帜在风里猎猎作响,像一片翻涌的红海压过来。帐篷里传来争吵,鲜卑将领说要退军,氐族老将拍着案大叫,说晋军不过是纸老虎,苻坚的手指在地图上乱点,墨迹晕染了‘淝水’二字。粮草车队在山坳被劫,士兵嚼着树皮骂娘,你去查岗时,看见哨兵把树影当成晋军,弓弦拉得咯吱响,冷汗顺着他的下颌线往下淌。苻坚突然下令全军后撤,让晋军渡过淝水来决战,你传达命令时,马蹄踩在落叶上,沙沙声像背后有人追。晋军趁势渡河,喊杀声震得山摇地动。你看见士兵们掉头就跑,铠甲撞在一起叮当乱响,有人被自己人推倒,惨叫淹没在惊呼声里。苻坚的轿子在乱军里颠簸,他掀帘张望时,脸色比头盔还白。退到淮北时,你捡了面掉在地上的战鼓,鼓皮上还沾着泥和血。风一吹,周围的草叶沙沙动,你突然觉得那都是举着刀的晋兵。这一刻你终于明白,‘草木皆兵’怕的从来不是草木,是败亡前夕,自己吓垮自己的人心。”
7.再添加个大模型,配置,书写提示词
# 角色
根据故事信息生成故事主角开场绘画提示词desc_prompt。
## 技能
### 技能 1: 生成绘画提示
1. 根据故事信息,生成主角任务绘画提示词 desc_promopt,详细描述人物动作、表情、服装,色彩风格等细节。
- 风格要求:古代动漫宫崎骏插画风格, 卡通风格,明亮色彩,柔和线条,适合儿童观看的古代成语故事插画,主角正面视角面对屏幕,位于画面正中间,表情亲切可爱,穿着鲜艳的古代服饰,背景简洁留白,画面清晰,人物特写,高清,低对比度,色彩高饱和,浅景深,氛围轻松愉快,充满童趣
# 限制
1. 只输出绘画提示词,不要输出其他额外内容。将这段提示词改一下,我要生成的图片应该是适合小孩观看的成语故事。提示词用汉语回答。
8.插入图像生成模型
9.单链验证
10.添加大模型并配置
# 角色
你是一位专业的故事创意转化师,你能够深入理解故事文案的情节、人物、场景等元素,用生动且具体的语言为绘画创作提供清晰的指引。
## 技能
### 技能1: 生成分镜字幕
1. 当用户提供故事文案时,仔细分析文案中的关键情节、人物形象、场景特点等要素。
2. 文案分镜, 生成字幕cap:
- 字幕文案分段: 第一句单独生成一个分镜,后续每个段落均由2句话构成,语句简洁明了,表达清晰流畅,同时具备节奏感。
- 分割文案后特别注意前后文的关联性与一致性,必须与用户提供的原文完全一致,不得进行任何修改、删减。字幕文案必须严格按照用户给的文案拆分,不能修改提供的内容更不能删除内容
===回复示例===
[{
"cap":"字幕文案"
}]
===示例结束===
## 限制:
- 只围绕用户提供的故事文案进行分镜绘画提示词生成和主题提炼,拒绝回答与该任务无关的话题。
- 所输出的内容必须条理清晰,分镜绘画提示词要尽可能详细描述画面,主题必须为2个字。
- 视频文案及分镜描述必须保持一致。
- 输出内容必须严格按照给定的 JSON 格式进行组织,不得偏离框架要求。
- 只对用户提示的内容进行分镜,不能更改原文
- 严格检查 输出的json格式正确性并进行修正,特别注意json格式不要少括号,逗号等
11.配置画面分镜大模型
# 角色
根据分镜字幕cap生成绘画提示词desc_prompt。
## 技能
### 技能 1: 生成绘画提示
1. 根据分镜字幕cap,生成分镜绘画提示词 desc_promopt,每个提示词要详细描述画面内容,包括人物动作、表情、服装,场景布置、色彩风格等细节。
- 风格要求:古代动漫宫崎骏插画风格, 卡通风格,明亮色彩,柔和线条,适合儿童观看的古代成语故事插画,主角正面视角面对屏幕,位于画面正中间,表情亲切可爱,穿着鲜艳的古代服饰,背景简洁留白,画面清晰,人物特写,高清,低对比度,色彩高饱和,浅景深,氛围轻松愉快,充满童趣,高清,高对比度,色彩高饱和,浅景深。
- 第一个分镜画面中不要出现人物,只需要一个画面背景
===回复示例===
[
{
"cap": "字幕文案",
"desc_promopt": "分镜图像提示词"
}
]
===示例结束===
## 限制:
- 只对用户提供的json内容补充desc_prompt字段,不能更改原文
- 严格检查输出的 json 格式正确性并进行修正,特别注意 json 格式不要少括号,逗号等
批处理
插入视频内容生成大模型
插入选择器
优化提示词
配置选择的另一条单线。尝试生成图像
插入代码,修改格式
// 在这里,您可以通过 ‘params’ 获取节点中的输入变量,并通过 'ret' 输出结果
// 'params' 和 'ret' 已经被正确地注入到环境中
// 下面是一个示例,获取节点输入中参数名为‘input’的值:
// const input = params.input;
// 下面是一个示例,输出一个包含多种数据类型的 'ret' 对象:
// const ret = { "name": ‘小明’, "hobbies": [“看书”, “旅游”] };
async function main({ params }: Args): Promise<Output> {
var image1 = params.image1;
var image2 = params.image2;
if(!image1){
image1 = image2;
}
// 构建输出对象
const ret = {
"image_url": image1
};
return ret;
}
插入字幕合成模型
获取视频时长
连接
配置批处理
插入数据整合代码
// 在这里,您可以通过 ‘params’ 获取节点中的输入变量,并通过 'ret' 输出结果
// 'params' 和 'ret' 已经被正确地注入到环境中
async function main({ params }: Args): Promise<Output> {
// 关键:为所有依赖的参数添加默认值,避免undefined
const {
image_list = [],
audio_list = [],
duration_list = [],
scenes = [],
role_img_url = "",
title = ""
} = params;
// 处理音频数据
const audioData = [];
let audioStartTime = 0;
const aideoTimelines = [];
let maxDuration = 0;
const imageData = [];
// 关键:添加数组长度校验,避免因空数组导致循环异常
const loopLength = Math.min(audio_list.length, duration_list.length, image_list.length);
for (let i = 0; i < loopLength; i++) { // 用最小长度限制循环,避免越界
const duration = duration_list[i] || 0; // 避免duration为undefined
audioData.push({
audio_url: audio_list[i],
duration,
start: audioStartTime,
end: audioStartTime + duration
});
aideoTimelines.push({
start: audioStartTime,
end: audioStartTime + duration
});
if((i-1)%2===0){ // 修复原代码的“==”为“===”,避免隐式类型转换
imageData.push({
image_url: image_list[i],
start: audioStartTime,
end: audioStartTime + duration,
width: 1440,
height: 1080,
in_animation: "轻微放大",
in_animation_duration: 100000 // 注意:单位若为微秒,100000=0.1秒,可能需确认
});
} else{
imageData.push({
image_url: image_list[i],
start: audioStartTime,
end: audioStartTime + duration,
width: 1440,
height: 1080
});
}
audioStartTime += duration;
maxDuration = audioStartTime;
}
const roleImgData = [];
// 关键:校验duration_list[0]是否存在,避免访问undefined的属性
if (role_img_url && duration_list.length > 0) {
roleImgData.push({
image_url: role_img_url,
start: 0,
end: duration_list[0],
width: 1440,
height: 1080
});
}
// 提取字幕时先校验scenes结构
const captions = scenes.map(item => item?.cap || "").filter(Boolean); // 避免item.cap为undefined
const subtitleDurations = duration_list;
// 关键:调用processSubtitles前校验参数,避免空数组导致后续错误
const { textTimelines, processedSubtitles } = processSubtitles(
captions,
subtitleDurations
);
// 处理标题
const title_list = [title || ""]; // 标题默认空字符串
const title_timelimes = duration_list.length > 0
? [{ start: 0, end: duration_list[0] }]
: []; // 若duration_list为空,避免end为undefined
// 开场音效与背景音乐
const kc_audio_url = "https://p9-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/c04e7b48586a48f1863e421be4b10cf1.MP3~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1777550323&x-signature=T%2BNjvPHPyHnGICvWRFDeFaj17UM%3D&x-wf-file_name=%E6%95%85%E4%BA%8B%E5%BC%80%E5%9C%BA%E9%9F%B3%E6%95%88.MP3";
const bg_audio_url = "https://p3-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/5603dc783a6c4b75a4bf4e1b44086ad5.MP3~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1777550332&x-signature=E1123RzPTMD%2BipseRN4itYxhZyc%3D&x-wf-file_name=%E6%95%85%E4%BA%8B%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90.MP3";
const bg_audio_data = [];
if (maxDuration > 0) { // 校验maxDuration是否有效
bg_audio_data.push({
audio_url: bg_audio_url,
duration: maxDuration, // 修复原代码的“duraion”拼写错误
start: 0,
end: maxDuration
});
}
const kc_audio_data = [];
kc_audio_data.push({
audio_url: kc_audio_url,
duration: 4884897, // 注意:确认单位是否为微秒(若为毫秒则需转换)
start: 0,
end: 4884897
});
// 构建输出对象
const ret = {
"audioData": JSON.stringify(audioData),
"bgAudioData": JSON.stringify(bg_audio_data),
"kcAudioData": JSON.stringify(kc_audio_data),
"imageData": JSON.stringify(imageData),
"text_timelines": textTimelines, // 修复原代码的“timielines”拼写错误
"text_captions": processedSubtitles,
"title_list": title_list,
"title_timelines": title_timelimes, // 修复原代码的“timelimes”拼写错误
"roleImgData": JSON.stringify(roleImgData)
};
return ret;
}
const SUB_CONFIG = {
MAX_LINE_LENGTH: 25,
SPLIT_PRIORITY: ['。','!','?',',',',',':',':','、',';',';',' '],
TIME_PRECISION: 3
};
function splitLongPhrase(text, maxLen) {
// 关键:校验text是否为字符串,避免非字符串类型访问length
if (typeof text !== 'string') text = String(text || "");
if (text.length <= maxLen) return [text];
for (const delimiter of SUB_CONFIG.SPLIT_PRIORITY) {
const pos = text.lastIndexOf(delimiter, maxLen - 1);
if (pos > 0) {
const splitPos = pos + 1;
return [
text.substring(0, splitPos).trim(),
...splitLongPhrase(text.substring(splitPos).trim(), maxLen)
];
}
}
const startPos = Math.min(maxLen, text.length) - 1;
for (let i = startPos; i > 0; i--) {
if (/[\p{Unified_Ideograph}]/u.test(text[i])) {
return [
text.substring(0, i + 1).trim(),
...splitLongPhrase(text.substring(i + 1).trim(), maxLen)
];
}
}
const splitPos = Math.min(maxLen, text.length);
return [
text.substring(0, splitPos).trim(),
...splitLongPhrase(text.substring(splitPos).trim(), maxLen)
];
}
const processSubtitles = (
captions = [], // 添加默认空数组,避免undefined
subtitleDurations = [], // 添加默认空数组
startTimeμs = 0
) => {
const cleanRegex = /[\u3000\u3002-\u303F\uff00-\uffef\u2000-\u206F!"#$%&'()*+\-./<=>?@\\^_`{|}~]/g;
let processedSubtitles = [];
let processedSubtitleDurations = [];
// 关键:遍历前校验数组长度,避免captions与subtitleDurations长度不匹配
const safeLength = Math.min(captions.length, subtitleDurations.length);
for (let index = 0; index < safeLength; index++) {
const text = captions[index];
const totalDuration = subtitleDurations[index] || 0; // 避免duration为undefined
let phrases = splitLongPhrase(text, SUB_CONFIG.MAX_LINE_LENGTH);
phrases = phrases.map(p => p.replace(cleanRegex, '').trim())
.filter(p => p.length > 0);
if (phrases.length === 0) {
processedSubtitles.push('[无内容]');
processedSubtitleDurations.push(totalDuration);
continue;
}
const totalChars = phrases.reduce((sum, p) => sum + p.length, 0);
let accumulatedμs = 0;
phrases.forEach((phrase, i) => {
const ratio = totalChars > 0 ? phrase.length / totalChars : 0; // 避免除以0
let durationμs = i === phrases.length - 1
? totalDuration - accumulatedμs
: Math.round(totalDuration * ratio);
processedSubtitles.push(phrase);
processedSubtitleDurations.push(durationμs);
accumulatedμs += durationμs;
});
}
// 生成时间轴时校验duration数组
const textTimelines = [];
let currentTime = startTimeμs;
processedSubtitleDurations.forEach(durationμs => {
const start = currentTime;
const end = start + (durationμs || 0); // 避免durationμs为undefined
textTimelines.push({ start, end });
currentTime = end;
});
return { textTimelines, processedSubtitles };
};
创建草稿
字幕音频生成
视频画面生成
关键帧代码
import json
async def main(args: Args) -> Output:
params = args.params
segment_ids = params['segment_ids']
times = params['duration_list']
seg = params['segment_infos']
# 验证参数长度一致性
if len(segment_ids) != len(times):
raise ValueError("segment_ids与times数组长度不一致")
keyframes = []
for idx, seg_id in enumerate(segment_ids):
if idx == 0: # 跳过第一张图片
continue
# 获取对应音频时长并转换微秒
audio_duration = int(float(times[idx]))
# 根据循环索引决定缩放方向
cycle_idx = idx - 1 # 计算排除第一个元素后的循环索引
if cycle_idx % 2 == 0: # 偶数索引:1.0 -> 1.5
start_scale = 1.0
end_scale = 1.5
else: # 奇数索引:1.5 -> 1.0
start_scale = 1.5
end_scale = 1.0
# 起始关键帧(0秒位置)
keyframes.append({
"offset": 0,
"property": "UNIFORM_SCALE",
"segment_id": seg_id,
"value": start_scale,
"easing": "linear"
})
# 结束关键帧(同步音频时长)
keyframes.append({
"offset": audio_duration, # 使用实际音频时长
"property": "UNIFORM_SCALE",
"segment_id": seg_id,
"value": end_scale,
"easing": "linear"
})
# 起始关键帧(0秒位置)
keyframes.append({
"offset": 0,
"property": "UNIFORM_SCALE",
"segment_id": seg[0]['id'],
"value": 2,
"easing": "linear"
})
keyframes.append({
"offset": 533333,
"property": "UNIFORM_SCALE",
"segment_id": seg[0]['id'],
"value": 1.2,
"easing": "linear"
})
# 结束关键帧(同步音频时长)
keyframes.append({
"offset": seg[0]['end']-seg[0]['start'], # 使用实际音频时长
"property": "UNIFORM_SCALE",
"segment_id": seg[0]['id'],
"value": 1.0,
"easing": "linear"
})
return {
"keyFrames": json.dumps(keyframes)
}
添加关键帧
制作字幕数据
添加字幕
批量添加字幕
输出
结束
这样我们的工作流就做好了,后续会更新制作后的视频
三、关于开源
2025 年 7 月 26 日,Coze 宣布开源,发布了 Coze Studio 和 Coze Loop 两大项目,采用 Apache 2.0 协议,允许免费使用、修改甚至商业化部署。开发者可通过 [Coze Studio GitHub](https://github.com/coze - dev/coze - studio) 和 [Coze Loop GitHub](https://github.com/coze - dev/cozeloop) 获取开源代码。
四、本地配置与在线使用对比
1.在线版 Coze
优点
- 功能全面且丰富
- 插件生态完善:拥有成百上千个官方及第三方插件,覆盖智能硬件、新闻阅读、图像生成(如 ByteArtist、豆包图像大模型)、天气查询(墨迹天气)、代码执行等多领域,能满足内容创作、办公协作、生活服务等多样化需求。
- 工作流节点充足:除基础搜索、代码、循环节点外,还支持图像处理(抠图、画质提升)、音视频处理(视频生成、抽帧)、会话管理(创建 / 删除会话、查询历史)等进阶节点,可搭建复杂自动化流程。
- 智能体编排能力强:支持触发器、火山知识库(文本 / 表格 / 照片多格式导入)、长期记忆、文件盒子等功能,可配置开场白、用户问题建议等对话体验,且提供单 Agent(自主规划 / 对话流)、多 Agents 三种模式,适配简单与复杂业务逻辑。
- 资源管理与兼容性优:支持多工作空间(个人 / 团队 / 项目空间)切换,可创建文件夹分组管理智能体;资源导入类型丰富(含对话流、卡片、提示词、音色),在线版工作流可自由复制粘贴,跨场景复用性强。
- 发布渠道多元:可一键部署至扣子商店、豆包、飞书、抖音小程序、微信生态(客服 / 服务号 / 订阅号)、掘金等多平台,无需额外开发即可触达广泛用户。
- 辅助功能实用:支持 AI 自动生成智能体图标、AI 优化提示词,降低设计与文案编写门槛,提升开发效率。
- 稳定性高,无技术门槛
- 无需自行部署与维护服务器,不存在插件授权失败、知识库上传解析异常等 bug,官方会持续迭代优化功能,保障使用流畅性;
- 操作零门槛,可视化拖拽式搭建,中文文档完善,零基础小白可快速上手,适合用于学习 AI Agent 开发或轻量级任务处理。
缺点
- 数据安全自主性低:数据存储在 Coze 官方云端,无法完全掌控数据归属,对于对数据隐私要求极高的企业(如金融、医疗行业),可能存在合规风险。
- 定制化自由度有限:无法深度修改底层代码与架构,若需开发专属插件或适配特殊业务场景,扩展能力弱于开源版。
- 可能存在功能限制:免费版可能对插件使用数量、工作流运行次数、存储容量等有额度限制,企业级功能需付费解锁。
2.开源版(本地部署)Coze 优缺点
优点
- 数据安全与合规性强:可将数据完全存储在企业内部服务器或本地数据库,无需依赖第三方云端,能满足金融、医疗等行业的数据隐私要求;支持代码审计,可自主排查系统安全漏洞,保障业务合规。
- 定制化与扩展性高:基于 Apache 2.0 协议,可获取完整源码(前端 Typescript+React、后端 Golang),技术团队可进行二次开发,如定制专属插件、扩展工作流节点、修改产品 logo 与交互逻辑,适配细分业务场景(如企业内部定制化智能助手)。
- 无云端功能限制:不存在在线版的插件使用、工作流运行次数等额度限制,可根据业务需求无限扩展,适合高并发、高频次的自动化任务场景。
缺点
- 功能缺失严重
- 插件数量极少:仅 18 个基础插件,无在线版的图像生成、头条搜索、飞书生态等高频插件,且官方需到 Q3 才升级插件生态,当前无法满足多样化需求;
- 核心功能缺失:无触发器、长期记忆、文件盒子、多工作空间等关键功能,智能体仅支持单 Agent 模式,无法处理复杂逻辑;
- 辅助功能缺失:无 AI 生成图标、AI 优化提示词功能,资源管理无文件夹分组,工作流无法粘贴在线版内容,开发效率低。
- 稳定性差,bug 较多:存在知识库文本上传后解析 6 次失败且无提示、插件 “未授权” 却找不到授权入口、点击插件无跳转等问题,需自行排查(如服务器配置是否达标)与修复,增加运维成本。
- 技术门槛高,部署维护复杂:需具备服务器部署(Linux/Windows)、前后端开发(Golang/React)、数据库维护等技术能力,零基础小白无法独立操作;后续需自行跟进官方源码更新,修复漏洞与迭代功能,运维成本高。
- 发布渠道单一:仅支持发布至
ChatSDK
与API
,无法部署到扣子商店、豆包、抖音小程序等流量平台,难以触达 C 端用户或外部客户。
3、适用场景与人群建议
版本类型 | 核心适用场景 | 适配人群 |
---|---|---|
在线版 Coze | 1. 零基础用户学习 AI Agent 开发; 2. 个人 / 小型团队轻量级任务(如简单智能客服、短视频脚本生成); 3. 需快速部署至多平台(如微信、抖音)触达用户的场景 | 零基础小白、非技术团队、小型企业、内容创作者 |
模式,无法处理复杂逻辑; |
- 辅助功能缺失:无 AI 生成图标、AI 优化提示词功能,资源管理无文件夹分组,工作流无法粘贴在线版内容,开发效率低。
- 稳定性差,bug 较多:存在知识库文本上传后解析 6 次失败且无提示、插件 “未授权” 却找不到授权入口、点击插件无跳转等问题,需自行排查(如服务器配置是否达标)与修复,增加运维成本。
- 技术门槛高,部署维护复杂:需具备服务器部署(Linux/Windows)、前后端开发(Golang/React)、数据库维护等技术能力,零基础小白无法独立操作;后续需自行跟进官方源码更新,修复漏洞与迭代功能,运维成本高。
- 发布渠道单一:仅支持发布至
ChatSDK
与API
,无法部署到扣子商店、豆包、抖音小程序等流量平台,难以触达 C 端用户或外部客户。
3、适用场景与人群建议
版本类型 | 核心适用场景 | 适配人群 |
---|---|---|
在线版 Coze | 1. 零基础用户学习 AI Agent 开发; 2. 个人 / 小型团队轻量级任务(如简单智能客服、短视频脚本生成); 3. 需快速部署至多平台(如微信、抖音)触达用户的场景 | 零基础小白、非技术团队、小型企业、内容创作者 |
开源版(本地部署)Coze | 1. 对数据隐私要求极高的企业(金融、医疗); 2. 需深度定制化智能体的场景(如企业内部定制化办公助手); 3. 高并发、高频次自动化任务且需无功能限制的场景 | 具备技术能力的中大型企业、IT 团队、技术开发者 |