我们构建了一个代理运行时,其中任务是从配置编译的显式状态机
摘要
Friday Studio 是一个开源的代理运行时,它将自然语言工作流编译成显式的、版本控制的 YAML 状态机。它允许开发者通过聊天构建 AI 代理,但以稳定的配置文件形式部署,确保生产环境的可靠性。
查看缓存全文
缓存时间: 2026/05/08 10:18
friday-platform/friday-studio
来源:https://github.com/friday-platform/friday-studio
Friday Studio
CI (https://github.com/friday-platform/friday-studio/actions) · Discord (https://discord.gg/uczJyp5FMH)
Friday 将自然语言请求转化为可重复的、由 AI 驱动的工作流。你在聊天中描述需求——“每天早上,处理收件箱,起草回复,将真正的请求归档为 Linear 工单”——结果就是一个你可以阅读、版本管理、分享和定时运行的 workspace.yml。运行一次,或者永久运行。
为什么同时需要聊天和 YAML?
提示会退化。今天运行同一个提示,明天输出就变了;升级模型,旧的契约也会随之变化。Friday 保持了这个循环的两端:对话是你构建的方式,配置是你交付的方式——包括代理、MCP 工具、信号(HTTP、cron、Slack、邮件、webhook),以及将它们连接起来的工作。阅读文件,版本化管理,交给同事,在他们的机器上运行结果相同。两种界面,同一套运行环境:
- 在游乐场中聊天。 Friday 会识别你已安装的技能、MCP 服务器、记忆和 OAuth 凭证,并实际驱动你的工具,而不是仅仅描述它要做什么。
- 自主运行。 将模式捕获到
workspace.yml中,绑定到一个信号,守护进程就会在本地按时运行,并且可观测。
适用于那些希望在将代理投入生产的开发者和运维人员——凌晨3点审查 PR、站会前清空收件箱、监控竞品定价、将 Fathom 通话总结为 Linear 工单——而无需每次从头搭建队列、密钥存储、调度器、MCP 管道和提供商客户端。
想要打包好的版本?
hellofriday.ai (https://hellofriday.ai)
提供与上述相同的守护进程和游乐场的 macOS 一键安装包,
包含启动器、依赖项和托盘 UI。
本 README 的其余部分适用于在源码树内工作。
架构
| 组件 | 是什么 | 什么时候用 |
|---|---|---|
atlasd(守护进程) | 无头运行时 —— HTTP API(:8080)、工作空间生命周期、信号路由器、会话状态、JetStream 消息总线。 | 生产环境、CI、任何你希望用 systemd 管理的场景。 |
| Agent 游乐场 | SvelteKit Web UI(:5200)—— 与 Friday 聊天、编写和运行代理、逐步检查每个会话、管理技能/MCP 服务器/调度/记忆/凭证、浏览工作空间市场。 | 日常使用。游乐场是你实际看着的界面。 |
桌面安装包将两者放在一个托盘图标后面。在源码树内,deno task dev:playground 同时运行两者并支持热重载。
快速开始
前提条件
守护进程协调多个运行时环境——Friday 代理可以用 TypeScript 或 Python 编写,可以驱动真实的浏览器,并通过消息总线分发工作。先自行安装以下四个工具,然后 scripts/setup-dev-env.sh 处理其余部分。
你需要自行安装(我们不会动你的版本管理器):
| 工具 | 最低版本 | 原因 |
|---|---|---|
| Node.js (https://nodejs.org/) | 24+ | 游乐场通过 npx 在 Vite 下运行;@atlas/ui 使用 svelte-package 构建。通过 fnm/volta/nvm 管理——自动安装的系统版 Node 会破坏项目锁定。 |
| git (https://git-scm.com/) | 任意较新版本 | — |
setup-dev-env.sh 处理以下工具——如果缺失或低于最低版本则自动安装,否则保留你的版本:
| 工具 | 最低版本 | 原因 |
|---|---|---|
| Deno (https://deno.com/) | 2.7.0 | 运行守护进程、CLI、链接服务以及所有 TS/Svelte 包。 |
| Go (https://go.dev/) | 1.26.0 | 构建 tools/ 中的 Go 服务。macOS 通过 Homebrew 自动安装;Linux 会失败并显示安装 URL(未经同意不使用 sudo)。 |
| uv (https://docs.astral.sh/uv/) | 0.11.0 | 配置 type: "user" 代理的托管 Python 环境。 |
nats-server (https://nats.io/) | 2.12.0 | 守护进程为代理与守护进程间的 RPC 启动的内部消息总线。新安装固定为 v2.12.8。 |
agent-browser (https://www.npmjs.com/package/agent-browser) | latest | web 代理调用 CLI 进行无头浏览。首次运行会拉取约 150MB 的 Chromium 构建。 |
Python 3.12 + friday-agent-sdk | 固定版本 | 预先预热到 uv 缓存中,避免首次用户代理启动时冷启动。 |
Docker(可选)可以跳过以上所有步骤——docker compose up 在容器中运行整个堆栈。本地开发不需要单独的数据库——守护进程通过其嵌入式 JetStream 总线持久化状态。只有在 link 凭证服务的生产部署中才需要 Postgres。
1. 克隆并安装
git clone https://github.com/friday-platform/friday-studio
cd friday-studio
bash scripts/setup-dev-env.sh # 引导 deno+go+uv+nats+agent-browser,运行 deno install,预热 Python
setup-dev-env.sh 检查每个工具的版本是否满足上述最低要求,如果你的工具链满足条件则保留它们——自动安装仅针对缺失或过时的工具。它还会运行 deno install,写入守护进程环境文件,并预热 uv 缓存。当 tools/friday-launcher/paths.go 中固定的 friday-agent-sdk 版本更新时,请重新运行此脚本。
如果脚本以 ⚠ Skipped: 块结尾,请按照每个工具的提示操作并重新运行。常见情况:agent-browser 安装因系统 Node 版本问题失败——切换到用户范围的 Node 管理器(fnm/volta/nvm)并重新运行以启用 web/browser 代理。
2. 配置环境
cp .env.example .env
# 打开 .env,设置 ANTHROPIC_API_KEY(或其他提供商密钥)
示例文件记录了守护进程读取的所有变量——提供商密钥、代理、OAuth/GitHub App 凭证、集成令牌。运行真实代理的最低要求是至少一个 LLM 提供商密钥。
3. 运行游乐场(推荐)
一条命令,四个进程——守护进程、链接、游乐场和 webhook 隧道——全部支持热重载:
deno task dev:playground
打开 ,侧边栏提供所有功能:Agents 下的捆绑代理、MCP 服务器浏览器、技能、调度、记忆、工作空间检查器、设置。
4. (或者)仅运行守护进程
如果你只需要 API:
deno task atlas daemon start --detached
curl -sf http://localhost:8080/health && echo "守护进程正常"
deno task atlas daemon stop
示例
直接与它聊天
打开游乐场 。输入:
查找每封来自团队、等待回复且未读的邮件,总结每封邮件的询问内容,并起草回复。
Friday 使用你的 google-gmail MCP 服务器搜索收件箱,使用 LLM 代理进行分诊,并通过 Gmail 的 create_draft 工具将回复留在草稿文件夹中——根据已安装的工具进行选择。与聊天产品相同的界面,但操作实际执行。没有连接工具?在 MCP / Skills / Settings 中添加它们,然后再次提问——对话会继续。
CLI 是同样的界面,无头模式:
deno task atlas prompt "总结 friday-platform/friday-studio 最近的 10 个 PR"
deno task atlas chat --human # 可读的对话记录
将聊天提升为工作空间
当一次性聊天值得定期运行时,将你使用的代理和工具捕获到 workspace.yml 中,并绑定到一个信号。
HTTP —— 审查我打开的每个 PR:
git clone https://github.com/friday-platform/friday-studio-examples
deno task atlas workspace add ./friday-studio-examples/github-pr-reviewer
curl -X POST http://localhost:8080/review-pr \
-d '{"pr_url": "https://github.com/your-org/your-repo/pull/42"}'
该工作空间声明了一个 HTTP 信号路径 /review-pr、一个使用 gh MCP 服务器的 LLM 代理,以及一个限定于团队审查清单的系统提示。通过 webhook-tunnel 连接到 GitHub 以获取公共 URL。
Cron —— 9点前清空收件箱:
# workspace.yml
workspace: { name: inbox-zero }
signals:
- { id: morning, type: cron, schedule: "0 8 * * 1-5" }
agents:
- id: triage
type: llm
model: claude-sonnet-4-6
mcp: [gmail, linear]
prompt: |
读取未读 Gmail。真正的请求 → 创建带有 `inbox` 标签的 Linear 工单。
新闻通讯 → 归档。回复来自 的任何邮件。
jobs:
- { on: morning, run: triage }
运行 deno task atlas workspace add ./inbox-zero,cron 即生效。每天早晨的运行结果会出现在 Platform → inbox-zero → Sessions 中。
Web —— 监控竞品定价: 捆绑的 web 代理调用 agent-browser CLI,因此任何代理(聊天或工作空间)都可以驱动真实的 Chromium。使用 npm i -g agent-browser && agent-browser install 安装一次,然后绑定到一个每小时运行的 cron,并在价格变动时发布到 Slack。
跳过 YAML —— 用 Python 编写
对于机械性工作(此时 LLM 大材小用),声明为 type: "user" 的代理是一个 Python 文件,守护进程会在 uv 下生成它。代理通过 friday-agent-sdk 调用 LLM、HTTP 和 MCP 能力——编写指南、完整 API 和十个可运行示例位于 friday-platform/agent-sdk (https://github.com/friday-platform/agent-sdk)。
经验法则: 仅当每次调用的决策是机械性的(正则/模式/固定路由)时,才使用
type: "user"。对于需要 LLM 判断的任务,使用type: "llm"配合 MCP 工具。
在 friday-studio-examples (https://github.com/friday-platform/friday-studio-examples) 中浏览 github-digest、competitive-monitor、daily-operating-memo、jira-bugfix-bitbucket 等示例。
Agent 游乐场
deno task dev:playground 在 打开游乐场。它与桌面安装包提供的 Svelte 应用相同——生产 UI,而非调试部件。
包含的内容:
- Agents —— 捆绑代理(claude-code、gh、jira、hubspot、web、csv、knowledge、image-generation 等),支持一键执行和实时 SSE 流式传输。在同一界面构建自定义一次性代理(提供商、模型、系统提示、MCP 工具)。
- Workspaces / Inspector —— 加载
workspace.yml,查看解析后的信号/代理/任务图,运行完整管道(提示 → blueprint → FSM 编译 → 执行),并从磁盘重放每个步骤。 - *Platform → * —— 每个工作空间的会话、FSM 状态、每步的对话记录、工具调用、成本。
- MCP —— 向守护进程注册的每个 MCP 服务器,包含工具模式和“测试调用”面板。
- Skills —— 编写和编辑代理按需加载的 markdown 技能。
- Memory —— 每个工作空间累积的叙事记忆。
- Schedules —— 每个绑定 cron 的任务、上次/下次触发、手动触发。
- Discover —— 工作空间市场(浏览和安装社区工作空间)。
- Settings —— 模型链、OAuth、提供商密钥、环境。
CLI 模式(生成工作空间,无需 UI):
deno task sim "构建一个每日竞品价格摘要" # 完整管道
deno task sim "..." --stop-at=plan # 仅 blueprint
deno task sim "..." --stop-at=fsm # blueprint + FSM 编译
deno task sim "..." --real # 使用真实 MCP 代理执行
产物保存在 runs/workspaces/-/ 中——在游乐场的 Workspaces / History 标签页中重放它们。
常用命令
# 守护进程生命周期
deno task atlas daemon start --detached # 后台运行
deno task atlas:dev daemon start # 文件变更时自动重启
deno task atlas daemon status # 健康检查
deno task atlas daemon stop
# 与它对话
deno task atlas prompt "你的提示" # 一次性提示 → 捆绑的聊天工作空间
deno task atlas chat # 列出最近的聊天
deno task atlas chat --human # 可读的对话记录
# 开发
deno task typecheck # deno check + svelte-check
deno task lint # deno lint + biome check --write
deno task fmt # biome format --write
deno task test # vitest 单文件测试
Docker
想要全部放入容器?
docker compose up
启动守护进程、游乐场、link 凭证服务、PTY 服务器和 webhook 隧道。端口默认使用 1xxxx 以避免主机冲突——参见 docker-compose.yml。
项目结构
apps/
atlasd/ # 守护进程 —— HTTP API、工作空间生命周期、信号路由器
atlas-cli/ # CLI 入口 —— `deno task atlas`
link/ # 凭证 / OAuth 服务
ledger/ # 资源与活动存储服务
studio-installer/ # Tauri 桌面应用 —— 托盘、守护进程监控器、
# 自启动。hellofriday.ai 下载包。
packages/ # @atlas/* 库 —— core、agent-sdk、config、
# fsm-engine、llm、logger、mcp、memory、skills、
# storage、workspace、signals、jetstream……
tools/
agent-playground/ # Web 客户端(SvelteKit)—— 生产 UI
evals/ # 代理评估框架
friday-launcher/ # 系统托盘启动器 + 守护进程监控(Go)
pty-server/ # WebSocket → PTY shell 桥接(Go)
webhook-tunnel/ # Cloudflare 隧道 → 守护进程 webhook 转发(Go)
配置:friday.yml(平台范围)· workspace.yml(每个工作空间)· CONTRIBUTING.md(开发指南 + 代码风格)。
了解更多
- hellofriday.ai (https://hellofriday.ai) —— 桌面安装包(macOS、Windows)
- docs.hellofriday.ai (https://docs.hellofriday.ai) —— 完整文档
friday-studio-examples(https://github.com/friday-platform/friday-studio-examples) —— 可直接导入的工作空间friday-platform/agent-sdk(https://github.com/friday-platform/agent-sdk) —— 用于type: "user"代理的 Python SDK- AI Drift: the hidden cost of building with AI (https://blog.hellofriday.ai/ai-drift-the-hidden-cost-of-building-with-ai-e2b51415b3b0) —— 为什么仅依赖提示的自动化无法持久
- Building a personal fitness tracker in one conversation (https://blog.hellofriday.ai/building-a-personal-fitness-tracker-in-one-conversation-1ae2696a89f7) —— 从聊天到工作空间,完整流程
CONTRIBUTING.md—— 补丁、代码风格、硬性规则(需签署 CLA)SECURITY.md—— 漏洞披露- Discord (https://discord.gg/uczJyp5FMH) —— 提问、展示与分享
许可证
Friday 采用 源代码可用 的 Business Source License 1.1。你可以在 Additional Use Grant 许可下阅读、修改和自托管代码,该许可允许个人用途、5人以下组织以及年收入低于 100 万美元的企业免费生产使用。超出此范围的商业用途,或与 Tempest Labs 产品竞争的用途,需要商业许可证。每个发布的版本会在首次分发后一年自动转换为 Apache-2.0(当前版本的变更日期:2027-04-30;后续版本有自己的日期)。
商业许可咨询:[email protected]。
第三方组件保留其原始许可证——参见 THIRD_PARTY_LICENSES.md 和 NOTICE(包括 MPL-2.0 §3.2 源代码可用性通知以及双重/三重许可依赖项的许可证选择)。
相似文章
我们开源了一个代理运行时,专为人们常忽略的部分构建:在真实硬件上离线运行代理
一个开源的代理运行时,专为在真实硬件上离线运行AI代理而设计,支持硬件I/O(GPIO/MQTT/OPC-UA)作为一级节点和可视化构建器,支持多提供商LLM和本地RAG。
推出 Amazon Bedrock 代理的有状态运行时环境
OpenAI 与亚马逊合作,为 Amazon Bedrock 中的代理推出了有状态运行时环境,支持生产级的多步代理工作流,具备内置状态管理、可靠性和治理能力。该运行时原生运行于 AWS 环境,简化了企业用例(如客户支持、销售运营和财务流程)中复杂的代理编排。
智能体应该是代码还是带有独立运行时的声明式实体?
作者认为,生产环境中的AI智能体应定义为具有独立运行时的声明式清单,而不是分散在应用代码中,以便实现适当的版本控制、可观测性和回滚。他们将自己的解决方案作为开源工具提供。
最近受雇于一家获奖的SaaS公司。记录企业真正需要的智能体运行时
一位开发者记录了为一家SaaS公司构建的AI智能体运行时架构,重点聚焦于安全性、工具执行、状态管理以及推理与执行的分离。
在遇到 LangGraph 天花板后,我构建了自己的智能体运行时——将 UI 作为图节点,Postgres 持久化,零编排成本
作者介绍了 cascaide,这是一个全栈智能体运行时和 AI 编排框架,使用 TypeScript 编写,可在任何支持 JS/TS 的环境运行。它提供 UI 作为图节点、持久化 Postgres 检查点、零编排成本,并且设计为可自托管,无供应商锁定。