Astro 把 Claude Code 那套東西做成了一個純 TypeScript 框架開源了

作者:Nodejs技術棧
日期:2026年6月2日 上午8:00
來源:WeChat 原文

整理版優先睇

速讀 5 個重點 高亮

Astro團隊推出Flue:純TypeScript Agent框架,將Claude Code架構抽成可部署腳手架

整理版摘要

呢篇文章介紹咗Astro團隊最近開源嘅Flue,一個純TypeScriptAgent Harness框架。由Astro作者Fred K. Schott領銜,定位係Agent腳手架,將Claude Code嘅核心架構抽出來,但完全headless,冇界面,全程用代碼驅動。對寫TypeScript嘅開發者嚟講,呢個可能係今年最值得關注嘅Agent項目。

Flue嘅核心概念係Agent=Model+Harness。模型負責生成同工具調用,但真正令Agent自主完成任務嘅係harness層,包含會話、工具、技能、記憶同沙箱。Flue唔係又一個AI SDK,而係一個似Astro嘅框架,寫一次Agent就可以部署到Node.js、Cloudflare Workers、GitHub Actions等環境。框架只有@flue/runtime同@flue/cli兩個包。

Flue嘅設計好務實:預設用純JS虛擬沙箱,唔開容器,快又平;需要真環境可以揀local()或遠程容器。支援子Agent委派同MCP。開發體驗由一個CLI包辦。不過項目仲係實驗階段(v0.8.1),API可能變。雖然未適合生產,但佢將框架思維帶入Agent開發,門檻低,值得留意。

  • Flue係一個純TypeScriptAgent Harness框架,由Astro團隊開發,目標係提供可構建、可部署、可測試嘅Agent開發體驗。
  • 核心設計Agent=Model+Harness,將harness拆分為會話、工具、技能、記憶、沙箱,並支援寫一次部署到多個運行時。
  • 有別於AI SDKFlue注重框架思維,類似Astro/Next.js,支援構建產物,並預設用虛擬沙箱代替容器,大幅降低資源成本。
  • Agent開發可以同網頁開發一樣標準化,用Markdown檔案管理技能同邏輯,用TypeScript強型別校驗輸出,提高確定性。
  • 可以喺實驗項目中試用Flue,體驗createAgent、session、prompt、task等API,注意API仍可能變動,唔建議依賴生產環境。
值得記低
連結 github.com

Flue GitHub

Flue Agent Harness Framework 倉庫

連結 flueframework.com

Flue 官網

Flue Framework 官方網站

整理重點

Flue係乜嘢?Astro團隊嘅Agent框架

Astro作者 Fred K. Schott 領銜,withastro組織下開咗個新倉庫叫 Flue,定位係「Agent Harness Framework」。開源冇耐星標已經接近四千。

如果你用過 Claude CodeFlue嘅賣點一句話講完:將Claude Code入面嗰套Agent架構抽出來,變成一個純TypeScript框架,但完全 headless,冇終端界面、冇圖形界面,全程用代碼驅動。對寫Node.js同TypeScript嘅開發者嚟講,呢個可能係今年最值得關注嘅Agent項目之一。

整理重點

核心架構:Agent = Model + Harness

Flue官網將Agent拆成一個等式:Agent = Model + Harness。模型負責出token、調工具、理解prompt,但真正令Agent自主完成任務嘅係外面嗰層 harness。呢層殼包含以下組件:

  • 會話(sessions):讓Agent喺多輪對話之間保持上下文
  • 工具(tools):讓模型能調API、查數據、改嘢
  • 技能(skills):將可重用嘅專業知識打包成Markdown,按需加載
  • 指令與記憶AGENTS.md、長期記憶等
  • 沙箱(sandbox):一個能跑bash、讀寫文件、相對安全嘅執行環境

Flue強調自己唔係又一個 AI SDK,而係似 Astro 或者 Next.js 嘅框架,只不過服務對象從網頁變成了Agent。你寫一次Agent,然後build一下,就能部署到唔同地方:Node.js、Cloudflare Workers、GitHub Actions、GitLab CI/CD。

整理重點

開發體驗:CLI、強型別輸出、跨平台部署

