fluid-behavior-tree

fluid-behavior-tree

Unity3D行为树框架 提升AI开发效率与灵活性

fluid-behavior-tree是专为Unity3D项目设计的行为树框架。采用代码驱动和构建器模式,提高大型项目可维护性。框架可扩展,含预构建任务库,支持运行时树可视化,经严格单元测试。能跟踪行为树最后位置并在下一帧恢复,无缝集成Unity,无额外开销。适用于提升AI开发效率的开发者。

行为树Unity3DAI可视化调试代码驱动Github开源项目

流体行为树

构建状态

适用于Unity3D项目的行为树。采用代码驱动方法编写,使用建造者模式以最大化大型项目的可维护性。灵感来自Fluent Behavior Tree。

特性

  • 可扩展,编写自己的自定义可重用节点
  • 预建任务库,快速启动你的AI
  • 树可视化工具,在运行时调试你的树
  • 通过TDD和单元测试进行大量测试
  • 跟踪行为树的最后位置并在下一帧恢复
  • 为Unity构建(无集成开销)

支持

如果你有问题或需要帮助,请加入Discord社区

Trello板上查看即将推出的功能和开发进度。

入门

创建树时,你需要将它们存储在变量中,以正确缓存所有必要的数据。

using UnityEngine; using CleverCrow.Fluid.BTs.Tasks; using CleverCrow.Fluid.BTs.Trees; public class MyCustomAi : MonoBehaviour { [SerializeField] private BehaviorTree _tree; private void Awake () { _tree = new BehaviorTreeBuilder(gameObject) .Sequence() .Condition("自定义条件", () => { return true; }) .Do("自定义动作", () => { return TaskStatus.Success; }) .End() .Build(); } private void Update () { // 每帧更新我们的树 _tree.Tick(); } }

返回的TaskStatus的作用

根据你为任务状态返回的不同值,会发生不同的情况。

  • Success:节点已完成,下一次tree.Tick()将重新启动树(如果没有其他节点要运行)
  • Failure:与Success相同,只是表示节点失败
  • Continue:下次调用tree.Tick()时重新运行此节点。树会跟踪指针引用,只有在调用tree.Reset()时才能清除。

树可视化工具

只要你的树存储变量设置为public或有SerializeField属性,你就可以在游戏运行时在编辑器中打印树的可视化效果。请注意,你无法在游戏未运行时查看树,因为树必须先构建才能可视化。

可视化工具

扩展树

你可以通过几行代码安全地向行为树添加新代码,允许你自定义BT的同时支持未来版本的升级。

using UnityEngine; using CleverCrow.Fluid.BTs.Tasks; using CleverCrow.Fluid.BTs.Tasks.Actions; using CleverCrow.Fluid.BTs.Trees; public class CustomAction : ActionBase { protected override TaskStatus OnUpdate () { Debug.Log(Owner.name); return TaskStatus.Success; } } public static class BehaviorTreeBuilderExtensions { public static BehaviorTreeBuilder CustomAction (this BehaviorTreeBuilder builder, string name = "我的动作") { return builder.AddNode(new CustomAction { Name = name }); } } public class ExampleUsage : MonoBehaviour { public void Awake () { var bt = new BehaviorTreeBuilder(gameObject) .Sequence() .CustomAction() .End(); } }

安装

Fluid Behavior Tree通过Unity的包管理器使用。要使用它,你需要在Packages/manifest.json文件中添加以下行。之后,你就可以从Unity的包管理器窗口中可视化控制你正在使用的Fluid Behavior Tree的具体版本。这必须这样做,以便你的Unity编辑器可以连接到NPM的包注册表。

{ "scopedRegistries": [ { "name": "NPM", "url": "https://registry.npmjs.org", "scopes": [ "com.fluid" ] } ], "dependencies": { "com.fluid.behavior-tree": "2.2.0" } }

特定版本的存档和发布说明可在发布页面上找到。

示例场景

你可能想看看夺旗示例项目,了解Fluid Behavior Tree在你的项目中的实际使用方式。它演示了实时使用情况,单位试图夺取旗帜,同时抓取能量提升以试图获得优势。

目录

示例场景

你可能想查看夺旗示例项目,以了解流式行为树如何在你的项目中使用的实际示例。它演示了实时使用情况,单位试图夺取旗帜,同时抢夺能量提升以试图获得优势。

流式行为树附带了一个强大的预制动作、条件、组合和其他节点库,以帮助加速你的开发过程。

动作

通用动作

你可以即时创建一个通用动作。如果你发现自己经常重复使用相同的动作,你可能需要查看编写自定义动作的部分。

.Sequence() .Do("自定义动作", () => { return TaskStatus.Success; }) .End()

等待

在行为树上跳过指定数量的滴答。

.Sequence() // 在树上等待1个滴答后继续 .Wait(1) .Do(MyAction) .End()

等待时间

等待指定的秒数(以deltaTime计)过去。

.Sequence() .WaitTime(2.5f) .Do(MyAction) .End()

条件

通用条件

你可以即时创建一个通用条件。如果你发现自己经常重复使用相同的条件,你可能需要查看编写自定义条件的部分。

.Sequence() .Condition("自定义条件", () => { return true; }) .Do(MyAction) .End()

随机概率

根据给定的概率随机评估节点为真或假。

.Sequence() // 50%的概率返回成功 .RandomChance(1, 2) .Do(MyAction) .End()

组合

序列

按顺序运行每个子节点,并期望获得成功状态以触发下一个节点。如果返回失败,序列将停止执行子节点并向父节点返回失败

注意每个组合后面都必须跟着一个.End()语句。这确保在构建树时你的节点被正确嵌套。

.Sequence() .Do(() => { return TaskStatus.Success; }) .Do(() => { return TaskStatus.Success; }) // 此后的所有任务都不会运行,序列将退出 .Do(() => { return TaskStatus.Failure; }) .Do(() => { return TaskStatus.Success; }) .End()

选择器

运行每个子节点,直到返回成功

.Selector() // 运行但失败 .Do(() => { return TaskStatus.Failure; }) // 将在此停止,因为节点返回成功 .Do(() => { return TaskStatus.Success; }) // 不运行 .Do(() => { return TaskStatus.Success; }) .End()

随机选择器

使用洗牌算法随机选择一个子节点。寻找直到返回成功或每个节点都失败。每次树初始运行时都会重新洗牌。

.SelectorRandom() .Do(() => { return TaskStatus.Failure; }) .Do(() => { return TaskStatus.Success; }) .Do(() => { return TaskStatus.Failure; }) .End()

并行

同时运行所有子节点,直到它们全部返回成功。如果任何一个返回失败,则退出并停止所有正在运行的节点。

.Parallel() // 这两个任务每帧都会运行 .Do(() => { return TaskStatus.Continue; }) .Do(() => { return TaskStatus.Continue; }) .End()

装饰器

装饰器是包装任何节点以改变返回值(或执行特殊逻辑)的父元素。它们非常强大,是动作、条件和组合的绝佳补充。

通用装饰器

你可以用自己的自定义装饰器代码包装任何节点。这允许你自定义可重用的功能。 注意:你必须手动调用子节点的 Update() 方法,否则它不会触发。另外,每个装饰器后面都必须跟一个 .End() 语句。否则树将无法正确构建。

.Sequence() .Decorator("返回成功", child => { child.Update(); return TaskStatus.Success; }) .Do(() => { return TaskStatus.Failure; }) .End() .Do(() => { return TaskStatus.Success; }) .End()

反转器

如果子节点返回 TaskStatus.SuccessTaskStatus.Failure,则反转返回的状态。 不改变 TaskStatus.Continue

.Sequence() .Inverter() .Do(() => { return TaskStatus.Success; }) .End() .End()

返回成功

如果子节点返回 TaskStatus.Failure,则返回 TaskStatus.Success。 不改变 TaskStatus.Continue

.Sequence() .ReturnSuccess() .Do(() => { return TaskStatus.Failure; }) .End() .End()

返回失败

如果子节点返回 TaskStatus.Success,则返回 TaskStatus.Failure。 不改变 TaskStatus.Continue

.Sequence() .ReturnFailure() .Do(() => { return TaskStatus.Success; }) .End() .End()

永远重复

无论子节点返回什么状态,都返回 TaskStatus.Continue。这个装饰器(及其所有后代任务)可以通过调用 BehaviorTree.Reset() 来中断。

.Sequence() .RepeatForever() .Do(() => { return TaskStatus.Success; }) .End() .End()

重复直到失败

如果子节点返回 TaskStatus.Failure,则返回 TaskStatus.Failure,否则返回 TaskStatus.Continue

.Sequence() .RepeatUntilFailure() .Do(() => { return TaskStatus.Success; }) .End() .End()

重复直到成功

如果子节点返回 TaskStatus.Success,则返回 TaskStatus.Success,否则返回 TaskStatus.Continue

.Sequence() .RepeatUntilSuccess() .Do(() => { return TaskStatus.Success; }) .End() .End()

创建可重用的行为树

只需几行代码就可以组合树。这允许你创建可注入的行为树,将不同的节点捆绑在一起,用于复杂的功能,如搜索或攻击。

请注意,拼接树需要为注入构建一个新树,因为节点只在 .Build() 时进行深度复制。

using CleverCrow.Fluid.BTs.Trees; using CleverCrow.Fluid.BTs.Tasks; using UnityEngine; public class MyCustomAi : MonoBehaviour { private BehaviorTree _tree; private void Awake () { var injectTree = new BehaviorTreeBuilder(gameObject) .Sequence() .Do("自定义动作", () => { return TaskStatus.Success; }) .End(); _tree = new BehaviorTreeBuilder(gameObject) .Sequence() .Splice(injectTree.Build()) .Do("自定义动作", () => { return TaskStatus.Success; }) .End() .Build(); } private void Update () { // 每帧更新我们的树 _tree.Tick(); } }

创建自定义可重用节点

Fluid Behavior Tree 的强大之处在于你可以编写自己的节点并将它们添加到构建器中,而无需编辑任何源代码。你甚至可以创建添加新构建器功能的 Unity 包。例如,我们可以用几行代码编写一个新的树构建器方法,如下所示,它设置了 AI 系统的目标。

var tree = new BehaviorTreeBuilder(gameObject) .Sequence() .AgentDestination("查找敌人", target) .Do(() => { // 激活追击敌人代码 return TaskStatus.Success; }) .End() .Build();

你的第一个自定义节点和扩展

创建你的第一个自定义动作并实现它应该只需要大约 3 分钟。首先创建一个新的动作。

using CleverCrow.Fluid.BTs.Tasks; using CleverCrow.Fluid.BTs.Tasks.Actions; using UnityEngine; using UnityEngine.AI; public class AgentDestination : ActionBase { private NavMeshAgent _agent; public Transform target; protected override void OnInit () { _agent = Owner.GetComponent<NavMeshAgent>(); } protected override TaskStatus OnUpdate () { _agent.SetDestination(target.position); return TaskStatus.Success; } }

接下来,我们需要用新的 AgentDestination 动作扩展 BehaviorTreeBuilder 脚本。有关 C# 类扩展的更多信息,请参阅官方文档

using CleverCrow.Fluid.BTs.Trees; public static class BehaviorTreeBuilderExtensions { public static BehaviorTreeBuilder AgentDestination (this BehaviorTreeBuilder builder, string name, Transform target) { return builder.AddNode(new AgentDestination { Name = name, target = target, }); } }

现在你完成了!你已经创建了一个自定义动作和可扩展的行为树构建器,它可以适应未来的版本。以下示例将更多地涉及相同的内容。但每个示例都涵盖了不同的节点类型。

自定义动作

你可以使用以下模板创建自己的自定义动作。这对于捆绑你经常使用的代码非常有用。

using UnityEngine; using CleverCrow.Fluid.BTs.Tasks; using CleverCrow.Fluid.BTs.Tasks.Actions; public class CustomAction : ActionBase { // 仅在首次运行此节点时触发(非常适合缓存数据) protected override void OnInit () { } // 每次该节点开始运行时触发。如果该节点上次返回TaskStatus.Continue则不会触发 protected override void OnStart () { } // 每次在树上调用`Tick()`并运行该节点时触发 protected override TaskStatus OnUpdate () { // 指向拥有行为树的GameObject Debug.Log(Owner.name); return TaskStatus.Success; } // 每当该节点运行后退出时触发 protected override void OnExit () { } }

将你的新节点添加到扩展中。

using CleverCrow.Fluid.BTs.Trees; public static class BehaviorTreeBuilderExtensions { public static BehaviorTreeBuilder CustomAction (this BehaviorTreeBuilder builder, string name = "My Action") { return builder.AddNode(new CustomAction { Name = name, }); } }

自定义条件

可以使用以下示例模板添加自定义条件。你会想要使用这些来进行诸如视线、AI是否可以移动到某个位置等需要复杂检查的任务。

using UnityEngine; using CleverCrow.Fluid.BTs.Tasks; public class CustomCondition : ConditionBase { // 仅在该节点首次运行时触发(非常适合缓存数据) protected override void OnInit () { } // 每次该节点开始运行时触发。如果该节点上次返回TaskStatus.Continue则不会触发 protected override void OnStart () { } // 每次在树上调用`Tick()`并运行该节点时触发 protected override bool OnUpdate () { // 指向拥有行为树的GameObject Debug.Log(Owner.name); return true; } // 每当该节点运行后退出时触发 protected override void OnExit () { } }

使用以下代码片段将新条件添加到你的行为树构建器中。

using CleverCrow.Fluid.BTs.Trees; public static class BehaviorTreeBuilderExtensions { public static BehaviorTreeBuilder CustomCondition (this BehaviorTreeBuilder builder, string name = "My Condition") { return builder.AddNode(new CustomCondition { Name = name, }); } }

自定义组合器

Fluid Behavior Tree不仅限于自定义操作和条件。你可以使用相当简单的API创建新的组合器类型。以下是一个基本序列的示例。

using CleverCrow.Fluid.BTs.TaskParents.Composites; using CleverCrow.Fluid.BTs.Tasks; public class CustomSequence : CompositeBase { protected override TaskStatus OnUpdate () { for (var i = ChildIndex; i < Children.Count; i++) { var child = Children[ChildIndex]; var status = child.Update(); if (status != TaskStatus.Success) { return status; } ChildIndex++; } return TaskStatus.Success; } }

将自定义组合器添加到你的行为树就像添加操作一样简单。只需一行代码。

using CleverCrow.Fluid.BTs.Trees; public static class BehaviorTreeBuilderExtensions { public static BehaviorTreeBuilder CustomSequence (this BehaviorTreeBuilder builder, string name = "My Sequence") { return builder.ParentTask<CustomSequence>(name); } }

自定义装饰器

装饰器也可以自定义编写以减少重复代码。

using CleverCrow.Fluid.BTs.Decorators; using CleverCrow.Fluid.BTs.Tasks; public class CustomInverter : DecoratorBase { protected override TaskStatus OnUpdate () { if (Child == null) { return TaskStatus.Success; } var childStatus = Child.Update(); var status = childStatus; switch (childStatus) { case TaskStatus.Success: status = TaskStatus.Failure; break; case TaskStatus.Failure: status = TaskStatus.Success; break; } return status; } }

实现装饰器与组合器类似。如果你需要在组合器上设置参数,你会想要查看BehaviorTreeBuilder.AddNodeWithPointer()方法。

using CleverCrow.Fluid.BTs.Trees; public static class BehaviorTreeBuilderExtensions { public static BehaviorTreeBuilder CustomInverter (this BehaviorTreeBuilder builder, string name = "My Inverter") { // 如果你需要从参数设置自定义组合器数据,请参见BehaviorTreeBuilder.AddNodeWithPointer() return builder.ParentTask<CustomInverter>(name); } }

格式化问题

如果你使用自动格式化工具,它可能会破坏构建器语法的代码格式。要避免这种情况,你可以在JetBrains Rider中关闭格式化,如下所示。如果你需要特定的IDE,搜索特定的格式化禁用注释应该不难。

// @formatter:off _tree = new BehaviorTreeBuilder(gameObject) .Sequence() .Condition("Custom Condition", () => { return true; }) .Do("Custom Action", () => { return TaskStatus.Success; }) .End() .Build(); // @formatter:on

每日构建

要访问包管理器友好的develop每日构建,你需要手动编辑你的Packages/manifest.json,如下所示。

{ "dependencies": { "com.fluid.behavior-tree": "https://github.com/ashblue/fluid-behavior-tree.git#nightly" } }

请注意,要获取更新的每日构建,你必须删除此行以及清单中任何相关的锁定数据,让Unity重新构建,然后再添加回来。因为Unity会锁定Git url作为包的提交哈希。

开发环境

如果你希望运行开发环境,你需要安装node.js。然后在根目录下运行以下命令一次:

npm install

如果你想创建构建,在根目录运行npm run build,它会填充dist文件夹。

提交代码

所有的提交都应该使用Commitizen(运行npm install时会自动安装)。提交会在发布时自动编译为版本号,所以这一点非常重要。没有使用Commitizen的提交的PR将会被拒绝。

要进行提交,在根目录的终端中输入以下命令:

npm run commit

拉取请求 / 贡献

请查看贡献指南文档以获取更多信息。

贡献者荣誉

感谢这些优秀的人(表情符号说明):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <table> <tbody> <tr> <td align="center" valign="top" width="14.28%"><a href="http://blueashes.com"><img src="https://avatars2.githubusercontent.com/u/643307?v=4?s=100" width="100px;" alt="Ash Blue"/><br /><sub><b>Ash Blue</b></sub></a><br /><a href="https://github.com/ashblue/fluid-behavior-tree/commits?author=ashblue" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://jesse.tg"><img src="https://avatars0.githubusercontent.com/u/1175189?v=4?s=100" width="100px;" alt="Jesse Talavera-Greenberg"/><br /><sub><b>Jesse Talavera-Greenberg</b></sub></a><br /><a href="https://github.com/ashblue/fluid-behavior-tree/commits?author=JesseTG" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/PureSaltProductions"><img src="https://avatars1.githubusercontent.com/u/52610924?v=4?s=100" width="100px;" alt="PureSaltProductions"/><br /><sub><b>PureSaltProductions</b></sub></a><br /><a href="#userTesting-PureSaltProductions" title="User Testing">📓</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/mduvergey"><img src="https://avatars2.githubusercontent.com/u/18513379?v=4?s=100" width="100px;" alt="Martin Duvergey"/><br /><sub><b>Martin Duvergey</b></sub></a><br /><a href="https://github.com/ashblue/fluid-behavior-tree/issues?q=author%3Amduvergey" title="Bug reports">🐛</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/call-stack"><img src="https://avatars1.githubusercontent.com/u/38575304?v=4?s=100" width="100px;" alt="call-stack"/><br /><sub><b>call-stack</b></sub></a><br /><a href="https://github.com/ashblue/fluid-behavior-tree/issues?q=author%3Acall-stack" title="Bug reports">🐛</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/piotr-j"><img src="https://avatars.githubusercontent.com/u/2499728?v=4?s=100" width="100px;" alt="Piotr Jastrzebski"/><br /><sub><b>Piotr Jastrzebski</b></sub></a><br /><a href="https://github.com/ashblue/fluid-behavior-tree/commits?author=piotr-j" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/hookSSi"><img src="https://avatars.githubusercontent.com/u/12372136?v=4?s=100" width="100px;" alt="Sounghoo"/><br /><sub><b>Sounghoo</b></sub></a><br /><a href="https://github.com/ashblue/fluid-behavior-tree/commits?author=hookSSi" title="Code">💻</a></td> </tr> <tr> <td align="center" valign="top" width="14.28%"><a href="https://github.com/TNThomas"><img src="https://avatars.githubusercontent.com/u/9881915?v=4?s=100" width="100px;" alt="TNThomas"/><br /><sub><b>TNThomas</b></sub></a><br /><a href="https://github.com/ashblue/fluid-behavior-tree/issues?q=author%3ATNThomas" title="Bug reports">🐛</a> <a href="https://github.com/ashblue/fluid-behavior-tree/commits?author=TNThomas" title="Code">💻</a></td> </tr> </tbody> </table> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END -->

本项目遵循 all-contributors 规范。欢迎任何形式的贡献!

贡献者 ✨

感谢这些优秀的人们(表情符号说明):

<!-- ALL-CONTRIBUTORS-LIST:START - 请勿删除或修改此部分 --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END -->

本项目遵循 all-contributors 规范。欢迎任何形式的贡献!

编辑推荐精选

问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多