多个部署,一个配置文件
Source: Dev.to

如果你在使用 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
部署它们,设置它们的环境变量,调用它们。其他一切保持不变。
完整细节请参阅配置文档。如果遇到任何问题或有反馈,请联系我们——我们想了解你是如何使用它的。