Flue提供一個CLI命令 flue 包辦本地開發、CI觸發、構建部署。常用命令包括:

  1. 1 flue dev:watch模式嘅開發服務器,改完Agent重跑curl就見到變化,默認端口3583(九宮格鍵盤上拼出FLUE)。
  2. 2 flue run:本地構建並跑任意workflow,適合CI或一次性腳本。
  3. 3 flue connect:同某個Agent實例開交互式會話,多輪prompt共享內存狀態。
  4. 4 flue build:構建產物到./dist,Node目標打成單個.mjs,Cloudflare目標走Workers加Durable Objects。
最基本嘅翻譯Agent示例 typescript
// .flue/workflows/hello-world.ts
import { createAgent, type FlueContext, type WorkflowRouteHandler } from '@flue/runtime';
import * as v from 'valibot';

export const route: WorkflowRouteHandler = async (_c, next) => next();

const translator = createAgent(() => ({ model: 'anthropic/claude-sonnet-4-6' }));

export async function run({ init, payload }: FlueContext) {
 const harness = await init(translator);
 const session = await harness.session();
 const { data } = await session.prompt(
 `Translate this to ${payload.language}: "${payload.text}"`,
 {
 result: v.object({
 translation: v.string(),
 confidence: v.picklist(['low', 'medium', 'high']),
 }),
 },
 );
 return data;
}

留意個 result 參數:傳一個 valibot schema入去,prompt()返回嘅data就係經過校驗、帶類型嘅結構化數據。呢種 強型別 輸出令編排同分支判斷更確定,唔使對住自由文本做正則。

整理重點

沙箱設計、子Agent與MCP

Flue預設用 虛擬沙箱,背後係Vercel Labs嘅 just-bash——一個純JavaScript實現、跑喺內存嘅bash環境。唔開容器,Agent照樣可以用內置工具搜嘢、讀內容。官方話呢種虛擬沙箱比畀每個Agent起真容器快得多、平得多、易擴展得多。

若果需要真實環境,Flue提供分層選擇:

  • 虛擬沙箱:默認,內存嘅just-bash,最輕最快。
  • local():直接用宿主機文件系統同shell,適合CI場景。
  • 遠程容器:透過DaytonaE2B等連接器拎到真正Linux環境,鏡像可緩存後續秒起。

另外,Flue支援 子Agent 任務委派,用session.task()開一次性子Agent,共享沙箱但有獨立消息歷史。仲支援 MCP,可以喺可信代碼連遠程MCP server,將工具傳畀init()。

整理重點

現狀總結:值得留意嘅實驗項目

Flue目前係 實驗階段,今年2月先建倉,最新版本 v0.8.1,README明講API可能會變。協議係 Apache-2.0,商用友好。

雖然未適合上生產,但佢將「框架思維」認真帶入Agent開發。對前端同Node.js開發者嚟講,createAgent、session、prompt、task呢啲API讀起嚟同平時寫後端服務差不多。做Web框架嘅人嚟做Agent框架,思路確實唔同,值得持續關注。

Flue Agent Harness 純 TypeScript 框架
Flue Agent Harness 純 TypeScript 框架

做 Astro 嗰班友,最近伸咗手過去 Agent 領域。

由 Astro 作者 Fred K. Schott 帶頭,withastro 組織下靜靜雞上咗個新倉庫 Flue,定位寫得好直接:The Agent Harness Framework,Agent 腳手架框架。開源冇幾耐,star 已經爬到三千八百幾。

如果你用過 Claude Code,咁佢嘅賣點一句話就講得明:將 Claude Code 裏面嗰套嘢整成一個純 TypeScript 嘅框架,但完全 headless,冇終端介面,冇圖形介面,全程用程式碼驅動。對每日寫 Node.js 同 TypeScript 嘅人嚟講,呢個可能係今年最值得留意嘅一個 Agent 項目。

圖片

Agent = Model + Harness

先講一個概念,harness。

Flue 官網將 Agent 拆咗做一個等式:Agent = Model + Harness。模型負責出 token、調工具、理解 prompt,但係得模型係跑唔起一個做到嘢嘅 Agent。真正令佢可以自主完成任務嘅,係模型出面嗰層殼,即係 harness。

