我们构建了一个代理运行时,其中任务是从配置编译的显式状态机

Reddit r/ArtificialInteligence 工具

摘要

Friday Studio 是一个开源的代理运行时,它将自然语言工作流编译成显式的、版本控制的 YAML 状态机。它允许开发者通过聊天构建 AI 代理,但以稳定的配置文件形式部署,确保生产环境的可靠性。

大家好,我是 Friday Studio 的开发者之一。分享这个项目是因为我们很想听到那些真正用代理部署过产品的人们的反馈。我们的团队在使用智能代理 AI 时反复遇到两个问题:要么设置起来非常麻烦,要么一旦运行起来又过于脆弱。我们想要一个运行时,让你的工作流每次都以相同的方式运行,每次都留下痕迹,并且不会出现意外。我们认为可靠性是一个配置问题。大多数工具让 LLM 每次运行时自己决定该做什么。这就是导致漂移和“昨天还能用”故障的原因。Friday 会将你描述的内容编译成一个 workspace.yml 文件,并每次都执行它。你可以阅读这个 YAML,将其提交到 git,并在不同版本之间进行差异比较。任务是有限状态机:状态、转换和代理调度在配置中都是显式的,而非在运行时推断(编译器位于 packages/workspace/src/execution-to-fsm.ts)。LLM 在每个状态内执行工作;FSM 决定接下来运行什么。代理不能在运行中途决定执行你没有定义的操作。每次运行都会留下完整的踪迹:状态机、每个步骤的瀑布时间线,以及每个工具调用的完整输入和输出。当出现问题时,你可以看到哪个状态失败了以及原因。代理拥有一个明确的 MCP 工具允许列表,该列表以硬编码的 Set 形式在代码中强制执行,而不是提示级别的“请不要这样做”(参见 packages/core/src/agent-conversion/agent-tool-filters.ts)。内存是仅追加的 markdown,在会话开始时自动注入到代理上下文中,代理通过 memory\_save 写回摘要。没有向量数据库,没有检索调优;代理首先调用 memory\_read 进行去重。可靠性在模型升级时依然保持,因为状态图是契约;只有入口动作的提示会变化。对于大多数工作流,特别是开箱即用的(cron、webhook 信号),设置速度很快。目前仅支持 macOS。文档:[docs.hellofriday.ai](http://docs.hellofriday.ai/) 仓库:[github.com/friday-platform/friday-studio](http://github.com/friday-platform/friday-studio) 非常期待反馈,特别是来自那些使用代理构建过产品的人。
查看原文
查看缓存全文

缓存时间: 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)latestweb 代理调用 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-digestcompetitive-monitordaily-operating-memojira-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.mdNOTICE(包括 MPL-2.0 §3.2 源代码可用性通知以及双重/三重许可依赖项的许可证选择)。

相似文章

推出 Amazon Bedrock 代理的有状态运行时环境

OpenAI Blog

OpenAI 与亚马逊合作,为 Amazon Bedrock 中的代理推出了有状态运行时环境,支持生产级的多步代理工作流,具备内置状态管理、可靠性和治理能力。该运行时原生运行于 AWS 环境,简化了企业用例(如客户支持、销售运营和财务流程)中复杂的代理编排。