AgentOS 扩展
AgentOS的扩展源代码——工具,频道适配器,集成,和启动器模板.
这个软件包是什么
此软件包包含 实际执行源代码 agentOS 扩展名 :
telegram 适配器、网络搜索工具、语音提供者、浏览器自动化、频道适配器
37个平台,还有更多 还有船 启动模板 (单位:千美元)templates/用于创建
从零开始新的扩展 .
这不是一个注册. 登记目录的是源代码。 关系 两个兄弟包之间是:
| 软件包 | 作用 |
|---|---|
@framers/agentos-extensions (本套装) | 执行源代码、清单和模板 |
@framers/agentos-extensions-registry | 引用此软件包元数据并曝光的目录/ SDK createCuratedManifest() |
依赖方向 : agentos-extensions-registry 取决于来自此软件包的元数据,
而不是反过来。 这里的扩展是自成一体的,可以单独安装
没有登记.
已发布扩展
所有扩展都发布到 npm 下 @framers 范围.
扩展
频道适配器
双Tier 扩展模式
AgentOS扩展被组织成两个层次,具有不同的版本和 释放策略 :
核心扩展( Monorepo 根)
7个基础包生活在下方的单列波根 packages/agentos-ext-*数字 :
| 软件包 | 说明 |
|---|---|
agentos-ext-code-safety | 静态代码分析护栏(注射、XSS、秘密) |
agentos-ext-pii-redaction | PII 检测和重排管道,采用拒绝模式(onDetect: 'refuse')和两种接触类型(街道地址,社交手柄),只有在命名时它才会发现 |
agentos-ext-grounding-guard | 索赔提取和源码核查 |
agentos-ext-ml-classifiers | 内容分类:一种当地英国毒性模型(毒伯特),以LLM判断器或关键词模式为倒置;a /moderation 在您选择的裁判模型上设置一个 openAI 中度守护和行为分类器的入口 |
agentos-ext-topicality | 专题漂移检测和专题外过滤 |
agentos-ext-http-api | 用于代理OS的 HTTP API 服务器 |
agentos-ext-skills | 技能加载和执行工具 |
每个版本都是自行版,由出版工作流程发布至npm 保存它的数据库, 推到更改文件的仓库主控器 包裹船。 这里的版本凸起 没有 影响所编译的扩展版本.
解析扩展( 此子模块)
里面的软件包 registry/curated/ 是完整扩展目录:频道
适配器,集成,研究工具,媒体工具等. 每个版本
每日发行(协调世界时10:17)出版每套节目
已运出的文件更改于 master 自上次公布以来相关内容) (中文(简体) ).
为什么是两层?
- 核心扩展 是安全的关键护栏和基本基础设施. 他们需要独立的铸币局来发出信号 打破变化而不强迫一个全目录 释放。 他们的CI运行在每一个 PR到单列波根.
- 允许的扩展 是更广泛的目录。 释放他们 对齐相互依存关系:当软件包的新版本离开依赖关系时 范围,同样的运行会提高这个范围,并公布依赖者.
保安员住在哪里?
这个 registry/curated/safety/ 目录包含 断面读取器 指着
单列波根的犬科核心包。 代码安全的实际源代码,
pii-redaction, 和基地警卫生活 完全在 packages/agentos-ext-* 时间
单发根。 ml 分类符和专题包在此有副本; npm
从根包收到两者,直到
问题121 移动他们的
在这里释放。 ml 分类器复制件比 npm 上的包要老: 它没有
/moderation 进入点.
有两个护卫员只住在这里 从这个仓库发布:
content-policy-rewriter 财务报告和审定财务报表 self-harm-referral。 。 。 .
仓库结构
agentos-extensions/
├── .github/workflows/ # CI, release, TypeDoc pages
├── logos/ # Branding assets
├── templates/ # Starter templates for new extensions
│ ├── basic-tool/ # Single tool template
│ ├── multi-tool/ # Multiple tools template
│ ├── guardrail/ # Safety/compliance template
│ └── workflow/ # Multi-step process template
├── registry/
│ ├── curated/ # Official & verified extensions
│ │ ├── auth/ # Authentication & subscriptions
│ │ ├── channels/ # Messaging & social channels (37 platform packs)
│ │ ├── communications/# Telegram bot, notifications
│ │ ├── integrations/ # External services (Telegram API)
│ │ ├── media/ # Giphy, image search, voice synthesis
│ │ ├── meetings/ # Browser-join meeting bot provider (Google Meet, Microsoft Teams)
│ │ ├── provenance/ # On-chain anchoring (tip-ingestion package is published separately)
│ │ ├── research/ # Web search, deep research, content extraction
│ │ ├── safety/ # Stub READMEs -> core packages (see above)
│ │ ├── system/ # CLI executor, browser automation, credential vault
│ │ ├── voice/ # Twilio, Telnyx, Plivo voice providers
│ │ └── productivity/ # Google Calendar, Gmail
│ └── community/ # Community-contributed extensions
├── scripts/ # Registry build & scaffolding tools
├── registry.json # generated by pnpm run build; the published catalog ships in the npm package
├── pnpm-workspace.yaml # Workspace packages for publishing
└── typedoc.json # API docs config
快速启动
安装登记册(建议)
通过主管登记册立即装入所有扩展 :
npm install @framers/agentos-extensions-registry
import { AgentOS } from '@framers/agentos';
import { createCuratedManifest } from '@framers/agentos-extensions-registry';
const manifest = await createCuratedManifest({
tools: 'all',
channels: 'none',
secrets: {
'serper.apiKey': process.env.SERPER_API_KEY!,
'giphy.apiKey': process.env.GIPHY_API_KEY!,
},
});
const agentos = new AgentOS();
await agentos.initialize({ extensionManifest: manifest });
只有安装了 npm 包的扩展包才会加载——缺失的包会默地跳出.
安装单个扩展
npm install @framers/agentos-ext-web-search
import { AgentOS } from '@framers/agentos';
import webSearch from '@framers/agentos-ext-web-search';
const agentos = new AgentOS();
await agentos.initialize({
extensionManifest: {
packs: [{
factory: () => webSearch({ /* config */ })
}]
}
});
扩展如何保持可选和懒惰
延伸表面由四层依附注入. 每层都是默认的选入,因此安装了5个扩展的主机不支付其他95个的开销,而需要110MB NER模型的扩展机直到第一次呼叫才加载.
第1层:包装所有门
每个扩展都是自己的npm包. 在你之前没有进口的东西 npm install 这个 这个 @framers/agentos-extensions-registry SDK依赖于扩展包,作为 peerDependenciesMeta.optional,因此,单独安装注册就可以在不提取任何扩展源的情况下提供目录元数据。 添加 @framers/agentos-ext-pii-redaction 给您的 package.json 登记者看见它,就把它取出,登记者就把它扔在下一个显示的建筑物上.
第2层:登记解决跳过未安装的软件包
createCuratedManifest() 电话 import.meta.resolve() 在每条目录条目上,先添加到清单中。 如果决议抛出,则省略条目. 跑步时间永远看不到它。 没有错误,没有警告,没有缺少模块崩溃。 这是目录(metadata)和只发出可以实际运行的包的注册的区别.
// Even if you ask for `tools: 'all'`, only installed packages reach the runtime.
const manifest = await createCuratedManifest({ tools: 'all' });
// → manifest.packs contains only @framers/agentos-ext-* packages found on disk.
第3层: requiredSecrets 门描述符激活
在一个包内,每个描述器(单个工具、护栏、信道或工作流程)可以声明 requiredSecrets启动前, ExtensionManager 检查每个非选择性秘密是否可从秘密商店、包选项或环境中解开。 少了一个秘密? 描述符被跳过,其余的包仍然激活. 可选的秘密解锁可选特性(如PII编辑扩展的LLM-judge level)而不要求它们.
// pii-redaction declares its LLM judge as an optional dependency.
{
id: 'pii_judge_resolver',
kind: 'tool',
requiredSecrets: [{ id: 'anthropic.apiKey', optional: true }],
// ...
}
// No ANTHROPIC_API_KEY in env? The judge is skipped, the rest of the pack works.
第4层: SharedServiceRegistry.getOrCreate() 推迟大量资源
ML模型,嵌入索引,ONNX运行时间,NER管道,以及数据库池在激活时不被加载. 它们注册为工厂,只有在需要它们的第一个电话时才能建造。 同一实例在同一包中由描述者共享,(带有一个命名空间键)在包中共享.
async onActivate(ctx) {
// The 110MB BERT NER model. Not loaded yet.
const nerModel = await ctx.services.getOrCreate('pii:ner-model', async () => {
const { NerModel } = await import('./NerModel.js');
return NerModel.load();
});
this.scanTool.setNerModel(nerModel);
this.streamingGuardrail.setNerModel(nerModel);
}
这个 import('./NerModel.js') 是一个动态导入:模型文件本身不会输入模块图,直到有东西要求服务。 第一次呼叫支付负载费用;随后的呼叫击中了缓存. 泪下释放出一切 通过注册的生命周期.
这对护栏来说是怎样的
主机安装 @framers/agentos-ext-pii-redaction数字 :
- 安装.
npm install @framers/agentos-ext-pii-redaction @framers/agentos-extensions-registry @framers/agentos没有别的. - 立体建设.
createCuratedManifest({ tools: 'all' })仅解析已安装的 PII 包并发出单包清单. - 起动.
ExtensionManager.loadManifest()运行pack.onActivate(ctx),用于登记 apii:ner-model工厂SharedServiceRegistry。模型文件没有被载入. - 说明性登记. 两个工具描述符( :
pii_scan, (中文(简体) ),pii_redact在具体种类的登记册中有一个护栏说明地。 护栏描述器config.canSanitize = true财务报告和审定财务报表config.evaluateStreamingChunks = true标记它为两相调度器. - 初请. 用户信息点击输入管道. 两相调度器依次运行 第1相:PII护栏
evaluateInput()火,呼叫NER输油管, 模型负载在这第一个呼叫。 随后的请求击中了缓存模型. - 流出输出. 由于模型生成一个响应,每个
TEXT_DELTA块通过护栏evaluateOutput()。调度器返回SANITIZE以编辑文本确定结果(第1阶段链相继),然后将所有第2阶段的分类器平行运行,以便进行任何剩余的检查. - 泪倒.
pack.onDeactivate(ctx)关闭时按倒序运行。 共享服务登记处发布该模式.
其它四个护栏包也开始使用, 各自以自己的方式: @framers/agentos-ext-ml-classifiers 进口一种ONNX型号Xenova/toxic-bert在护栏的第一个分类, @framers/agentos-ext-grounding-guard 懒惰地装入NLI管道, @framers/agentos-ext-topicality 在其检查的第一个输入上导入其嵌入模型 @framers/agentos-ext-code-safety 仅使用正则且不支付负载费用。 分类器和专题包中没有工厂 SharedServiceRegistry因此,上述登记册步骤不适用于其模型.
这个自动发现的表面是运行时被探测的工具加入的: 一个在会话 N 中创建函数的代理可以通过 SkillExporter 改为 a SKILL.md 登记册在下一个进程开始时接应。 铸造会长出地表中跑;自动发现船作为一等能.
关于调度机械(第1阶段消毒器、第2阶段平行分级器、最坏动作汇总、中流重置),见 护栏关于生命周期内部,见 扩展加载。 。 。 .
书记官处备选方案
createCuratedManifest() 接受:
| 选项 | 类型 | 默认 | 说明 |
|---|---|---|---|
tools | string[] | 'all' | 'none' | 'all' | 要启用哪个工具扩展 。 通过一系列名称(例如:. ['web-search', 'giphy']有选择地装入. |
channels | ChannelPlatform[] | 'all' | 'none' | 'all' | 要启用哪些消息通道 . |
secrets | Record<string, string> | {} | API 密钥和令牌. 回到环境变量. |
logger | RegistryLogger | console | 自定义日志( E)info, (中文(简体) ), warn, (中文(简体) ), error, (中文(简体) ), debug 方法问题. |
basePriority | number | 0 | 所有扩展的基数优先级 . |
overrides | Record<string, ExtensionOverrideConfig> | —— 说 | 每段扩展覆盖 enabled, (中文(简体) ), priority,以及 options。 。 。 . |
密钥
| 秘密身份证 | 环境变量 | 延长 |
|---|---|---|
serper.apiKey | SERPER_API_KEY | 网络搜索 |
serpapi.apiKey | SERPAPI_API_KEY | 网络搜索 |
brave.apiKey | BRAVE_API_KEY | 网络搜索 |
giphy.apiKey | GIPHY_API_KEY | 绿色 |
omdb.apiKey | OMDB_API_KEY | 页:1 |
clearbit.apiKey | CLEARBIT_API_KEY | 清除 |
elevenlabs.apiKey | ELEVENLABS_API_KEY | 语音合成 |
pexels.apiKey | PEXELS_API_KEY | 图像搜索 |
unsplash.apiKey | UNSPLASH_ACCESS_KEY | 图像搜索 |
pixabay.apiKey | PIXABAY_API_KEY | 图像搜索 |
newsapi.apiKey | NEWSAPI_API_KEY | 新闻搜索 |
telegram.botToken | TELEGRAM_BOT_TOKEN | 频道图 |
discord.botToken | DISCORD_BOT_TOKEN | 频道分解 |
slack.botToken | SLACK_BOT_TOKEN | 频道黑 |
slack.appToken | SLACK_APP_TOKEN | 频道黑 |
twitter.bearerToken | TWITTER_BEARER_TOKEN | 频道 - 推特 |
twitter.apiKey | TWITTER_API_KEY | 频道 - 推特 |
twitter.apiSecret | TWITTER_API_SECRET | 频道 - 推特 |
twitter.accessToken | TWITTER_ACCESS_TOKEN | 频道 - 推特 |
twitter.accessSecret | TWITTER_ACCESS_SECRET | 频道 - 推特 |
instagram.accessToken | INSTAGRAM_ACCESS_TOKEN | 频道内插图 |
linkedin.accessToken | LINKEDIN_ACCESS_TOKEN | 频道链接 |
facebook.accessToken | FACEBOOK_ACCESS_TOKEN | 频道相册 |
threads.accessToken | THREADS_ACCESS_TOKEN | 频道线索 |
bluesky.handle | BLUESKY_HANDLE | 频道蓝天 |
bluesky.appPassword | BLUESKY_APP_PASSWORD | 频道蓝天 |
mastodon.accessToken | MASTODON_ACCESS_TOKEN | 频道- 大调 |
farcaster.neynarApiKey | FARCASTER_NEYNAR_API_KEY | 频道显示器 |
farcaster.signerUuid | FARCASTER_SIGNER_UUID | 频道显示器 |
lemmy.instanceUrl | LEMMY_INSTANCE_URL | 频道lemmy |
lemmy.username | LEMMY_USERNAME | 频道lemmy |
lemmy.password | LEMMY_PASSWORD | 频道lemmy |
google.accessToken | GOOGLE_ACCESS_TOKEN | 频道谷歌业务 |
reddit.clientId | REDDIT_CLIENT_ID | 频道编辑 |
reddit.clientSecret | REDDIT_CLIENT_SECRET | 频道编辑 |
reddit.username | REDDIT_USERNAME | 频道编辑 |
reddit.password | REDDIT_PASSWORD | 频道编辑 |
youtube.apiKey | YOUTUBE_API_KEY | 频道-youtube |
pinterest.accessToken | PINTEREST_ACCESS_TOKEN | 频道兴趣 |
tiktok.accessToken | TIKTOK_ACCESS_TOKEN | 频道tiktok |
email.smtpHost | SMTP_HOST | 频道电子邮件 |
email.smtpUser | SMTP_USER | 频道电子邮件 |
email.smtpPassword | SMTP_PASSWORD | 频道电子邮件 |
email.resendApiKey | RESEND_API_KEY | 频道电子邮件 |
选择性加载示例
// Only web search and giphy, no channels
const manifest = await createCuratedManifest({
tools: ['web-search', 'giphy'],
channels: 'none',
});
// Only Telegram and Discord channels, all tools
const manifest = await createCuratedManifest({
channels: ['telegram', 'discord'],
tools: 'all',
secrets: {
'telegram.botToken': process.env.TELEGRAM_BOT_TOKEN!,
'discord.botToken': process.env.DISCORD_BOT_TOKEN!,
},
});
// Override specific extension options
const manifest = await createCuratedManifest({
tools: 'all',
channels: 'none',
overrides: {
'web-search': { priority: 10 },
'cli-executor': { enabled: false },
},
});
创建新扩展名
# Copy the template, then give the copy its name, its role and its own CHANGELOG.md,
# as CONTRIBUTING.md's "Adding an extension pack" says
cp -r templates/basic-tool registry/curated/category/my-extension
cd registry/curated/category/my-extension
pnpm install
pnpm run dev
发布和出版
在协调世界时10点17分,当可放送的更改合并到 master:它发布自Npm上最新版本以来其运出文件变化的每个软件包,来自所建立和测试的柏球CI,并在GitHub上标记并发布每个版本. 合并本身没有发表任何内容。 要马上释放,跑 gh workflow run release.yml --repo framerslab/agentos-extensions --ref master (编) -f dry_run=true ),或动作、发布和发布、运行工作流程。 通过 npm 信任的出版方式从 GitHub Actions 发布新版本,并附有出处声明;如 ReLEASSING.md所描述,新包的第一个版本通过符号发布. 没有人会写一个变换器或发布注释:合并的拉取请求的标题是注释. 见 相关内容 整个工作流程.
TL; DR 数据
# 1. Change one or more extensions on a branch, and open a pull request titled in
# the Conventional Commits form: fix(web-search): ..., or feat(web-search)!: ...
# for a change that breaks users: a minor in place of a patch below 1.0.0;
# at 1.0.0 or above CI refuses the mark until package.json names the next major
# 2. Read the summary of CI's step "The packages this push would publish":
# each package the merge publishes, with its version and the reason
# 3. Merge it: the next daily release (10:17 UTC) publishes those packages to
# npm, tags each version <name>@<version> and makes its GitHub release
# (gh workflow run release.yml --ref master releases at once)
每个扩展版本都是独立版并发布. 更改为 web-search 不颠倒 telegram。 。 。 .
命名公约
| 类型 | 图案 | 示例 |
|---|---|---|
| 延长 | @framers/agentos-ext-{name} | @framers/agentos-ext-web-search |
| 模板 | @framers/agentos-template-{type} | @framers/agentos-template-basic-tool |
排雷中心/发改委
所有扩展通过 GitHub 动作获得免费 CI/CD :
- 中情局 (单位:千美元)
ci.yml:计划推动将公布的内容(scripts/release-plan.mjs),构建AgentOS核心和每包,运行放出标注测试和每包的测试,并在计划中的包上运行包护,每个拉出请求 - 释放 (单位:千美元)
release.yml:每日运行时间为协调世界时10:17和人工操作;当无事可回时,一个闸门会以几秒钟结束运行,否则运行CImaster'头,然后发布为更改的软件包所测试的 tarballs CI,标记每个版本,使其 GitHub 发布,并写入图像的版本标签 - 类型文件 (单位:千美元)
pages-typedoc.yml: API 文件部署到 framerslab.github.io/ 剂-外延 推动到master,一次一次部署: 开始的部署一直持续到尾声, 在等待中着陆的推力, 最后的推力来代替任何仍在等待的早先的推力 - 锁定文件 (单位:千美元)
lockfile.yml:解决工作空间的依赖范围与提供pnpm-lock.yaml作为犯罪文物,用手管理其分支package.json文件已更改 - 会见机器人图像 (单位:千美元)
meeting-bot-image.yml: 构建浏览器会合bot的容器图像,并对每个触摸到的牵引请求进行寿命周期测试registry/curated/meetings/browser/,并将图像从master; 机器人的夜行真实相接检查(nightly-real-join.yml日常和手工操作,及其对工人的能力测量(measure-meeting-bots.yml只有手,因为 包的读取器 描述 - 文档解析图像 (单位:千美元)
document-parser-image.yml: 构建文档解析器的容器图像,并运行其寿命周期测试,以触摸到的拉出请求registry/curated/tools/document-parser/或者说pnpm-lock.yaml,一旦它准备好审查,并在推动master将测试的图像推向GHCRghcr.io/framerslab/agentos-document-parser:sha-<commit>; 发布工作流程标记一个已发布的版本的图像:<version>,作为 发行指南 财务报告和审定财务报表 包的读取器 说明.document-parser.yml在CI的22号节点之外,当拉出请求或推出master抚摸包子,pnpm-lock.yaml或者说pnpm-workspace.yaml - 依赖破坏: 每周的依赖性更新.
dependabot-auto-merge.yml标签 npm 次要或补丁更新landing,并张贴一个评论 头部承诺 命名警卫 通过,当CI'sbuild检查和links检查已经成功, 没有其他工作流程检查尚未完成或失败(通过时已忽略和中性计数), 每一份承诺都是Depabot的, 其审查线索已经解决, 自上次推动以来已经过了10分钟。 它永远不会合并:一个标签更新的地块,一旦它关于GitHub的评论被读取,那些命名为失败输入的地块固定了,其余的回答,它的线程解决了. 它再次决定何时请求更新的CI或Links运行,何时开始或完成,何时提交审查或对其diff发表评论,以及每个小时;当一推动头部或后卫失败时,它就会取出所添加的标签,一个标签的维护者会添加,取出或放回停留. 解决或重新打开的线程不会发出任何工作流程能够承受的事件,所以下一个运行会决定它;一个着陆会等待每个线程得到解决,无论标签上怎么说. 主要更新, GitHub Actions 更新, 以及一个拉出请求, 其头下输入消息的名称与其标题不同( 重下架后留下的旧更新) 等待维护者 。 决定是scripts/dependabot-merge-lib.mjs。依赖更新pnpm-lock.yaml与pnpm的minimumReleaseAge三天;pnpm-workspace.yaml豁免@framers/*周发的针头bump-framers-deps.yml)移动到最新的发布,而出走的出走在Deptabot的更新之前打开了它的拉出请求
质量标准
所有扩展
- 严格模式的脚本
-
80%的测试覆盖率
- Apache 2.0 许可证
- 没有硬密码的秘密
用于Curted 的额外
- 专业守则审查
- 业绩基准
- 融合测试
- 移徙指南
文档
捐助和支助
| 指南 | 什麽 |
|---|---|
| 捐款 | 开发设置,增加一包,承诺信息和发布,拉出请求规则,审查线索,贡献许可 |
| 发行指南 | 每日发行的版本是什么 |
| 代理指令 | 编码代理人的命令和公约 |
| 维护者 | 由谁审查和合并更改 |
| 行为守则 | 社区标准 |
| 安全政策 | 私下报告脆弱性 |
| 支助 | 哪里去寻求帮助 |
链接
- 代理服务器数字 : (原始内容存档于2018-09-21). agentos.sh
- AgentOS GitHub 代理服务器数字 : github.com/framerslab/agentos (英语)
- 扩展名 GitHub数字 : github.com/framerslab/ 剂-外延
- 无数字 : @ framers (缩写)
- API 文档数字 : framerslab.github.io/ 剂-外延
- 解析器数字 : (原始内容存档于2018-09-21) (英语). wilds.ai/discord
- 网站数字 : 帧.dev
- 联系人数字 : 团队@frame.dev
许可证
此寄存器库中的所有扩展都是Apache 2. 0 许可.
由 框架
联系人 : 团队@frame.dev