呢層殼裏面裝嘅嘢,你應該都唔陌生:

  • 會話(sessions):令 Agent 喺多輪對話同多次事件之間保持上下文
  • 工具(tools):令模型可以調 API、查數據、改嘢
  • 技能(skills):將可重用嘅專業知識打包成 Markdown,按需要載入
  • 指令與記憶AGENTS.md、長期記憶呢啲
  • 沙箱(sandbox):一個可以跑 bash、讀寫檔案、仲相對安全嘅執行環境

Flue 官網用咗一張分層圖嚟表達呢個架構,由下至上係模型、harness、沙箱、檔案系統。佢想講嘅係:第一代 Agent 係裸調 LLM API,做到聊天機械人同腳本化任務,但係都係得咁多。Claude Code 同 Codex 呢類先算係真正嘅 Agent,你俾嘅係一個目標,唔係一串預設步驟,然後信佢自己用上下文同工具做完件嘢。

Flue 做嘅嘢,就係將呢套「真 Agent 架構」抽咗出嚟,變成一個邊個都可以拎嚟用嘅 TypeScript 框架。

佢最似嘅,係 Astro 同 Next.js

官方不斷強調一句話:Flue 唔係又一個 AI SDK。

呢句嘢值得諗一諗。市面上嘅 AI SDK,例如 Vercel AI SDK,本質係幫你更順手咁調模型、處理流式輸出、管理工具調用。Flue 嘅野心唔喺呢度。佢將自己比喻成 Astro 或者 Next.js,只係服務對象由網頁變咗做 Agent。

呢個代表佢係一個 runtime-agnostic(運行時無關)嘅框架。你寫一次 Agent,然後 build 一次,就可以部署去唔同嘅地方:

  • Node.js 伺服器
  • Cloudflare Workers
  • GitHub Actions
  • GitLab CI/CD

寫一次,周圍部署。呢個思路前端工程師好熟,同當年同構框架、Edge 部署嘅邏輯一脈相承。分別只係今次行嘅唔係頁面渲染,而係一個可以自主做嘢嘅 Agent。

成個框架得兩個 package,乾淨俐落:

  • @flue/runtime運行時,包含 harness、會話、工具、沙箱
  • @flue/cliCLI 同構建工具,提供 flue 命令

大部分邏輯,其實寫喺 Markdown 入面

Flue 有個反直覺嘅設計:真正行嘅程式碼好少,Agent 嘅大部分「邏輯」都喺 Markdown 檔案入面,即係 skills、context 同 AGENTS.md

睇官方嘅入門示例,一個最簡單嘅翻譯 Agent:

// .flue/workflows/hello-world.ts
import { createAgent, type FlueContext, type WorkflowRouteHandler } from'@flue/runtime';
import * as v from'valibot';

exportconst route: WorkflowRouteHandler = async (_c, next) => next();

const translator = createAgent(() => ({ model: 'anthropic/claude-sonnet-4-6' }));

