Astro 把 Claude Code 那套東西做成了一個純 TypeScript 框架開源了
整理版優先睇
Astro團隊推出Flue:純TypeScript Agent框架,將Claude Code架構抽成可部署腳手架
呢篇文章介紹咗Astro團隊最近開源嘅Flue,一個純TypeScript嘅Agent 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係一個純TypeScript嘅Agent Harness框架,由Astro團隊開發,目標係提供可構建、可部署、可測試嘅Agent開發體驗。
- 核心設計Agent=Model+Harness,將harness拆分為會話、工具、技能、記憶、沙箱,並支援寫一次部署到多個運行時。
- 有別於AI SDK,Flue注重框架思維,類似Astro/Next.js,支援構建產物,並預設用虛擬沙箱代替容器,大幅降低資源成本。
- Agent開發可以同網頁開發一樣標準化,用Markdown檔案管理技能同邏輯,用TypeScript強型別校驗輸出,提高確定性。
- 可以喺實驗項目中試用Flue,體驗createAgent、session、prompt、task等API,注意API仍可能變動,唔建議依賴生產環境。
Flue GitHub
Flue Agent Harness Framework 倉庫
Flue 官網
Flue Framework 官方網站
Flue係乜嘢?Astro團隊嘅Agent框架
由Astro作者 Fred K. Schott 領銜,withastro組織下開咗個新倉庫叫 Flue,定位係「Agent Harness Framework」。開源冇耐星標已經接近四千。
如果你用過 Claude Code,Flue嘅賣點一句話講完:將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 flue dev:watch模式嘅開發服務器,改完Agent重跑curl就見到變化,默認端口3583(九宮格鍵盤上拼出FLUE)。
- 2 flue run:本地構建並跑任意workflow,適合CI或一次性腳本。
- 3 flue connect:同某個Agent實例開交互式會話,多輪prompt共享內存狀態。
- 4 flue build:構建產物到./dist,Node目標打成單個.mjs,Cloudflare目標走Workers加Durable Objects。
// .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場景。
- 遠程容器:透過Daytona、E2B等連接器拎到真正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框架,思路確實唔同,值得持續關注。

做 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.5、openrouter/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 照樣可以用內置嘅 grep、glob、read 呢啲工具喺檔案系統入面揾嘢、讀內容。官方嘅講法係,呢種虛擬沙箱比俾每個 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 本身已經係隔離邊界,gh、git、npm都在$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 開發者嚟講,門檻低得有啲意外。createAgent、session、prompt、task 呢啲 API,讀起上嚟同平時寫後端服務差唔多。做 Web 框架嘅人嚟做 Agent 框架,思路確實唔同,值得睇實。
項目地址:https://github.com/withastro/
flue 官網:https://flueframework.com/

做 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.5、openrouter/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 照樣能用內置的 grep、glob、read 這些工具在文件系統裏搜東西、讀內容。官方的說法是,這種虛擬沙箱比給每個 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 本身就是隔離邊界,gh、git、npm都在$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 開發者來說,門檻低得有點意外。createAgent、session、prompt、task 這些 API,讀起來跟平時寫後端服務差不多。做 Web 框架的人來做 Agent 框架,思路確實不一樣,值得盯一盯。
項目地址:https://github.com/withastro/
flue 官網:https://flueframework.com/