多个部署,一个配置文件

发布: (2026年3月5日 GMT+8 19:00)
7 分钟阅读
原文: Dev.to

Source: Dev.to

Cover image for Multiple Deployments, One Config File

Valentina

如果你在使用 AI 代理进行开发,通常不会只有一个。比如说你在构建一个线索聚合流水线。你可能有一个代理负责抓取公司网站,另一个代理从 LinkedIn 拉取线索,第三个代理则挖掘 Reddit 和社区论坛。他们共享相同的数据模型和评分逻辑,都按计划运行,并且都位于同一个代码仓库中。但每个代理都是独立部署的,因此每个代理都需要自己的 crewship.toml 和各自的部署命令,这会很快累积成负担。

这样可以工作,但相当笨拙。你会不断复制构建设置,保持排除列表同步,并且每次部署都要在不同目录之间切换。

我们一直从构建多代理系统的团队那里听到这种情况,老实说我们自己也遇到了同样的问题。于是我们对其进行了改进。

单文件,多部署

您现在可以在单个 crewship.toml 中定义多个部署。不要使用单个 [deployment] 部分,而是使用命名的 [deployments.<name>] 部分:

[build]
exclude = ["tests", "notebooks"]

[deployments.web-scraper]
framework = "crewai"
entrypoint = "leads.web_scraper.crew:WebScraperCrew"
profile = "browser"
python = "3.11"

[deployments.linkedin-miner]
framework = "crewai"
entrypoint = "leads.linkedin.crew:LinkedInCrew"

[deployments.reddit-miner]
framework = "crewai"
entrypoint = "leads.reddit.crew:RedditCrew"

每个命名的部分都会在 Crewship 上成为独立的部署,名称用作项目名称。[build] 配置在所有部署之间共享,因此您只需声明一次排除列表。

就这么简单。无需包装脚本、无需 monorepo 工具、也无需单独的目录。三个 lead 矿工,一个文件。

部署与目标

现在每个 CLI 命令都接受 --name(或 -n)标志,用于定位特定的部署:

crewship deploy --name web-scraper
crewship deploy --name linkedin-miner
crewship deploy --name reddit-miner

同样的标志也适用于环境变量、调用和计划任务。对于每个来源都有独立计划的主流水线,你可以这样做:

crewship env set --name linkedin-miner LINKEDIN_API_KEY=...
crewship env set --name reddit-miner REDDIT_CLIENT_ID=... REDDIT_CLIENT_SECRET=...

crewship schedule create --name web-scraper "Scrape targets" --cron "0 */6 * * *"
crewship schedule create --name linkedin-miner "LinkedIn sync" --cron "0 8 * * 1-5"
crewship schedule create --name reddit-miner "Reddit sweep" --cron "0 9 * * *"

如果省略 --name 且文件中只有一个部署,它会被自动选中。如果有多个部署,CLI 会提示你选择。在没有 TTY 的 CI 环境中,它会报错并要求显式传入 --name,以防你不小心部署了错误的内容。

部署 ID 按部署进行跟踪

首次部署后,Crewship 会将 deployment_id 写回每个部署的配置中:

[deployments.web-scraper]
framework = "crewai"
entrypoint = "leads.web_scraper.crew:WebScraperCrew"
deployment_id = "dep_abc123"   # 自动填充,首次部署后

[deployments.linkedin-miner]
framework = "crewai"
entrypoint = "leads.linkedin.crew:LinkedInCrew"
deployment_id = "dep_def456"   # 自动填充,首次部署后

这意味着后续部署能够准确知道要更新哪个部署,无需手动跟踪 ID。将该文件提交到版本控制,整个团队即可保持同步。

什么都不会出错

如果你已经有一个包含单个 [deployment] 部分的 crewship.toml,则不会有任何变化——旧格式仍然完全按之前的方式工作。新的多部署格式是可选的,crewship init 默认仍会生成单部署配置。

这两种格式互相排斥。如果你不小心在同一个文件中混用了 [deployment][deployments.*],CLI 会检测到并告诉你该如何处理。

当这很重要

Lead‑aggregator 设置是一个很好的例子,但该模式适用于任何代码共享但独立部署的代理。以下是一些自然的使用场景:

  • Monorepo without the mess – 代理共享评分逻辑、数据模型和工具。通过多部署,它们保持在同一个仓库和同一个配置文件中,而不是分散在不同项目中导致不同步。
  • Independent schedules – 每个来源都有自己的执行频率(例如,网页爬虫每 6 小时一次,LinkedIn 在工作日早晨,Reddit 每天一次)。使用 crewship schedule create --name 独立设置它们。
  • Gradual rollout – 每次部署一个矿工,验证其工作后再部署下一个。每次部署都有自己的版本历史和回滚路径。

入门

如果你是从零开始,crewship init 会创建一个单部署的配置。当你准备添加更多代理时,编辑文件以使用命名格式:

# Before
[deployment]
framework = "crewai"
entrypoint = "leads.web_scraper.crew:WebScraperCrew"

# After
[deployments.web-scraper]
framework = "crewai"
entrypoint = "leads.web_scraper.crew:WebScraperCrew"

[deployments.linkedin-miner]
framework = "crewai"
entrypoint = "leads.linkedin.crew:LinkedInCrew"

[deployments.reddit-miner]
framework = "crewai"
entrypoint = "leads.reddit.crew:RedditCrew"

现在你拥有一个整洁的 crewship.toml,它可以驱动所有代理。 🎉

`rew:LinkedInCrew`

Enter fullscreen mode
Exit fullscreen mode

部署它们,设置它们的环境变量,调用它们。其他一切保持不变。

完整细节请参阅配置文档。如果遇到任何问题或有反馈,请联系我们——我们想了解你是如何使用它的。

0 浏览
Back to Blog

相关文章

阅读更多 »