exportasyncfunction run({ init, payload }: FlueContext{
const harness = await init(translator);
const session = await harness.session();

const { data } = await session.prompt(
    `Translate this to ${payload.language}: "${payload.text}"`,
    {
      result: v.object({
        translation: v.string(),
        confidence: v.picklist(['low''medium''high']),
      }),
    },
  );

return data;
}

幾個細節幾啱 TypeScript 用戶嘅爽點。

模型用 'anthropic/claude-sonnet-4-6' 這種 provider/model 字串聲明,換模型就改個字串。示例入面可以見到 openai/gpt-5.5openrouter/moonshotai/kimi-k2.6 等等,多 provider 係一等公民。

更重要嘅係嗰個 result 參數。你傳一個 valibot 嘅 schema 入去,prompt() 返回的 data 就係經過驗證、帶類型嘅結構化數據。呢個代表你可以拎住 Agent 嘅輸出去做編排、去行分支判斷,而唔係對住一嚿自由文字做正則。對寫慣咗強類型 TypeScript 嘅人嚟講,呢種確定性比乜嘢都重要。

預設唔開容器,用純 JS 寫嘅虛擬沙箱

呢個係我個人覺得最聰明嘅一個設計。

俾 Agent 配沙箱,最直接嘅做法係每個 Agent 起一個 Docker 容器,隔離、安全、乜嘢都跑得起。但代價亦明顯:慢、貴、難擴展。如果要整一個高併發嘅線上 Agent,俾每個請求拉一個容器,成本根本頂唔順。

Flue 嘅預設選擇係虛擬沙箱,背後係 Vercel Labs 嘅 just-bash,一個用純 JavaScript 實現、喺記憶體入面跑嘅 bash 環境。唔開容器,Agent 照樣可以用內置嘅 grepglobread 呢啲工具喺檔案系統入面揾嘢、讀內容。官方嘅講法係,呢種虛擬沙箱比俾每個 Agent 起真容器快得多、平得多、亦好擴展得多,特別適合做高流量、高併發嘅 Agent。

睇一個客服 Agent 嘅例子,成個喺虛擬沙箱入面跑,連容器都唔使:

// .flue/workflows/support.ts
import { createAgent, type FlueContext, type WorkflowRouteHandler } from'@flue/runtime';

exportconst route: WorkflowRouteHandler = async (_c, next) => next();

const support = createAgent(() => ({ model: 'openrouter/moonshotai/kimi-k2.6' }));

exportasyncfunction run({ init, payload }: FlueContext{
const harness = await init(support);
const session = await harness.session();

await session.fs.mkdir('/workspace/articles', { recursive: true });
await session.fs.writeFile(
    '/workspace/articles/reset-password.md',
    '# Reset your password\n\nUse the account settings page to request a password reset email.',
  );

returnawait session.prompt(
    `You are a support agent. Search the workspace for articles relevant
    to this request, then write a helpful response.\n\nCustomer: ${payload.message}`
,
  );
}

咁需要真實環境點算?例如做一個完整嘅編程 Agent,要有 git、Node.js、瀏覽器、克隆好嘅倉庫。Flue 俾咗分層選擇:

  • 虛擬沙箱:預設,記憶體入面嘅 just-bash,最輕最快
  • **local()**:直接用宿主機嘅檔案系統同 shell,適合 CI 場景,runner 本身已經係隔離邊界,ghgitnpm 都在 $PATH 上面即用
  • 遠端容器:經 Daytona、E2B 呢類連接器攞到真正嘅 Linux 環境,鏡像仲可以快取,後續會話秒起

由記憶體入面嘅假 bash,到本機 shell,再到遠端真容器,按需求逐級加碼,呢個梯度設計得好務實。

子 Agent、任務委派、仲有 MCP

做重嘢嘅 Agent 框架,少不了任務分解同委派。Flue 用 session.task() 跑一個聚焦嘅一次性 Agent,佢同主 Agent 共享沙箱同檔案系統,但有自己獨立嘅訊息歷史:

const session = await harness.session();

const research = await session.task('Research the auth flow and summarize the key files.', {
  cwd: '/workspace/project',
  agent: 'researcher',
});

const answer = await session.prompt(
  `Use this research to draft the implementation plan:\n\n${research.text}`,
);

你可以用 defineAgentProfile() 預先定義好唔同角色嘅子 Agent,例如一個專門做調研嘅 researcher,然後令主 Agent 將工作派俾啱嘅人。呢套「多 Agent 協作」嘅玩法,同而家主流編碼 Agent 入面嘅 subagent 思路係一致嘅。

MCP 都支援。喺可信程式碼入面駁上一個遠端 MCP server,將佢嘅工具傳俾 init(),密鑰就可以放喺 env 入面,唔使塞入 prompt 或者檔案系統:

const github = await connectMcpServer('github', {
  url: 'https://mcp.github.com/mcp',
  headers: { Authorization: `Bearer ${env.GITHUB_TOKEN}` },
});

const agent = createAgent(() => ({
  model: 'anthropic/claude-sonnet-4-6',
  tools: github.tools,
}));

要說明嘅係,呢一版只支援現代嘅 streamable HTTP 傳輸(舊嘅 SSE 要手動指定),唔會自動探測傳輸方式、唔拉本地 stdio 嘅 MCP server、亦唔處理 OAuth 回調。仲比較剋制。

開發體驗:一個 CLI 全包

flue 呢個 CLI 將本地開發、CI 觸發、構建部署都串埋一齊,幾條命令值得記低:

  • flue dev:watch 模式嘅開發伺服器,改完 Agent 重跑 curl 就可以見到變化,預設埠口 3583(喺九宮格鍵盤上拼出嚟就係 FLUE)
  • flue run:本地構建並跑任意 workflow,CI 或一次性腳本調用好合適
  • flue connect:同某個 Agent 實例開一個互動式會話,多輪 prompt 共享記憶體入面嘅會話狀態
  • flue build:構建產物到 ./dist,Node 目標會打成單個 .mjs,Cloudflare 目標行 Workers 加 Durable Objects

會話狀態呢方面都分平台處理:部署到 Cloudflare 時,會話數據用 Durable Objects 託底,跨請求自動持久化,客戶幾星期幾個月後返嚟仲可以繼續傾;行喺 Node.js 上預設存在記憶體入面,要持久化就要自己接一個 store。

應唔應該而家就上手

先講清楚,Flue 仲係實驗階段,今年 2 月先起倉,最新版本 v0.8.1,README 講明 API 可能會變,而家上生產就要準備跟住改程式碼。協議係 Apache-2.0,商用友好。

但佢令人眼前一亮嘅地方,係將「框架思維」認真帶入咗 Agent 開發。過去大半年,裸調 API 加一堆膠水程式碼、或者綁死某個界面搬唔到亦測唔到嘅 Agent,我哋見得太多了。Flue 俾嘅係另一條路:將 harness 當做一等公民,令 Agent 好似寫網頁應用咁可以構建、可以部署、可以測試。

對前端同 Node.js 開發者嚟講,門檻低得有啲意外。createAgentsessionprompttask 呢啲 API,讀起上嚟同平時寫後端服務差唔多。做 Web 框架嘅人嚟做 Agent 框架,思路確實唔同,值得睇實。

項目地址:https://github.com/withastro/

flue 官網:https://flueframework.com/

Flue Agent Harness 純 TypeScript 框架
Flue Agent Harness 純 TypeScript 框架

做 Astro 的那幫人,最近把手伸到了 Agent 領域。

由 Astro 作者 Fred K. Schott 牽頭,withastro 組織下悄悄上線了一個新倉庫 Flue,定位寫得很直接:The Agent Harness Framework,Agent 腳手架框架。開源沒多久,star 已經爬到三千八百多。

如果你用過 Claude Code,那它的賣點一句話就能說明白:把 Claude Code 裏那套東西做成一個純 TypeScript 的框架,但完全 headless,沒有終端界面,沒有圖形界面,全程用代碼驅動。對每天寫 Node.js 和 TypeScript 的人來說,這可能是今年最值得關注的一個 Agent 項目。

圖片

Agent = Model + Harness

先聊一個概念,harness。

Flue 官網把 Agent 拆成了一個等式:Agent = Model + Harness。模型負責出 token、調工具、理解 prompt,但光有模型跑不起來一個能幹活的 Agent。真正讓它能自主完成任務的,是模型外面那一層殼,也就是 harness。

這層殼裏裝的東西,你應該都不陌生:

  • 會話(sessions):讓 Agent 在多輪對話和多次事件之間保持上下文
  • 工具(tools):讓模型能調 API、查數據、改東西
  • 技能(skills):把可複用的專業知識打包成 Markdown,按需加載
  • 指令與記憶AGENTS.md、長期記憶這些
  • 沙箱(sandbox):一個能跑 bash、讀寫文件、還相對安全的執行環境

Flue 官網用了一張分層圖來表達這個架構,從下到上是模型、harness、沙箱、文件系統。它想說的是:第一代 Agent 是裸調 LLM API,能做聊天機器人和腳本化任務,但也就到此為止了。Claude Code 和 Codex 這類才算真正的 Agent,你給的是一個目標,不是一串預設步驟,然後信任它自己用上下文和工具把活幹完。

Flue 做的事,就是把這套"真 Agent 架構"抽出來,變成一個誰都能拿來用的 TypeScript 框架。

它最像的,是 Astro 和 Next.js

官方反覆強調一句話:Flue 不是又一個 AI SDK。

這話值得琢磨。市面上的 AI SDK,比如 Vercel AI SDK,本質是幫你更順手地調模型、處理流式輸出、管理工具調用。Flue 的野心不在這兒。它把自己類比成 Astro 或者 Next.js,只不過服務對象從網頁變成了 Agent。

這意味着它是一個 runtime-agnostic(運行時無關)的框架。你寫一次 Agent,然後 build 一下,就能部署到不同的地方:

  • Node.js 服務器
  • Cloudflare Workers
  • GitHub Actions
  • GitLab CI/CD

寫一次,到處部署。這套思路前端工程師太熟了,跟當年同構框架、Edge 部署的邏輯一脈相承。區別只是這次跑的不是頁面渲染,而是一個能自主幹活的 Agent。

整個框架就兩個包,乾淨利落:

  • @flue/runtime:運行時,包含 harness、會話、工具、沙箱
  • @flue/cli:CLI 和構建工具,提供 flue 命令

大部分邏輯,其實寫在 Markdown 裏

Flue 有個反直覺的設計:真正跑起來的代碼非常少,Agent 的大部分"邏輯"都活在 Markdown 文件裏,也就是 skills、context 和 AGENTS.md

來看官方的入門示例,一個最簡單的翻譯 Agent:

// .flue/workflows/hello-world.ts
import { createAgent, type FlueContext, type WorkflowRouteHandler } from'@flue/runtime';
import * as v from'valibot';

exportconst route: WorkflowRouteHandler = async (_c, next) => next();

const translator = createAgent(() => ({ model: 'anthropic/claude-sonnet-4-6' }));

exportasyncfunction run({ init, payload }: FlueContext{
const harness = await init(translator);
const session = await harness.session();

const { data } = await session.prompt(
    `Translate this to ${payload.language}: "${payload.text}"`,
    {
      result: v.object({
        translation: v.string(),
        confidence: v.picklist(['low''medium''high']),
      }),
    },
  );

return data;
}

幾個細節挺戳 TypeScript 用戶的爽點。

模型用 'anthropic/claude-sonnet-4-6' 這種 provider/model 字符串聲明,換模型就改個字符串。示例裏能看到 openai/gpt-5.5openrouter/moonshotai/kimi-k2.6 等等,多 provider 是一等公民。

更關鍵的是那個 result 參數。你傳一個 valibot 的 schema 進去,prompt() 返回的 data 就是經過校驗的、帶類型的結構化數據。這意味着你能拿着 Agent 的輸出去做編排、去走分支判斷,而不是對着一坨自由文本做正則。對寫慣了強類型 TypeScript 的人來說,這種確定性比什麼都重要。

默認不開容器,用純 JS 寫的虛擬沙箱

這是我個人覺得最聰明的一個設計。

給 Agent 配沙箱,最直接的做法是每個 Agent 起一個 Docker 容器,隔離、安全、什麼都能跑。但代價也明顯:慢、貴、難擴展。要是做一個高併發的線上 Agent,給每個請求拉一個容器,成本根本扛不住。

Flue 的默認選擇是虛擬沙箱,背後是 Vercel Labs 的 just-bash,一個用純 JavaScript 實現的、跑在內存裏的 bash 環境。不開容器,Agent 照樣能用內置的 grepglobread 這些工具在文件系統裏搜東西、讀內容。官方的說法是,這種虛擬沙箱比給每個 Agent 起真容器要快得多、便宜得多、也好擴展得多,特別適合做高流量、高併發的 Agent。

來看一個客服 Agent 的例子,整個跑在虛擬沙箱裏,連容器都不用:

// .flue/workflows/support.ts
import { createAgent, type FlueContext, type WorkflowRouteHandler } from'@flue/runtime';

exportconst route: WorkflowRouteHandler = async (_c, next) => next();

const support = createAgent(() => ({ model: 'openrouter/moonshotai/kimi-k2.6' }));

exportasyncfunction run({ init, payload }: FlueContext{
const harness = await init(support);
const session = await harness.session();

await session.fs.mkdir('/workspace/articles', { recursive: true });
await session.fs.writeFile(
    '/workspace/articles/reset-password.md',
    '# Reset your password\n\nUse the account settings page to request a password reset email.',
  );

returnawait session.prompt(
    `You are a support agent. Search the workspace for articles relevant
    to this request, then write a helpful response.\n\nCustomer: ${payload.message}`
,
  );
}

那需要真實環境怎麼辦?比如做一個完整的編程 Agent,得有 git、Node.js、瀏覽器、克隆好的倉庫。Flue 給了分層選擇:

  • 虛擬沙箱:默認,內存裏的 just-bash,最輕最快
  • **local()**:直接用宿主機的文件系統和 shell,適合 CI 場景,runner 本身就是隔離邊界,ghgitnpm 都在 $PATH 上現成可用
  • 遠程容器:通過 Daytona、E2B 這類連接器拿到真正的 Linux 環境,鏡像還能緩存,後續會話秒起

從內存裏的假 bash,到本機 shell,再到遠程真容器,按需求逐級加碼,這個梯度設計得很務實。

子 Agent、任務委派、還有 MCP

乾重活的 Agent 框架,少不了任務分解和委派。Flue 用 session.task() 跑一個聚焦的一次性子 Agent,它和主 Agent 共享沙箱和文件系統,但有自己獨立的消息歷史:

const session = await harness.session();

const research = await session.task('Research the auth flow and summarize the key files.', {
  cwd: '/workspace/project',
  agent: 'researcher',
});

const answer = await session.prompt(
  `Use this research to draft the implementation plan:\n\n${research.text}`,
);

你可以用 defineAgentProfile() 預先定義好不同角色的子 Agent,比如一個專門做調研的 researcher,然後讓主 Agent 把活派給對的人。這套"多 Agent 協作"的玩法,跟現在主流編碼 Agent 裏的 subagent 思路是一致的。

MCP 也支持。在可信代碼裏連上一個遠程 MCP server,把它的工具傳給 init(),密鑰就能放在 env 裏,不用塞進 prompt 或者文件系統:

const github = await connectMcpServer('github', {
  url: 'https://mcp.github.com/mcp',
  headers: { Authorization: `Bearer ${env.GITHUB_TOKEN}` },
});

const agent = createAgent(() => ({
  model: 'anthropic/claude-sonnet-4-6',
  tools: github.tools,
}));

需要說明的是,這一版只支持現代的 streamable HTTP 傳輸(舊的 SSE 要手動指定),不會自動探測傳輸方式、不拉本地 stdio 的 MCP server、也不處理 OAuth 回調。還比較剋制。

開發體驗:一個 CLI 全包

flue 這個 CLI 把本地開發、CI 觸發、構建部署都串起來了,幾條命令值得記一下:

  • flue dev:watch 模式的開發服務器,改完 Agent 重跑 curl 就能看到變化,默認端口 3583(在九宮格鍵盤上拼出來就是 FLUE)
  • flue run:本地構建並跑任意 workflow,CI 或一次性腳本調用很合適
  • flue connect:和某個 Agent 實例開一個交互式會話,多輪 prompt 共享內存裏的會話狀態
  • flue build:構建產物到 ./dist,Node 目標會打成單個 .mjs,Cloudflare 目標走 Workers 加 Durable Objects

會話狀態這塊也分平台處理:部署到 Cloudflare 時,會話數據用 Durable Objects 託底,跨請求自動持久化,客戶幾周幾個月後回來還能接着聊;跑在 Node.js 上默認存在內存裏,要持久化得自己接一個 store。

該不該現在就上手

先說清楚,Flue 還是實驗階段,今年 2 月才建倉,最新版本 v0.8.1,README 明說 API 可能會變,現在上生產得做好跟着改代碼的準備。協議是 Apache-2.0,商用友好。

但它眼前一亮的地方,是把"框架思維"認真帶進了 Agent 開發。過去大半年,裸調 API 加一堆膠水代碼、或者綁死某個界面遷不動也測不了的 Agent,我們見得太多了。Flue 給的是另一條路:把 harness 當成一等公民,讓 Agent 像寫網頁應用一樣可構建、可部署、可測試。

對前端和 Node.js 開發者來說,門檻低得有點意外。createAgentsessionprompttask 這些 API,讀起來跟平時寫後端服務差不多。做 Web 框架的人來做 Agent 框架,思路確實不一樣,值得盯一盯。

項目地址:https://github.com/withastro/

flue 官網:https://flueframework.com/