作者: kerwin77106

  • Codex 升級:AI 平台戰爭搶的是桌面

    Codex 升級:AI 平台戰爭搶的是桌面

    📌 本文重點

    • Codex 正從「寫程式工具」進化為「桌面中控層」
    • 模型公司正往作業系統與工作流程上捲
    • 企業必須為 Agent 帶來的治理與撤退路徑預先設計

    這一輪 AI 平台戰爭,搶的不是「最強模型」,而是誰先佔領你的「工作流與作業環境」。OpenAI 用這次 Codex 大升級,把戰場從雲端 API 推進到開發者電腦螢幕上;接下來幾年,開發者與企業真正要思考的,不是「用不用 Agent」,而是「敢不敢把電腦交給哪一家」。


    一、Codex 不只是寫程式,它在搶你的「桌面主權」

    這次 Codex 更新,關鍵不是多會寫程式,而是它開始長成一個「半個作業系統」:

    • 電腦操作(Computer use):能在 macOS / Windows 上操控應用程式,從玩井字棋到開 IDE、切換 terminal、改 config,全部自己來。
    • 內建瀏覽器 + 90+ 插件:Codex 不再只是調你現有工具,而是把網頁、第三方服務收編進自己的「小宇宙」。
    • 永續線程與記憶(thread automations + memory):可以跨 session 記住專案脈絡,在背景持續跑任務,等於在你機器上放了一個「常駐 Agent」。
    • 多 Agent 協作:支援多個 Agent 分工,從需求拆解、Coding、測試到部署,自動化程度直逼「AI 軟體工廠」。

    把這些拼起來,你會發現:Codex 已經不是一個「IDE 裡的 copilot」,而是想變成「桌面上的中控層」。

    💡 關鍵: 一旦中控層被某家模型平台占據,你的日常工作流與工具選擇將長期被其技術與商業策略鎖死。

    這也是為什麼這次更新,被視為對 Anthropic 的 Claude Code + MCP 生態 的直接回擊——雙方在搶的,不是「誰幫你補完一段程式碼」,而是「誰來編排、監控、擁有你整個開發與知識工作流程」。


    二、模型公司上捲 OS 層:誰會被擠出局?

    過去十年,雲戰爭的劇本我們看過一次:

    • 一開始是「誰家 VM 便宜」,後來變成 AWS / Azure / GCP 直接往 PaaS、SaaS 卷上去,把一整排第三方服務擠到夾縫。
    • 今天在 Agent 時代,OpenAI、Anthropic 正在對 IDE、copilot 工具、甚至傳統 SaaS 重演一次。

    從這次 Codex + OpenAI Agents SDK 可以看出幾個明確信號:

    1. 第三方 Agent 平台會被邊緣化
      你如果只是幫用戶「把模型接上工具、做點工作流 UI」,OpenAI 直接給你一個 Agents SDK + sandbox + harness,還免費綁最強模型。你的 moat 幾乎瞬間歸零。

    2. 獨立 copilot 工具與專用 IDE 會被「平台吸收」
      當 Codex 能直接控制 VS Code / JetBrains,幫你開 PR、跑 CI、改 config,獨立的 coding copilot 插件,就會變成平台的一個 feature,而不是一家公司。
      Claude Code 一樣在做這件事,只是它透過 MCP 把 IDE、Git、issue tracker 等工具接成標準化「工具協議」。本質上,兩家都在收掉「中小型 DevTool 新創可能活的空間」。

    3. 設計、文件、知識工作軟體,會被「工作流」外包
      當 Agent 能自動開 Figma、Notion、Jira、Slack,幫你整理需求、產出設計稿、開 task、追進度:

    4. 用戶真正愛的是「整條工作流」的體驗,而不是單一工具的 UI。
    5. 誰掌握工作流編排權,誰就能把工具變成可替換零件。

    💡 關鍵: 只做單點工具的新創,若無法成為平台不可替代的一層,很容易在平台上捲的過程中被壓扁或變成小功能。

    換句話說,基礎模型公司正在向「AI 版作業系統」上捲:桌面是 UI,Agent 是排程器,插件/工具是 driver。任何只站在「工具層」的新創,都要重新審視自己的生存空間:你是平台 feature,還是真的不可替代?


    三、Agent 盯著你的螢幕:效率爆表,也是治理噩夢

    當 Codex、Claude 這種 Agent 可以「常駐看螢幕、自己操作電腦」,對企業意味三件事:

    1. 隱私邊界被重新畫一次
      傳統 DLP、端點防護預設「人類是操作者」。現在螢幕前可能是 OpenAI 代碼在操作你的 ERP、CRM、內網 Git
    2. 誰能看到畫面和輸入?
    3. 操作錄像存哪裡?
    4. 這些資料會不會回流到模型供訓練?
      不處理清楚,你的「機密專案」,等於在外包給一個你無法審計的外部員工。

    5. 內控與審計模型要升級
      傳統軟體出錯會「噴錯停下來」,Agent 會「自我修正繼續做」,風險直接放大。Towards AI 的實務框架 講得很直白:企業現在的 governance,大多沒準備好讓軟體「半自主行動」。

    企業至少要做到:

    • 明確的許可邊界:這個 Agent 可以動哪幾個系統、哪幾種操作?
    • 動態熔斷機制:金額、頻率、風險超過門檻就自動停機 + 人工覆核。
    • 完整審計軌跡:每一步操作有「誰授權、什麼意圖、用什麼工具」的可追溯紀錄。

    • 成本曲線會讓你不得不「設計節制」
      AI Agent 成本正快速上升:多步推理、多工具、多 Agent 協作,本質上就是「把一堆貴推理串在一起」。沒有架構設計,你不是在省人力,是在開一個會自旋的計費黑洞。

    這也是為什麼實務上會出現 Attention Scoping 這種模式:有意識地限制 Agent 每次能看、能用的工具集合,用架構來壓住成本與混亂度。

    💡 關鍵: 若沒有明確的權限與成本邊界設計,導入 Agent 可能在效率提升之前,先帶來失控的費用與合規風險。

    效率確實驚人,但如果你沒有治理框架、沒有成本護欄,Agent 很快會從生產力工具,變成技術債與合規風險的放大器。


    四、押誰的平台與協議?先想「可撤退性」

    對開發者與企業來說,最現實的問題不是哲學,而是:我要押 Codex + OpenAI Agents SDK,還是 Claude + MCP / UCP 這一側?

    幾個關鍵思路:

    1. 區分「應用層依賴」與「協議層依賴」
    2. OpenAI Agents SDK:偏應用框架,深度綁定 OpenAI 生態,長處是上手快、整合模型與 sandbox 容易,但遷出成本高
    3. Anthropic 的 MCP(Model Context Protocol):偏工具協議,定義「模型怎麼與外部工具對話」。理論上任何模型都能說 MCP,比較像是未來 multi-model、多供應商世界的「共同語言」。

    建議:在 Agent 內部與工具互動,優先採用開放協議(如 MCP 類型);在具體實作與運維,可以各家 SDK 混搭。

    1. 雲戰爭的教訓:一開始就設計 multi-provider
      當年很多團隊「先全上 AWS,將來再 multi-cloud」,結果「將來」永遠來不了。Agent 時代照抄一次就是:

    2. 先全部寫死在 OpenAI Agents SDK / 特定 provider 的沙箱模型裡;

    3. 長大後才發現無法平滑切到 Claude、Gemini 或自家私有模型。

    可行的折衷做法:

    • 「任務編排、工具清單、權限邊界」抽象在自己系統裡,不要寫死在某家 SDK 設定;
    • 適配層 封裝不同 provider(OpenAI Agent、MCP server、Cloudflare inference layer);
    • 關鍵任務預留「第二供應商」路徑,哪怕一開始不用,也要確認技術上走得通。

    • 善用中立基礎設施:例如 Cloudflare 的 inference layer
      Cloudflare AI Platform 很清楚:它要做的是「專為 Agent 設計的推理層」,而不是再做一個模型。對企業來說,這提供了一個折衷:

    • 在 Cloudflare 這種中立層上跑多家模型與 Agent;

    • 把監控、日志、金鑰管理、流量治理放在這一層;
    • 上層應用可以比較容易切換模型供應商。

    關鍵心態轉換是:不要再問「哪家模型最強」,而是問「哪種架構讓我五年後還能自由選供應商」。


    結語:現在就用「雲戰爭的教訓」,重新設計你的 AI 版 DevOps

    Codex 這次升級,宣告 AI 平台戰爭正式從「模型對比」進入「工作流與作業環境爭奪戰」。短期內,開發者會享受到前所未有的生產力紅利;長期來看,權力與依賴度會高度集中在少數幾家模型公司手上。

    對開發者與企業,我的具體建議是:

    1. 先假設 Agent 一定會進你桌面,然後反推安全與治理設計:從權限、審計、熔斷開始,而不是從 demo 好不好看開始。
    2. 選平台時優先考慮「協議與抽象層」,而不是單一 SDK 的爽度:MCP 類協議 + 自建編排層 + 中立推理層,比全押一家的封閉 SDK 更有長期議價力。
    3. 在架構圖上畫出「我怎麼退出這個供應商」的路徑,如果畫不出來,就當你已經被 vendor lock-in,評估時要把這個成本算進去。

    AI 平台戰爭真正要搶的,是你每天工作的「操作系統層」。你可以享受集中帶來的效率,但必須主動設計自己的分散與治理,否則這場戰爭結束時,你連自己桌面的規則都說不上話。

    🚀 你現在可以做的事

    • 打開你現有的雲與 AI 架構圖,標記所有被單一供應商鎖死的關鍵點,試著畫出替代路徑
    • 評估並選定一種開放協議(如 MCP 類型)作為未來 Agent 與工具互動的統一接口
    • 為第一個導入桌面 Agent 的場景設計「權限邊界 + 審計紀錄 + 熔斷條件」,做一個小規模試點
  • 用 openai-agents-python 搭一個 AI 小團隊

    用 openai-agents-python 搭一個 AI 小團隊

    📌 本文重點

    • 用多個專職 agent 分工處理一個大任務
    • 透過 orchestrator 串起明確的多步驟流程
    • 將既有 API / 工具包成 @tool 打造可落地工作流
    • 先做最小 demo,再逐步擴展到既有系統

    只靠一個聊天機器人常常做出「四不像」的結果,而 openai‑agents‑python 要解決的,就是讓你把一個大任務拆給多個各司其職的 AI 代理人,像一個小團隊一樣協作完成。

    GitHub 專案連結:https://github.com/openai/openai-agents-python


    核心功能:把一個大任務拆給多個 AI

    1. 定義多個專長不同的 Agent

    你可以在程式裡定義多個「角色」:

    • 資料蒐集 agent:負責上網查資料、整理重點
    • 寫作/寫程式 agent:負責產出初稿或程式碼
    • 審稿 agent:負責檢查結構、風格、錯字或潛在 bug

    這些都用 Python class 或函式就能描述,像這樣:

    from openai_agents import Agent
    
    researcher = Agent(
        name="researcher",
        instructions="你負責閱讀提供的資料,整理三個重點與參考連結。",
    )
    
    writer = Agent(
        name="writer",
        instructions="你負責寫出條列清楚的技術部落格草稿,語氣教學向。",
    )
    
    reviewer = Agent(
        name="reviewer",
        instructions="你負責審稿,只給出修改建議與需要補充的段落。",
    )
    

    行動:先想一個你日常會做的「三步驟」任務,直接對應成三個 agent 的職責。


    2. 設計任務流程:交接、審查、協作

    openai‑agents‑python 的重點不只是「多個 agent」,而是讓你把流程寫清楚:誰先做、誰接手、誰審查。

    例如做一個「自動寫技術部落格」的流程:

    1. researcher:根據題目蒐集資料,產出重點摘要
    2. writer:根據摘要寫出完整草稿
    3. reviewer:審稿,給出修改建議

    💡 關鍵: 把一長串需求拆成 2–3 個明確步驟,比一次丟給單一聊天模型更穩定、可控。

    在框架裡你可以用一個 orchestrator(像主揪)來控制:

    from openai_agents import Orchestrator
    
    orchestrator = Orchestrator(agents=[researcher, writer, reviewer])
    
    async def run_blog_flow(topic: str):
        research_notes = await orchestrator.run("researcher", input={"topic": topic})
        draft = await orchestrator.run("writer", input={"topic": topic, "notes": research_notes})
        review = await orchestrator.run("reviewer", input={"draft": draft})
        return {"draft": draft, "review": review}
    

    行動:把你現在用 ChatGPT 一次請他「幫我想題目、寫文、修稿」的流程,拆成 2–3 個步驟,寫在紙上,對應到上面這種 orchestrator 程式碼結構。


    3. 串接外部工具與 API,變成真的工作流

    openai‑agents‑python 支援 agent 呼叫你自定義的工具函式,例如:

    • 網頁爬蟲(requestsPlaywright
    • 存取資料庫或 Google Sheets
    • 操作檔案系統,輸出成 Excel / CSV

    你先寫好 Python 函式,再把它註冊給 agent 使用:

    import requests
    from openai_agents import tool
    
    @tool
    def fetch_url(url: str) -> str:
        """抓取指定網址的 HTML"""
        return requests.get(url, timeout=10).text
    
    scraper = Agent(
        name="scraper",
        instructions="根據給定網址抓網頁內容並擷取需要的欄位。",
        tools=[fetch_url],
    )
    

    行動:先選一個你常用的 API(例如某個內部 HTTP API、Notion API),包成一個最小的 @tool 函式,讓 agent 能直接呼叫。


    Demo:一晚內做完的「自動寫技術部落格」小團隊

    這裡做一個最小可用版本:輸入一個主題,幫你:

    1. 蒐集重點
    2. 產生技術部落格草稿
    3. reviewer 做一次審查,輸出建議

    步驟 0:安裝與環境準備

    pip install openai-agents-python openai
    

    在專案根目錄建立 .env(或直接用環境變數):

    export OPENAI_API_KEY="你的 API Key"
    

    💡 關鍵: 只要設定好 OPENAI_API_KEY,就能在一晚內跑起一個可用的多 agent 小流程。

    步驟 1:建立第一個 writer agent

    新增 agents_blog.py

    from openai_agents import Agent
    
    writer = Agent(
        name="writer",
        instructions=(
            "你是技術部落客,請用繁體中文寫 1200 字內的教學文,"
            "條列清楚、加上小標題,讀者是有基礎的工程師。"
        ),
    )
    

    先單獨測試這個 agent:

    import asyncio
    from agents_blog import writer
    
    async def main():
        result = await writer.run({"topic": "Python logging 實戰"})
        print(result)
    
    if __name__ == "__main__":
        asyncio.run(main())
    

    行動:先確保「單一 agent + 單一呼叫」正常運作,看到一篇文章草稿再往下加複雜度。


    步驟 2:加上 researcher + reviewer

    修改 agents_blog.py

    from openai_agents import Agent
    
    researcher = Agent(
        name="researcher",
        instructions=(
            "你負責針對主題列出 5 個實用重點與常見坑,"
            "輸出 JSON 格式:{\"key_points\": [...]}。"
        ),
    )
    
    writer = Agent(
        name="writer",
        instructions=(
            "根據 research.key_points 寫技術部落格,"
            "包含簡介、實作步驟與常見錯誤排查。"
        ),
    )
    
    reviewer = Agent(
        name="reviewer",
        instructions=(
            "你是嚴格的技術編輯,檢查草稿是否:1) 結構清楚、"
            "2) 範例正確、3) 沒有太多空話。輸出建議清單。"
        ),
    )
    

    再加一個 orchestrator 流程(新檔 run_blog.py):

    import asyncio
    from openai_agents import Orchestrator
    from agents_blog import researcher, writer, reviewer
    
    orchestrator = Orchestrator(agents=[researcher, writer, reviewer])
    
    async def run_blog(topic: str):
        research_notes = await orchestrator.run("researcher", input={"topic": topic})
        draft = await orchestrator.run("writer", input={"topic": topic, "research": research_notes})
        review_notes = await orchestrator.run("reviewer", input={"draft": draft})
    
        print("=== 草稿 ===\n")
        print(draft)
        print("\n=== 審稿建議 ===\n")
        print(review_notes)
    
    if __name__ == "__main__":
        topic = input("輸入技術主題:")
        asyncio.run(run_blog(topic))
    

    行動:實際輸入你下週想寫的一個主題,看這個流程能不能生成一份你「願意再改一版就能上 blog」的草稿。


    步驟 3:做成簡單 CLI 或排程

    CLI(已經算一種):

    python run_blog.py
    

    若要每天自動產出草稿,可以用 crontab:

    crontab -e
    # 每天早上 9 點產出一篇關於 Python 的文章
    0 9 * * * cd /path/to/project && OPENAI_API_KEY=xxx python run_blog.py <<EOF
    Python 非同步程式設計實戰
    EOF
    

    行動:先用 CLI 手動跑幾次,確認品質與 token 消耗,再考慮排程自動化。


    適合誰用?幾個具體場景

    • 工程師/資料工程師
    • 資料抓取 → 清洗 → 產出報表(多個 agent 分別負責)
    • 專案 scaffold 生成 → 單元測試撰寫 → reviewer 檢查風險
    • 技術寫作者 / Developer Advocate
    • 自動產出技術部落格初稿、Release Note、API 範例
    • 內部平台團隊
    • 把既有的 CI/CD、監控 API 包成工具,讓 AI agent 幫忙查 log、整理 incident 報告

    💡 關鍵: 只要你習慣在 ChatGPT 下一長串指令,就幾乎一定能拆成 multi‑agent workflow 減少來回與手動操作。

    只要你目前已經在用 ChatGPT 做「一長串指令」,就適合把流程拆成 multi‑agent workflow 測試看看。


    延伸應用:部署、成本控制、整合現有系統

    1. 部署到雲端

    • 用 FastAPI 或 Flask 包一層 HTTP API,把 orchestrator 暴露成 /run_flow endpoint
    • 部署到 Render / Railway / Fly.io / 自家 Kubernetes,都只是一般 Python Web 服務部署流程

    2. 控制成本與錯誤

    • 限制 max_tokens / 模型:對只負責小任務的 agent 用較便宜的模型
    • 加上 retry + logging:為 orchestrator 跑的每一步記錄 prompt、輸出與 token 使用
    • 設定明確 instructions:讓 reviewer 僅輸出「建議清單」,避免重複生成整篇文章浪費 token

    3. 與既有後端或 Slack Bot 整合

    • 既有後端:在服務裡呼叫 orchestrator,把結果回寫資料庫或觸發其他工作
    • Slack Bot:
    • 用 Slack API 建一個 slash command /ai-team
    • 收到指令後,把文字丟給 orchestrator,完成後再貼回頻道

    行動:先選一個「已在跑的」後端流程(例如每週報表),先只把其中一段換成 agent 完成,觀察穩定度與成本。


    怎麼開始:最快上手路徑

    1. 看 GitHub READMEhttps://github.com/openai/openai-agents-python
    2. 先實作一個最小 demo:如本文的 blog flow 或「抓網頁 → 清洗 → 匯出 CSV」
    3. 再慢慢拆更多 agent:把你原本寫在同一個 prompt 或腳本裡的步驟,一個一個拆成獨立角色

    只要先完成一個「今晚就能跑起來」的小流程,你之後會很自然開始想:還有哪些工作可以交給這個 AI 小團隊做。

    🚀 你現在可以做的事

    • 打開專案,實作一個最小的 writer agent 並用單一呼叫產出一篇草稿
    • 把你常用的一個內部或公開 HTTP API 包成 @tool,讓 agent 能直接呼叫
    • 依照文中的 researcher → writer → reviewer 範例,寫出自己的第一個 orchestrator 流程並在本機跑一次
  • Claude Opus 4.7 實作可控 Agent 平台

    Claude Opus 4.7 實作可控 Agent 平台

    📌 本文重點

    • Opus 4.7 更適合長上下文、多步任務與自我校對
    • 可作為常駐 coding / ops Supervisor Agent
    • 透過工具層與治理設計,接手真實 CI / PR pipeline

    Opus 4.7 解決的痛點很直接:以前你不太敢把多步任務完全丟給 LLM 自動跑——上下文記不住、自我檢查不足、程式碼改著改著就壞掉、Agent 亂調工具、成本爆炸。Opus 4.7 把這幾個點同時強化:長上下文 + 自我校對 + agentic coding,讓它不再只是「聊天模型」,而是可以放進持續運行 pipeline 的一個穩定元件。


    重點說明:Opus 4.7 對 Agent 能力的實質升級

    1. 長上下文 + 自我校對 = 多步任務可「放手」

    Opus 4.7 官方強調:

    • 更長上下文:可以在一次對話裡管理整個任務歷史、spec、log、既有程式碼與錯誤紀錄,減少你自己在應用層做 chunk & stitching。
    • 自我核查輸出:模型在回傳前會傾向先「檢查」自己的推論、程式碼或計算結果,等於內建一層 lightweight critic。

    💡 關鍵: 更長上下文搭配自我核查,實際上讓多步任務可以交給單一模型從頭管到尾,而不是切給一堆臨時腳本與輔助模型。

    對多步 pipeline(例如:分析 log → 找 root cause → 編輯程式碼 → 產 PR)最大的好處是:

    • 可以讓 Supervisor Agent 一次看到完整任務 timeline,而不是一段一段 patch;
    • 減少你在系統外再包一層「審題 / 校對」模型的需求(但關鍵步驟仍建議顯式加 guardrail)。

    2. Agentic Coding:如何讓 Opus 4.7 當常駐 coding / ops agent

    Opus 4.7 在 程式碼規劃 + 工具調用 上的品質明顯提高,實務上你可以讓它做:

    • 長期追蹤一組 repo 的變更,持續提出 refactor / bugfix 建議;
    • 自動跑 CI log 分析 → 開 issue → 出 patch → 發 PR;
    • ops 向:監看監控告警 → 初步診斷 → 呼叫 runbook 工具。

    💡 關鍵: 把「讀檔、改檔、跑測試、開 PR」封裝成工具給 Opus 4.7 用,它就能長期常駐在 repo / pipeline 中當實際執行者,而不是只當輔助聊天夥伴。

    核心設計重點:

    1. 工具調用(Tool use)
    2. /v1/messages + tools 讓 Opus 負責選擇何時 call tool、填參數;
    3. 將「讀檔、改檔、跑 test、開 PR」抽成安全封裝的工具,不讓模型直接操作 Git。

    4. 程式碼修改與回滾

    5. 永遠透過 「diff-based API」 修改程式碼,而不是讓模型輸出整檔;
    6. 由工具層實作版本管理(Git branch/commit),模型只負責描述修改 intent。

    7. 安全護欄設計

    8. 角色+權限 限制工具:code_writer 不能直接 deployops_agent 只能操作 sandbox;
    9. 重要操作強制走「人審 + MCP gateway」流程。

    3. 在多代理系統中的定位:Supervisor / Orchestrator 角色

    以「Supervisor Agent」架構來看(類似 Towards AI 提到的 blueprint):

    • Opus 4.7 很適合擔任 Supervisor / Orchestrator
    • 拆解使用者目標 → 任務樹;
    • 安排子代理:搜尋 Agent、執行 Agent、評估/QA Agent
    • 維護整個任務的 context & memory。

    • MCP 或你自建的工具層則提供:

    • 可治理的工具執行(權限、審計 log、版本管理);
    • 與企業內部 API / 資料庫 / CI/CD / issue tracker 的橋接。

    重點:Supervisor 不直接做所有事,而是負責問對問題、調對工具、把任務切給對的子代理。Opus 4.7 的長上下文 +較穩定規劃能力,剛好補上這個角色。


    實作範例:自動 triage issue → 修 bug → 開 PR

    以下示意使用 Claude API + MCP / 自建工具,流程:

    1. 新 issue 建立 → Webhook 觸發 Supervisor;
    2. Supervisor(Opus 4.7)分析 issue,決定是否可自動處理;
    3. 呼叫 repo 工具 找到相關檔案、測試;
    4. 呼叫 code-agent(也是 LLM 或工具) 產生 patch;
    5. 呼叫 git/pr 工具 開 PR,必要時標記需要人工 review。

    1. Supervisor 的 messages 結構

    POST /v1/messages
    {
      "model": "claude-3-opus-4.7",  // **關鍵:Supervisor 指定 Opus 4.7**
      "system": "你是Supervisor Agent,負責協調工具與子代理.\n" +
        "規則:\n" +
        "1. 僅在需要時使用工具,不要自己幻想結果。\n" +
        "2. 高風險操作(寫檔、開PR)前,一定先提出計畫並自我檢查。\n" +
        "3. 若不確定,改為標記需要人工審核.",
      "tools": [
        { "name": "repo_search", "input_schema": {"type": "object", ...} },
        { "name": "repo_read_file", "input_schema": {"type": "object", ...} },
        { "name": "repo_edit_file_diff", "input_schema": {"type": "object", ...} },
        { "name": "run_tests", "input_schema": {"type": "object", ...} },
        { "name": "create_pr", "input_schema": {"type": "object", ...} }
      ],
      "messages": [
        {
          "role": "user",
          "content": [
            {
              "type": "text",
              "text": "有新的 GitHub issue:#1234 API 回傳 500,log ID=abcd...\n" +
                       "請決定是否可以自動修復,若可以,直接走:分析→修改→測試→開PR。"
            }
          ]
        }
      ]
    }
    

    2. 工具呼叫:diff-based 程式碼修改

    在第一次 tool call 前,先讓 Supervisor 規劃:

    1. 讀取相關檔案與測試檔。
    2. 產生修改計畫與預期影響範圍。
    3. 套用最小 diff 修改程式碼。
    4. 執行相關測試。
    5. 測試通過後建立 PR,標記『自動修復,請人工 review』。
    

    接著模型會回覆一個 tool 呼叫(格式依 SDK):

    {
      "role": "assistant",
      "content": [
        {
          "type": "tool_use",
          "id": "toolu_1",
          "name": "repo_search",
          "input": {
            "query": "500 error log id abcd", 
            "max_results": 10
          }
        }
      ]
    }
    

    你的應用層接到後:

    1. 執行 repo_search(你實作的服務,可能包 Git grep / code search);
    2. 把結果以 tool_result 回餵:
    {
      "role": "tool",
      "tool_use_id": "toolu_1",
      "content": [{
        "type": "text",
        "text": "找到可能相關檔案: src/api/user.ts, src/service/userService.ts ..."
      }]
    }
    

    之後 Supervisor 可能呼叫:

    {
      "type": "tool_use",
      "name": "repo_edit_file_diff",
      "input": {
        "path": "src/service/userService.ts",
        "diff": "@@ -42,6 +42,10 @@\n- const result = await dao.getUser(id);\n+ const result = await dao.getUser(id).catch(e => {\n+   logger.error('getUser failed', { id, err: e });\n+   throw new HttpError(500, 'USER_LOOKUP_FAILED');\n+ });"
      }
    }
    

    這裡的關鍵是:

    • repo_edit_file_diff 工具會:
    • 把原始檔讀出來;
    • 套用 diff(可用 git apply 或自寫 patch 邏輯);
    • commit 到專用 branch;
    • 回傳新的 snippet / commit id;
    • 回滾 就交給 Git:若後續測試失敗,由 Supervisor 呼叫 git_reset_to_commit(另一個工具),或人工介面一鍵 rollback。

    3. MCP / 自建工具層設計示意(pseudo code)

    // MCP Gateway / 工具伺服器(Node 範例)
    
    import express from 'express';
    import { searchRepo, editFileWithDiff, runTests, createPR } from './infra';
    
    const app = express();
    app.use(express.json());
    
    function requireRole(role: string) {
      return (req, res, next) => {
        const callerRole = req.headers['x-agent-role'];
        if (callerRole !== role) return res.status(403).send('forbidden');
        next();
      };
    }
    
    app.post('/tools/repo_edit_file_diff', requireRole('supervisor'), async (req, res) => {
      const { path, diff } = req.body;
      // 審計 log
      console.log('[AUDIT] edit_file_diff', { path, by: 'supervisor' });
      const result = await editFileWithDiff(path, diff);
      res.json(result);
    });
    
    // 其他工具類似實作...
    
    app.listen(3001);
    

    Supervisor Agent 呼叫工具時,由你的 orchestrator 轉成 HTTP request,並加上 x-agent-role: supervisor 等標頭,實作權限與審計。


    建議與注意事項:成本、延遲與治理

    1. 成本與延遲控制

    • 長上下文 ≠ 無腦塞所有東西
    • 為 Supervisor 設計 分層上下文
      • 任務規格(長期保持);
      • 當前子任務狀態(中期);
      • 最近工具回傳、log(短期)。
    • 透過你的應用層做 context summarization / state store,不要每次把整個任務歷史丟進去。

    • 對長跑任務(例如多輪 patch + test):

    • 使用 max_tokens / tool_temperature 控制回覆長度與探索度;
    • 將「細節 log」放在外部存儲,必要時讓模型用工具查詢,而不是全部當成 prompt。

    2. 避免過度「自作主張」

    Opus 4.7 的推理與自我校對更強,副作用是它會更願意自己決定事情。控制方式:

    • system 提前定義 contract
    • 任務邊界:可修改哪些 repo / namespace;
    • 停機條件
      • 測試連續失敗 N 次 → 停止修改,標記需要人工;
      • 連續無法重現 bug → 輸出完整調查報告,停止嘗試;
    • 審核步驟
      • 高風險變更必須產生「變更說明 + 風險清單」給人看。

    範例 system 片段:

    你是後端修 bug 的 Supervisor Agent,遵守以下 contract:
    - 只能操作 repo `my-service`,不可動 infra repo。
    - 若連續 2 次修改導致測試新增失敗,立即停止,輸出調查報告,等待人工處理。
    - 不得直接部署,只能開 PR,並在 PR 描述中列出:問題原因、修改內容、風險與 rollback 方式。
    

    3. 對話風格變更對既有工作流的影響

    Opus 4.7 更傾向「先思考再回答」,你會看到:

    • 回覆結構更完整,但文字量可能變多,對老工作流可能:
    • 冗長說明擾亂你原本靠 pattern matching 的 parser;
    • 原本 prompt 期待的 JSON 結構會被「多講兩句」破壞。

    💡 關鍵: 若你的系統嚴重依賴固定輸出格式,必須明確要求「只輸出 JSON」,並用 schema 驗證與重試機制包住模型。

    建議:

    • 儘量讓模型輸出 單一結構化 payload,多餘說明放在欄位內:
    {
      "plan": "文字說明…",
      "actions": [ ... ],
      "needs_human_review": true
    }
    
    • system 明確要求:僅輸出 JSON,不要額外文字,並在應用層加 schema 驗證,若解析失敗就回饋「格式錯誤,請重新輸出」。

    結論:Opus 4.7 的能力重點不是「更會聊天」,而是更適合當有邊界、有工具、有治理的 Agent 核心。只要把它放在 Supervisor 位置,搭配 MCP 或自建工具層,控制好 contract / 成本 / 權限,你就可以開始放心讓它接手一部分真實的 coding / ops pipeline,而不只是做輔助建議。

    🚀 你現在可以做的事

    • 在現有 LLM 應用中,先挑一條「分析 log → 修 bug → 開 PR」的小流程改由 Opus 4.7 當 Supervisor 嘗試落地
    • 設計一組 repo_searchrepo_edit_file_diffrun_testscreate_pr 工具,並封裝成 MCP 或內部 HTTP 服務
    • 為 Opus 4.7 Supervisor 撰寫明確的 system contract(任務邊界、停機條件、審核規則),再逐步擴大可自動處理的任務範圍
  • 實戰 Agentic RAG 與 Hybrid Search

    實戰 Agentic RAG 與 Hybrid Search

    📌 本文重點

    • 單一檢索策略讓 RAG 在真實場景很容易翻車
    • Hybrid Search 能互補向量與關鍵字的盲點
    • 讓 Agent 負責檢索策略與多輪重試能顯著提升穩定度
    • 不換模型也能透過 eval、Hybrid 與權限控管大幅升級 RAG

    在實際專案裡,多數 RAG 翻車不是因為模型不夠聰明,而是檢索策略太單一:只用向量會被專有名詞和代碼玩死,只用關鍵字又抓不到語義相近的長文件內容。Agentic RAG + Hybrid Search 的組合,重點就是讓「檢索」變成可調度、可重試、可觀測的一級公民,而不是一個寫死的 search(query) 函式。


    重點說明

    1. 為什麼單一檢索在真實專案會翻車?

    常見四種翻車場景:

    1. 長文件 / 手冊
    2. 只用向量:整份手冊被切成很多 chunk,語義太接近,top-k 都很像,但真正要的那一段不一定排前面。
    3. 只用 BM25:查詢句子太口語,關鍵字重疊度不高,直接 miss。

    4. 專有名詞 / 法規條文 / 內部代號

    5. 向量模型常常把 DS-104DS-140 當成類似,專案實際上兩者完全不同。
    6. 法規編號、API 名稱、Ticket ID 等,關鍵字檢索反而更穩

    7. 程式碼、表格、錯誤訊息

    8. 向量對縮排、符號、stack trace 的敏感度很差。
    9. Log ID 或錯誤碼這類「硬字串」,BM25/關鍵字幾乎是必要條件

    10. 跨語言 / 口語查詢

    11. 使用者用自然語言描述問題,文件是正式用語或英文,公司內還混雜縮寫。
    12. 需要先用 LLM 做 query 改寫,再讓向量與 BM25 各自發揮。

    Hybrid Search(向量 + BM25) 的實際好處:

    • 可以 補各自的盲點:專有名詞用 BM25 鎖定,模糊描述用向量補齊。
    • 可以針對不同類型文件設定 權重策略(例如法規 > 內部 wiki > Slack 摘要)。
    • 可以後面用 rerank 模型 做第二次排序,穩定提升回答可靠度。

    💡 關鍵: 單一檢索在長文件與專有名詞場景很容易漏抓關鍵內容,Hybrid Search 能同時顧到語義相似與精確字串匹配,明顯降低 RAG 翻車率。


    2. 讓 Agent 負責檢索策略,而不是把檢索寫死

    典型 Agentic RAG 設計:

    • 一個 Orchestrator Agent(對話主控)
    • 多個 retriever 工具keyword_retrievervector_retrieverhybrid_retrieverlegal_retriever

    Agent 的工作不是「自己產生答案」,而是先判斷:

    1. 要用哪種檢索策略?
    2. 查錯誤碼或 ticket:優先 關鍵字 → 再向量精抽
    3. 問概念解釋:優先 向量 → 再用 BM25 找原始定義
    4. 法規/權威階層:改用 分層 retriever(例如每一層級至少取 1–2 筆)

    5. 要不要改寫 Query?

    6. 第一輪命中文件相關度低時,讓 Agent 自動:

      • 摘出關鍵詞
      • 加上同義詞 / 全名(例如:DSData Steward
      • 限縮 domain(例如:限定 product=core-banking
    7. 多輪重試與合併結果

    8. 第一輪檢索後如果信心不足(例如 top-3 相似度都 < 0.7),
    9. Agent 改寫 query 或更換 retriever,再抓一次,最後合併去重後送入 LLM。

    這樣做的實際好處:

    • 檢索策略可迭代:只要調整工具 / prompt,不必重寫服務架構。
    • 容易在線上 A/B:只換掉 Orchestrator 的 prompt 或 routing 邏輯即可。
    • 可以針對不同客戶 / 部門掛不同的工具組合。

    一個可落地的組合:

    • LLM:OpenAIgpt-4.1)、Anthropicclaude-3.7)皆可
    • 檢索:
    • Elasticsearch:BM25 + dense vector + hybrid score
    • Weaviate / Qdrant:向量 + keyword filter

    簡化架構:

    User → Orchestrator Agent → (tool calls) →
      - keyword_retriever (Elasticsearch BM25)
      - vector_retriever  (Weaviate / ES dense vector)
      - hybrid_retriever  (ES rank_feature / script_score)
    → merge + dedup + rerank → LLM answer
    

    實作範例

    1. Orchestrator Agent Prompt(決定使用哪個 retriever)

    假設用 OpenAI Assistants API 或自行封裝 tools:

    系統指示(Orchestrator):
    你是一個檢索協調代理,負責從多種檢索器取得最相關的企業知識。
    
    - 若使用者詢問:
      - 錯誤碼、ticket ID、法規條號、API 名稱 → 優先使用 **keyword_retriever**。
      - 抽象概念、最佳實踐、流程說明 → 優先使用 **vector_retriever**。
      - 法律 / 合規問題,且需多層級來源 → 使用 **legal_hybrid_retriever**。
    
    流程:
    1. 先決定要呼叫哪些工具(可以多個)。
    2. 若第一輪檢索結果的「來源數量 < 3」或「相關度評估偏低」,
       - 自行改寫查詢(更精簡、加入關鍵字),再重試一次。
    3. 最終將所有檢索結果去重、排序,回傳給後續回答模型。
    禁止自行編造公司內部資料,所有答案必須可追溯到文件片段。
    

    索引 mapping:

    PUT knowledge_base
    {
      "mappings": {
        "properties": {
          "content": { "type": "text" },
          "content_vec": { "type": "dense_vector", "dims": 1536, "index": true },
          "source_type": { "type": "keyword" },   
          "tenant_id": { "type": "keyword" }
        }
      }
    }
    

    簡化版 hybrid 查詢(BM25 + 向量):

    POST knowledge_base/_search
    {
      "size": 20,
      "query": {
        "script_score": {
          "query": {
            "bool": {
              "must": [
                {"match": {"content": "GDPR data retention"}},
                {"term": {"tenant_id": "acme_corp"}}
              ]
            }
          },
          "script": {
            "source": "0.6 * _score + 0.4 * cosineSimilarity(params.q_vec, 'content_vec')",
            "params": {"q_vec": [/* query embedding */]}
          }
        }
      }
    }
    

    關鍵點:

    • BM25 與向量權重(例子中 0.6 / 0.4)要透過線上 A/B 或離線 eval 調整。
    • tenant_id filter 做多租戶權限隔離,非常重要。

    💡 關鍵: 在同一個查詢裡用 script score 同時結合 BM25 分數與 cosine similarity,能控制兩者權重,調整出最適合自己資料分佈的 Hybrid 策略。


    3. Chunking 與 max context 的工程細節

    基本原則:

    • 語義切分(semantic splitting)+ 適度 overlap 為主,而不是死切 512 tokens
    • 避免 chunk 過長導致:
    • 向量語義太混濁,top-k 噪音變高。
    • LLM context 塞滿 retrieval 噪音,回答變模糊。

    實作骨架(pseudo-code):

    from semantic_splitter import split_semantic
    
    def chunk_doc(text: str):
        sections = split_semantic(text, max_chars=1200)
        chunks = []
        overlap = 150  # 字元級 overlap
        for sec in sections:
            if len(sec) <= 1200:
                chunks.append(sec)
            else:
                # 針對長 section 再做 sliding window
                for i in range(0, len(sec), 1200 - overlap):
                    chunks.append(sec[i:i+1200])
        return chunks
    

    max context tokens 的關係:

    • 假設 LLM context 32k,系統 prompt + 對話占 4k,其實留給 RAG 的只有約 28k
    • 若每個 chunk 約 400 tokens,你實際能塞 約 50–60 個 chunk 就爆,但通常 8–16 個 chunk 就夠,更多只會拉高成本與噪音。

    rerank 與去重

    • 先取寬一點的 top_k(例如 30–50),再用輕量 rerank(如 bge-reranker)縮到 8–12 個。
    • 去重邏輯可以用:same doc_id + 高度相似 直接只留一個,減少重複內容浪費 context。

    💡 關鍵: 雖然 context 可能有 32k tokens,但實務上只保留約 8–16 個高質量 chunk,通常就能兼顧成本與效果,塞太多反而害答題品質下滑。


    建議與注意事項

    1. 不要只做 embedding,不做 eval

    常見錯誤流程:

    1. 把全部文件 embed → 塞進向量庫 → 上線。
    2. 發現回答怪怪的 → 開始懷疑模型。

    比較健康的流程:

    1. 先準備一組 標記好的 QA/Eval 集10–50 題也好)。
    2. 對同一組問題,分別跑:
    3. 純 BM25
    4. 純向量
    5. Hybrid + 不同權重
    6. 用簡單指標(hit@k、人工評分)挑一個 baseline,再上線 A/B。

    2. 向量庫維護:重建 / 追加 / 版本化

    • Embedding 模型版本變更 時:
    • 盡量用新 index 重建(kb_v2),舊版保留一段時間做對照。
    • 不要在同一個 index 裡混不同 embedding 模型的向量。
    • 大量文件更新策略:
    • 批次追加新文檔時,要記錄 批次 ID / 資料版本,方便 rollback。
    • 下線文件要標記 is_active=false 或直接 soft delete,避免回答引用過期政策。

    3. 多租戶與權限過濾

    • 在 Elasticsearch / Weaviate 中務必存:tenant_idvisibilityrole 等欄位。
    • 檢索 query 層一定要加:
    "filter": [
      {"term": {"tenant_id": "${current_tenant}"}},
      {"terms": {"visibility": ["public", "internal"]}}
    ]
    
    • 不要指望 LLM 自己遵守權限,權限控制一定要在檢索階段完成。

    4. 線上評測與 A/B 驗證

    簡易做法:

    1. 選一組真實高頻 query(客服 ticket、搜尋 log)。
    2. 設計兩條路線:
    3. A:純向量 RAG
    4. B:Agentic RAG + Hybrid Search
    5. 隨機分流流量,收集:
    6. 使用者是否重問 / 追問率
    7. 是否需要人工接手
    8. CSR / domain expert 的 1–5 分主觀評分

    通常在企業知識庫場景,只要加上 Hybrid Search + Agent 重試,就能看到 10–30% 的 query 成功率提升,而且失誤類型會明顯變少(比較少「答錯法規條」、「引用過期政策」)。


    總結:如果你現在的 RAG 還是「單一向量庫 + top-k 塞給 LLM」,要提升穩定性,不一定要換更大的模型,先把 Hybrid Search 與 Agentic 檢索策略補上,通常是成本最低、效果最直接的升級路線。


    🚀 你現在可以做的事

    • 從現有專案中抽出 10–50 則真實 query,分別用純 BM25、純向量與 Hybrid 跑一次,記錄 hit@k 與人工評分
    • 在現有 RAG 服務前面加一個簡單 Orchestrator,把關鍵字與向量檢索拆成兩個 tool,用 prompt 控制選用策略
    • 在搜尋層加入 tenant_idvisibility 欄位與 filter,先確保權限過濾正確,再進一步調整 Hybrid 權重與 rerank 策略
  • 3 小時做出專屬雲端 AI 小幫手

    3 小時做出專屬雲端 AI 小幫手

    📌 本文重點

    • open-agents 是給前端工程師用的雲端 AI Agent 腳手架
    • 幫你處理好 Agent 架構、工具整合與雲端部署樣板
    • 3 小時內就能做出可上線、會調 API 的 AI 小幫手

    用一句話說清楚:Vercel 的開源專案 open-agents 是一套「前端工程師也能駕馭的雲端 AI Agent 腳手架」,幫你處理好架構、模型與工具整合,以及雲端部署樣板,3 小時內就能把一個可上線的 AI 小幫手跑起來。

    💡 關鍵: open-agents 把「3 小時內做出可上線 Agent」變成合理門檻,適合用來做快速 MVP 驗證。


    核心功能:open-agents 幫你省掉哪些麻煩?

    1. 標準化的 Agent 架構:不用自己設計「大腦」骨架

    在 open-agents 裡,你會碰到三個核心概念:

    • Agent:像「大腦」,負責看使用者輸入、決定要不要用工具、整理最後回答。
    • Tool:可以是 REST API、資料庫查詢、檔案讀寫等,Agent 可以選擇呼叫它們。
    • Memory:用來記住上下文或歷史對話,讓 Agent 回答更連貫。

    open-agents 做好的事:

    • 幫你定義好 Agent 的 TypeScript 介面與執行流程
    • 提供現成的 tool 呼叫機制(類似 OpenAI Agents SDK 的工具系統)
    • Memory 設計已經整合到框架中,不用自己處理 token 管理

    你可以做的行動

    • 把原本散落在專案裡的「AI 回答」「API 呼叫」邏輯收斂成一支 Agent
    • 把「查 FAQ」「查內部 API」「整理結果」交給同一個 Agent 流程,而不是寫一堆 if-else

    2. 工具 / 模型整合:一支 Agent 同時用多個 API

    open-agents 預設支援多家模型服務(含 OpenAI,對應最新的 Agents SDK 概念),也很容易接:

    • 便宜模型(例如 OpenAI 最新較低價型號)
    • 你現有的 REST API / GraphQL / 內部服務

    你只要:

    1. .env 放入 API Key(例如 OPENAI_API_KEY
    2. 在程式裡註冊工具,例如一個查訂單狀態的 REST API
    3. 把工具掛在 Agent 上,Agent 自己會決定何時呼叫

    你可以做的行動(兩個實用 workflow 範例):

    1. 客服 FAQ + 後端 API 查詢自動回覆 Bot
    2. FAQ:丟成向量資料或直接塞 prompt
    3. 工具:GET /orders/:id 查訂單,GET /user/:id 查會員
    4. Agent 邏輯:先看能不能從 FAQ 回答,不行再調 API,最後回傳整理好的訊息。

    5. 團隊內部文件檢索 + 任務整理助理

    6. Memory:保留本週的對話與任務
    7. 工具:一支「搜尋 Notion / Google Drive / 自家知識庫」的 API
    8. Agent:自動整理「這週待辦」「文件連結」,丟回 Slack/前端介面

    💡 關鍵: 一支 Agent 就能同時整合多個 API 和便宜模型,讓你用低成本做出實用的自動化工作流程。


    3. 雲端部署樣板:Next.js + Vercel 直接起飛

    open-agents 專案 本身就是一個可以部署到 Vercel 的樣板:

    • 內建 API routes,可以當成你的 Agent 後端
    • 前端可以用 Next.js / React 串同一支 Agent API
    • 與 Vercel 部署流程打通:GitHub 綁定 → 自動 CI/CD

    你可以做的行動

    • 先只改後端的 Agent + tool,保持前端 UI 簡單
    • 驗證 Agent 工作流程沒問題後,再慢慢優化 UI/權限

    適合誰用?幾個具體場景

    1. 前端工程師:想要一個「會用 API 的聊天小幫手」

    你手上可能已經有:

    • 一些 REST API(訂單、會員、專案、ticket…)
    • 一個 React/Next.js 專案

    只要把 open-agents 當成「AI 後端模板」,你就能做出:

    • 客服頁面裡的 FAQ + 訂單查詢 bot
    • 專案管理頁面的「自然語言查詢資料」側邊欄

    2. 團隊技術 owner:要做 MVP 的 AI 助理,但不想先上 MCP 這種大型架構

    根據「MCP for Backend Engineers」那篇文章的建議:

    1 app · 1 team · 1 toolset → 用簡單的 tool calling 就好,MCP 是 scaling 決策,不是起步點。

    如果你目前只有:

    • 一個 Web App
    • 一兩個後端服務

    那 open-agents 就剛好:

    • 架構不重,適合 MVP
    • 想擴展到多工具、多系統再慢慢抽象

    3. 產品/營運團隊身邊的「懂一點前端」的人

    只要會基本 TypeScript/React,照樣可以:

    • 改現有範例成「文件搜尋 + 任務整理」內部助手
    • 讓團隊先用起來,再決定要不要投入更多資源

    怎麼開始:3 小時完成「會調 API 的 AI 小助手」

    下面以「客服 FAQ + 訂單查詢 Bot」為例,走一次從 0 到可部署的流程。

    前提:你會基本 Git、Node.js、TypeScript,並有一個 GitHub 帳號。

    步驟 0:成本 & 免費方案心裡有底

    • open-agents 本身是免費開源
    • 模型費用:可使用 OpenAI 較低價模型,成本通常是每月幾美元起(視流量)
    • 部署:Vercel 有免費方案,適合開發 / 小流量 MVP

    💡 關鍵: 開源 + 便宜模型 + 免費部署方案,讓你可以「先上線再優化」,不必一開始就投入大量預算。


    步驟 1:從 GitHub 模板拉起專案

    1. 打開專案:https://github.com/vercel-labs/open-agents
    2. 點右上角 Use this template → Create a new repository
    3. 在自己的 GitHub 底下建立 repo
    4. 本機 clone:

    bash
    git clone https://github.com/<你的帳號>/<你的-repo>
    cd <你的-repo>
    pnpm install # 或 npm install / yarn

    1. 新增 .env.local,放入:

    bash
    OPENAI_API_KEY=sk-...

    此時行動pnpm dev 跑起來,確認預設的 Agent Demo 正常回覆。


    步驟 2:配置一個模型 + 建立簡單 REST Tool

    假設你要讓 Agent 查詢 GET https://api.example.com/orders/:id

    1. src/tools/orderTool.ts 新增:

    “`ts
    import { z } from “zod”;

    export const orderTool = {
    name: “get_order_status”,
    description: “根據訂單編號查詢訂單狀態”,
    parameters: z.object({
    orderId: z.string().describe(“訂單編號”)
    }),
    execute: async ({ orderId }: { orderId: string }) => {
    const res = await fetch(https://api.example.com/orders/${orderId});
    if (!res.ok) throw new Error(“查詢失敗”);
    const data = await res.json();
    return {
    status: data.status,
    items: data.items,
    total: data.total,
    };
    },
    };
    “`

    1. 在 Agent 定義中(例如 src/agents/supportAgent.ts),把這個 tool 加進去:

    “`ts
    import { createAgent } from “./baseAgent”;
    import { orderTool } from “../tools/orderTool”;

    export const supportAgent = createAgent({
    name: “support”,
    systemPrompt:
    “你是客服小幫手,先用 FAQ 回答,如果使用者提到訂單編號(像是 #12345),再用工具查詢訂單狀態,最後用中文整理回答。”,
    tools: [orderTool],
    });
    “`

    1. 模型設定通常在 baseAgent 或 config 檔裡(視專案結構),選一個便宜模型,例如:

    ts
    model: "gpt-4.1-mini" // 範例,視官方文件更新調整

    此時行動:在本機跑 server,從 Agent API 打一個 request,例如:

    「我有一筆訂單 #12345 ,請幫我看目前出貨狀態」

    觀察 log,確認 Agent 會:

    • 自動偵測訂單編號
    • 呼叫 get_order_status 工具
    • 整理成可讀中文回答

    步驟 3:接一個簡單前端(Next.js / React)

    如果你用 Next.js

    1. /app/api/chat/route.ts 建一個 API route,轉發到 supportAgent

    “`ts
    import { NextResponse } from “next/server”;
    import { supportAgent } from “@/agents/supportAgent”;

    export async function POST(req: Request) {
    const { message } = await req.json();
    const reply = await supportAgent.run({ input: message });
    return NextResponse.json({ reply });
    }
    “`

    1. 在前端頁面建一個最簡聊天 UI:

    “`tsx
    “use client”;
    import { useState } from “react”;

    export default function ChatPage() {
    const [input, setInput] = useState(“”);
    const [messages, setMessages] = useState([]);

     const send = async () => {
       const res = await fetch("/api/chat", {
         method: "POST",
         headers: { "Content-Type": "application/json" },
         body: JSON.stringify({ message: input }),
       });
       const data = await res.json();
       setMessages((m) => [...m, `你:${input}`, `Bot:${data.reply}`]);
       setInput("");
     };
    
     return (
       <div>
         <div>{messages.map((m, i) => (
           <div key={i}>{m}</div>
         ))}</div>
         <input value={input} onChange={(e) => setInput(e.target.value)} />
         <button onClick={send}>送出</button>
       </div>
     );
    

    }
    “`

    此時行動:在本機 UI 輸入訂單問題,看是否能走完整流程「輸入問題 → Agent 決定要不要調 API → 回傳整理後答案」。


    步驟 4:一鍵部署到 Vercel

    1. 把程式 push 到 GitHub
    2. Vercel 登入 → New Project → 選你的 repo
    3. 在 Vercel Project 的 Environment Variables 中填入:
    4. OPENAI_API_KEY
    5. 其他內部 API 的 token(若有)
    6. 部署完成後,拿到一個網址,例如 https://your-agent.vercel.app

    成本提示

    • 小流量下 Vercel 免費方案通常足夠
    • 模型費主要取決於:使用人數 × 對話長度 × 模型單價
    • 有預算疑慮時,可以先用小模型做 MVP,流量上來再調整

    延伸玩法 & 心智模型

    • 想接更多內部系統?就把每個系統包成一個 tool,掛在同一個 Agent 或拆成多個 Agent。
    • 想做內部文件助理?多加一個「文件搜尋 API」,Agent 再負責整理成待辦或重點摘要。
    • 覺得專案變大、團隊變多?再考慮引入 MCP / API Gateway,把目前的 tools 重構即可。

    如果你今天只想要「一個會用你的 API 的雲端 AI 小幫手」,照著上面四個步驟做完,你就已經比大多數還停在概念階段的人,多了一個真正跑在雲端的 Agent。動手開一個 open-agents 專案,從一個最簡單的 tool 開始,就行了。

    🚀 你現在可以做的事

    • 開啟 open-agents GitHub 專案,用 Use this template 建一個自己的 repo
    • 在專案裡實作一個最簡單的 REST tool(例如查訂單或查專案狀態),掛到一支自訂 Agent 上
    • 用 Vercel 免費方案部署這個 Agent,丟給團隊實際試用並收集回饋
  • 把 ChatGPT 搬進 iPhone:Gemma 4 實戰

    把 ChatGPT 搬進 iPhone:Gemma 4 實戰

    一句話定位:Gemma 4 讓你在 iPhone 上離線享受「接近 ChatGPT」的體驗,所有資料留在手機裡不出門。

    📌 本文重點

    • 在 iPhone 本地跑 Gemma 4,可離線又保護隱私
    • 用 Gemma 4 做聊天、翻譯、PDF/筆記問答與日記分析
    • 依照步驟完成「PDF/筆記 → 總結 + 問答」 workflow
    • 開發者可在手機上做無後端的 LLM 原型實驗

    下面的內容會帶你搞清楚:為什麼要在手機本地跑 Gemma 4、它能做什麼、適合哪些人用,以及最重要的——怎麼一步步在 iPhone 上跑起來,做到「把 PDF/筆記丟進去就能問答」

    參考:Gemma 4 本地推理在 iPhone 上的討論,可見 Gizmoweek 報導 與 Hacker News 熱門串。


    核心差異:為什麼要在 iPhone 本地跑 Gemma 4?

    先把雲端模型(ChatGPT、Gemini)和本地 Gemma 4 的差異講清楚:

    • 隱私
    • 雲端:你的對話、上傳檔案會經過伺服器。
    • 本地:模型在 iPhone 上推理,日記、醫療筆記、合同草案都不離開手機

    • 離線可用

    • 雲端:沒網路、飛機上、海外被限制時就完全失效。
    • 本地:Gemma 4 可以在飛機、公車、海外出差時照常回覆、翻譯、寫作。

    • 延遲穩定

    • 雲端:高峰期會卡、會 timeout,速度跟網路品質綁死。
    • 本地:只看你 iPhone 效能,體感像打字機,多數短文秒回

    💡 關鍵: 把 Gemma 4 放在 iPhone 本地跑,可以在無網路狀態下,用接近 ChatGPT 的體驗處理高度隱私與長文內容。

    如果你有「這些東西我不想丟到雲端」的內容,或常常沒網路,Gemma 4 在 iPhone 上會立刻變成高頻工具,而不是備胎。


    核心功能:你在 iPhone 上實際能做什麼?

    1. 對話與寫作助手(接近 ChatGPT 體驗)

    在支援本地 LLM 的 App 裡載好 Gemma 4 後,你就能:

    • 像聊天一樣問問題、整理想法
    • 寫 email 草稿、會議摘要、腳本、貼文
    • 讓它用你的語氣重寫文字(例如「幫我改成比較口語」)

    行動建議: 安裝一個本地 LLM App(下面「怎麼開始」會列),先用 Gemma 4 當純文字聊天助手,感受速度與溫度、耗電,再決定要不要開更大的模型。

    2. 本地長文與知識庫分析

    Gemma 4 支援長上下文版本(有社群實測用 26B + 256k context 分析十萬字日記,見 Reddit 分享),放在 iPhone 上就可以做:

    • 整本 PDF 報告丟進去請它重點整理
    • 長期筆記/子彈筆記匯總,問它「幫我找出過去一年我最常抱怨的三件事」
    • 針對整個專案文件問答(而不是只看一頁)

    💡 關鍵: 長上下文的 Gemma 4 能處理十萬字等級的內容,適合把整本報告或多年日記一次交給手機上的模型分析。

    行動建議: 準備 1–2 份你真正在看的 PDF(研究報告、投影片),等下在 workflow 範例中會用到。

    3. 手機端開發實驗(快捷指令 + 簡單 App)

    對開發者或自動化玩家,Gemma 4 在 iPhone 上的價值在於:

    • 不用伺服器,就能在手機上測試 LLM 原型
    • 用 iOS 快捷指令 + 本地 LLM App 做簡單 Agent:
    • 選取文字 → 呼叫 Gemma 4 重新整理/翻譯
    • Share Sheet 把檔案丟給 Gemma 4 總結
    • 若走原生路線,可用 Core ML / Metal 把轉好的 Gemma 4 模型 embed 到 Xcode 專案裡

    行動建議: 如果你是 iOS 開發者,先用現成 App 測試好 prompt 與模型尺寸,再考慮用 Core ML 導入;這樣可以避免一開始就卡在部署。相關量化思路可對照 Google 在 Apple Silicon 上的 TurboQuant 技術介紹(參考 Towards AI 文章)。


    適合誰用?三個典型場景

    1)個人知識庫與日記:所有東西都留在手機

    適合這些人:

    • 有多年日記、心理諮商紀錄、醫療紀錄
    • 研究生、創作者,有大量私人筆記
    • 對雲端隱私完全不放心

    可以做的事:

    • 把日記匯出成純文字 / Markdown,分段丟給 Gemma 4:
    • 「找出我反覆提到但沒有行動的目標」
    • 「整理這一年,我對工作的情緒變化」
    • 對敏感筆記做聚合搜尋與摘要,不經過任何第三方伺服器。

    立即行動: 先在 iPhone 裡整理一個「私人 LLM 資料夾」,放日記匯出檔、健康紀錄,後面 workflow 直接用這個資料夾測試。

    2)出差 / 通勤沒網路的翻譯與寫作

    適合這些人:

    • 常飛機、常坐高鐵/地鐵、跨國出差
    • 在國外有網路限制,雲端 AI 不穩

    可以做的事:

    • 把待回的英文信貼進去:「幫我寫一封比較禮貌但堅決的英文回覆」
    • 開會前在車上,用 Gemma 4 把簡報講稿縮短成 5 個 bullet
    • 旅行時拍照 + OCR 轉文字後,丟給 Gemma 4 做即時翻譯與說明

    立即行動: 下次搭車前,把常用的翻譯/寫作 prompt 存成備忘錄,沒網路時直接複製給 Gemma 4 用。

    3)開發者在手機上做原型與小工具實驗

    適合這些人:

    • iOS 工程師、快捷指令玩家
    • 想做「不需要後端」的 AI 小工具

    可以做的事:

    • 寫一個快捷指令:
    • 取得目前剪貼簿文字
    • 傳給本地 Gemma 4 App
    • 回傳整理後文字,直接覆蓋剪貼簿
    • 在 Xcode 專案中,用 Core ML 模型當 offline 助手(例如:程式碼註解生成、App 內 FAQ 問答)

    立即行動: 先在本地 LLM App 裡找到「URL Scheme / x-callback-url」或「Shortcut 支援」,確認能否被快捷指令呼叫,這會是你所有原型的入口。


    怎麼開始:在 iPhone 上跑 Gemma 4 的最短路徑

    先給一個工具選擇對照表(以 2026 年常見方案為例,實際名稱請依 App Store 為準):

    名稱(示例) 核心功能 免費方案 適合誰
    LM Studio Mobile 下載並在本地跑 LLM(含 Gemma 4)、聊天介面、檔案上傳 常見為免費 + 內購 想要「裝好就能用」的一般使用者
    MlcChat for iOS 基於 MLX / MLC 的高效本地推理,支援多模型 通常開源、免費 想試不同模型、在意性能的玩家
    自建 Core ML App 直接在 App 內嵌 Gemma 4 Core ML 模型 自行開發 iOS 開發者,要做產品原型

    實際請搜尋「local LLM」「offline AI」關鍵字,並確認是否支援 Gemma 4 款式或通用 GGUF / MLC 格式。

    步驟 1:選一個 App + 安裝

    1. 打開 App Store,搜尋:local LLMoffline AIMLC Chat 等關鍵字。
    2. 看描述裡有沒有提到 Gemma 4 或「自訂模型 / GGUF / MLC」支援。
    3. 安裝後確認:
    4. 是否有「下載模型」功能
    5. 是否支援「匯入檔案」或「knowledge base / documents」

    步驟 2:選擇合適尺寸的 Gemma 4 模型

    iPhone 上不要一開始就上最大顆,會太熱又太慢。可依照:

    • 中階機種(A15 / A16、基本容量)
    • 建議:Gemma 4 2B–4B 量化模型(例如 Q4 / Q5
    • 用途:聊天、筆記整理、短文翻譯

    • 高階 Pro / Max(A18 Pro 類級別,RAM 8GB+)

    • 建議:Gemma 4 9B 左右的量化模型,若 App 支援可試長上下文版本
    • 用途:較長文章摘要、本地知識庫問答

    行動建議: 先下載一個 2B–4B 模型,跑幾分鐘聊天測試溫度。如果手機發燙明顯,就把 thread 數調低或換更小模型。

    步驟 3:測試性能、溫度與耗電

    1. 開啟 App,載入 Gemma 4 模型。
    2. 問它一個中等長度 prompt,例如:

    「請用條列整理 Netflix 訂閱變貴時,使用者常見的三種反應,控制在 200 字內。」

    1. 觀察:
    2. 生成 200 字大約需要幾秒?
    3. 手機背面溫度明顯變熱嗎?
    4. 連續用 10 分鐘後,電量大約掉多少?

    5. 在 App 設定中調整:

    6. 推理 thread(有時稱為「CPU 核心數」「推理執行緒」)
    7. 最大輸出 token 數(不必要就別一次開超大)

    目標狀態

    • 你可以連續聊 10–15 分鐘,手機只是微熱,耗電還在可接受範圍。

    步驟 4:實戰 Workflow —— 把 PDF/筆記丟給 Gemma 4 做總結與問答

    示範一個你可以直接照做的流程:

    1. 準備檔案
    2. 在檔案 App 建一個資料夾:LLM-Inbox
    3. 把一份 PDF(例如 20–30 頁的報告)或匯出的日記 .txt 放進去。

    4. 在 App 裡建立「知識庫」或上傳文件

    5. 打開你的本地 LLM App,找到「Documents / Knowledge / Files」等選項。
    6. 選擇 LLM-Inbox 裡那個檔案上傳或索引。

    7. 設定一個專門對話空間

    8. 新建一個對話,命名成「某某報告 Q&A」。
    9. 在 system prompt(如果有)寫上:

      「你只能根據我上傳的文件回答問題,不要憑空猜測。回答用繁體中文。」

    10. 實際問問題

    11. 「請用 300 字總結這份報告的主要結論。」
    12. 「作者提出的三個建議是什麼?幫我用自己的話改寫。」
    13. 「如果我要做 5 分鐘簡報,應該只挑哪三個 key slide?」

    14. 優化體驗

    15. 如果覺得速度太慢:
      • 換更小的 Gemma 4 模型
      • 限制回答字數,例如「控制在 150 字內」
    16. 如果回答常飄走:
      • 再加一句規則:「如果文件沒有提到,就回答『文件未提及』。」

    完成這個 workflow 後,你就已經不是「玩玩看」而是把 Gemma 4 變成日常讀書 / 工作輔助工具。接下來才是微調 prompt、換更大模型或試試手機端原型開發。

    💡 關鍵: 只要先打通「PDF/筆記 → 總結 + 問答」,Gemma 4 就能穩定接手你日常的讀書、報告與資料整理工作。


    總結:先把一件小事做通,再考慮玩更大

    在 iPhone 本地跑 Gemma 4,不需要一次搞懂所有量化格式、Core ML 細節。建議你照這個順序:

    1. 找一個支援本地模型的 iOS App
    2. 下 1 個中等大小的 Gemma 4 模型
    3. 完成「PDF/筆記 → 總結 + 問答」這個 workflow
    4. 覺得穩定好用,再往日記分析、快捷指令、自建 App 擴展

    做到第 3 步,你就已經把「接近 ChatGPT 的體驗搬進 iPhone,而且可離線」真正落地了。

    🚀 你現在可以做的事

    • 打開 App Store 搜尋「local LLM / offline AI」,安裝一個支援 Gemma 4 或 GGUF 的 App
    • 準備一個 LLM-Inbox 資料夾,把一份 PDF 或日記 .txt 放進去,按文中步驟跑完一次總結 + 問答
    • 觀察 10–15 分鐘使用時的速度與溫度,調整模型大小與 thread 設定,找出最適合你 iPhone 的組合
  • 把聊天機器人變重罪,是愚蠢的 AI 監管

    把聊天機器人變重罪,是愚蠢的 AI 監管

    📌 本文重點

    • 田納西擬將聊天機器人列為一級重罪
    • 法案以「禁止整個類別」取代精準監管
    • 恐慌式立法將打擊創新並侵蝕公民自由

    把寫聊天機器人定成一級重罪,不是「AI 安全」,是立法理性的崩壞。田納西州 HB1455/SB1493 走的是用刑法封殺整個產品類別的「禁止式立法」,不只對產業是毒藥,也在蠶食公民自由。這不是一州內政,而是一個會被複製的危險示範。


    HB1455/SB1493 的真正範圍:幾乎任何能聊天的 AI 都踩線

    先看條件設計。根據公開的條文說明與社群整理,這個法案把以下行為拉進 Class A felony(一級重罪,15–25 年刑期,和謀殺同級)

    「明知而訓練 AI,使其提供情感支持、作為伴侶、模擬人類、或從事足以讓使用者產生關係感的開放式對話。」

    💡 關鍵: 法案把「訓練可產生情感陪伴的 AI」本身視為和謀殺同級的一級重罪,而不需任何實際受害結果。

    問題在於,這個定義幾乎覆蓋了所有現代聊天式 AI 產品

    • 任何能「閒聊」的客服 bot:用戶說「最近好累」,AI 回一句「辛苦你了」,是否就構成「情感支持」?
    • companion AI(Replika、character.ai 類):明顯直擊條文本意,等於整個業態被一刀砍掉。
    • 開發者把 open-source LLM 做成 Telegram bot,跟使用者聊天、提醒喝水、記心情——同樣有「關係感」風險。
    • 只要你在田納西境內「提供、部署、或營運」這類系統,就可能落入刑責,不分個人、小團隊或大型公司。

    這不是針對「詐騙 bot」「操縱選舉」這種特定惡意用途,而是對「情感互動型 AI」這整個類別宣戰。它不是管行為,而是管「類型」——類型本身即犯罪。

    從法技角度看,這是非常粗暴的立法模式:

    • 行為結果不重要:不必證明有人受害、被詐騙、被精神控制,只要「訓練了」就觸法。
    • 意圖界定模糊:如何證明「明知」會產生情感關係?產品 FAQ 寫「這不是心理諮商」就算免責?幾乎不可能。
    • 刑度極端失衡:把聊天機器人的風險,法律上等價於殺人與性侵,是典型的道德恐慌式量刑。

    💡 關鍵: 這種以「類型即犯罪」的設計,讓任何做聊天功能的開發者都處在不可預測的刑事風險之下。


    對比歐盟 AI Act、伊州責任案:田納西選擇了「不管怎麼做,先禁了再說」

    把 HB1455/SB1493 放回全球監管脈絡來看,就更顯得失衡。

    歐盟 AI Act 的路徑是:

    • 按用途分風險等級:從「不可接受風險」到「高風險」,再到一般用途。
    • 對高風險系統要求 透明、可解釋、資料治理、第三方審計,但沒有把整個「聊天機器人」品類刑事化
    • 對情感互動,重點放在標示義務與脆弱族群保護,例如不得偽裝成人與兒童互動,但仍允許在框架下創新。

    再看最近的 伊利諾伊 AI 責任豁免案

    • OpenAI 支持一個「極端責任上限」法案,希望在大規模傷害(大量死亡或超過 10 億美元 損失)時仍能得到相當程度豁免。
    • Anthropic 罕見地公開反對,認為這會削弱安全動機,讓實驗室在巨災級風險上「財務無上限,責任有上限」。

    💡 關鍵: 一邊是將超過 10 億美元損失都能部分豁免責任,一邊是寫 chatbot 就可能被關 15–25 年,兩者共同顯示當前 AI 立法的失衡與極端化。

    這兩個案子雖然方向相反——一個是責任過輕,一個是責任過重——但都圍繞一個問題:

    AI 要怎麼被「負責地」允許存在?

    歐盟 AI Act、伊州責任案都是在討論「如何管」:責任邊界畫在哪、稽核怎麼做、誰能起訴誰。田納西 HB1455/SB1493 則直接跳過這些細節,選擇更原始的路線:

    「這東西太可怕,直接禁。」

    從政策設計角度,這是把治理難題外包給刑法,把細膩的監管問題,粗暴等同於毒品或黑槍:整類禁止,執法機關看誰不順眼就抓誰。


    產業:chilling effect 會沿供應鏈一路凍到開源社群

    對產業來說,這會產生嚴重的 chilling effect(寒蟬效應)

    1. 大型公司收縮產品線與地域覆蓋
      Big Tech 可以請一整隊律師,但面對「15–25 年徒刑」這種風險,多數法務部門的直覺策略只有一個:

    2. 乾脆在田納西 全面關閉對話型與伴侶型功能,或直接不服務該州用戶。

    3. 產品設計上避開任何被解讀為「情感支持」「伴侶」的表述,導致對話體驗被刻意「去人性化」。

    4. 中小 SaaS 與新創直接被「嚇死」
      對個人開發者、兩三人團隊,新法帶來的是:

    5. 只要用戶可能在田納西,你要嘛做 IP 阻擋,要嘛乾脆不做聊天功能

    6. 風險評估成本、合約成本大幅提高,讓本來可行的社交/companion/agent 創業案變得不值得試。

    7. 開源作者與基礎模型提供者被迫退出某些場景
      如果「明知」某模組可被用來做伴侶 AI 就可能觸法,開源作者會被迫在 License 中塞入越來越多「不准用作 X」條款,甚至:

    8. 不再提供聊天範例程式碼。

    9. 刻意降低模型在社交語境中的可用性,以避免被指責「刻意訓練」。

    結果是:真正願意合規、願意多做安全與標示的玩家被趕出場,留下的會是地下市場與境外灰色服務。


    權利與倫理:國家以「防情感操縱」為名,實際是在剝奪選擇權

    HB1455/SB1493 的政治包裝很誘人:

    「保護民眾免於 AI 情感操縱,避免孤獨者被虛假關係傷害。」

    但這個敘事有三個問題:

    1. 把心理健康問題全部外包給科技產品
      孤獨、憂鬱、自殺風險,是公共衛生與社會結構問題。把焦點鎖在「companion AI 太可怕」,實際上是在逃避政府本來應該做的:

    2. 擴充心理健康服務與補助

    3. 支持線上諮商、匿名支持社群
    4. 改善保險與就醫的可負擔性

    5. 剝奪真正需要的人使用工具的權利
      對很多人來說,AI 伴侶不是「取代人」,而是現實人際網路缺位時的低門檻選項

    6. 輕度社交焦慮者,用 AI 練習對話再去面試。

    7. 夜班工作者,在深夜沒有真人服務時,用 bot 抒發情緒,至少不會完全孤立。

    你可以討厭這種依賴,但用刑法把它砍掉,實質效果是:只剩得起心理諮商的人有選擇,窮人沒有。

    1. 情感操縱問題不是「有沒有聊天」,而是「能不能被追責」
      真正值得管的是:

    2. 是否有明確標示「這是 AI,不是專業心理師、不具醫療資格」。

    3. 是否有記錄與審計機制,能調查高風險設計(例如誘導付費、煽動自殘)。

    這些都可以透過 透明+責任+審計 模型來實作,而不是用一條重罪法把所有可能良性的情感互動一同抹殺。


    技術與治理:地下服務照樣存在,創新成本全面拉高

    從治理效果來看,HB1455/SB1493 也很低效:

    • 高風險 AI 不會因此消失:真正想做操縱式 bot 的人,完全可以跑到海外服務、匿名託管,繞過州法。
    • 可見、可合作的合規玩家會選擇退出:越守法、越在美國本地設公司的團隊越容易被打到,因為最容易執法。
    • 創新成本被迫內嵌「刑事風險折扣」:任何做情感互動功能的產品,都必須在投資與估值時計入「哪天哪州跟進田納西」的風險溢價。

    與其說這是在「防範 AGI 風險」,不如說這是在把整個產業往 高門檻、少玩家、少開源 的方向推,最後只剩下少數巨頭能負擔合規與遊說成本,創新多樣性反而下降。

    這剛好呼應 斯坦福 2026 AI Index 的觀察:技術狂飆、公眾信任下滑、政策恐慌上升。田納西案就是恐慌如何具象成條文的教材版本。


    結論:需要的是「管得嚴」不是「一口氣禁掉」

    情感互動型 AI 絕對需要強監管,這點沒有爭議。但「強」不等於「粗暴」。如果你是開發者或產品決策者,現在有三件事值得立刻做:

    1. 把立場寫出來,加入公開政策對話
      不要再以為「政治離我很遠」。寫 blog、在公司立場聲明中明講:

    2. 支持對情感 AI 的 透明標示、使用者權利告知、審計與事後責任追究

    3. 反對用刑法封殺整個產品類別、把工程師當潛在重罪犯的立法路線。

    4. 在產品設計上,主動實作你希望立法者「寫進法裡」的好做法
      包含:

    5. 清楚標註 AI 身分與非醫療性質。

    6. 提供一鍵導出聊天記錄、刪除個資的權利。
    7. 對高風險場景(自殘、虐待、極端孤獨)設計安全護欄與轉介資源。

    8. 在公司與社群內部,把「恐慌式法案」當作真實風險來管理

    9. Legal/Policy 不再只是附屬功能,而是產品策略的一部分。

    10. 給開源專案與獨立開發者渠道,讓他們能夠加入業界聯盟、共同回應法案。

    如果現在創作者與產業保持沉默,HB1455/SB1493 不會是最後一個,而會是模板。接下來我們會看到更多以恐懼為基礎的 AI 立法在不同州、不同國家被複製;等你發現自己的 side project 也可能是重罪,那就太遲了。

    真正值得追求的,是一個讓 AI 伴侶可以被嚴格監管、可被追責、對使用者誠實透明的框架,而不是一個讓寫 chatbot 的工程師隨時可能被當成殺人犯辦理的世界。

    🚀 你現在可以做的事

    • 追蹤 HB1455/SB1493 與相關州法進度,並在公開諮詢或社群平台上提交具體意見
    • 在自己的產品或專案中,實作清楚標示、資料導出與高風險場景安全護欄,作為「負責任情感 AI」範本
    • 與同業、開源社群或公司法務合作,參與產業聯盟或倡議組織,共同回應恐慌式 AI 立法
  • 把常用 Prompt 變成一鍵技能:Chrome AI Skills 實測

    把常用 Prompt 變成一鍵技能:Chrome AI Skills 實測

    📌 本文重點

    • Chrome Skills:把常用 Prompt 變成一鍵工具
    • 可跨網站、多分頁套用同一個 Skill
    • 非技術同事也能用的標準化 AI 工作流程
    • 適合團隊共用固定模板與報表解讀

    一句話先說清楚:Chrome 的「AI Skills」= 把你常用的 Prompt,變成可以隨時一鍵呼叫的小工具,不用再到處找、複製貼上。

    官方介紹: Turn your best AI prompts into one-click tools in Chrome(Google AI Blog)


    核心功能:把 Prompt 做成「可重複的一鍵技能」

    1. 儲存 / 命名 / 重用你的 Skills

    你在 Gemini 側邊欄打的任何 Prompt,都可以存成一個 Skill:

    • 操作概念
    • 先在側邊欄對 Gemini 下指令(例:請幫我用禮貌英文回覆客戶…)。
    • 覺得這個 Prompt 之後會常用,就直接存成 Skill。
    • 下次在任何網頁,只要一鍵點這個 Skill,就能套用到當前頁面的內容。

    • 能客製化的部分:

    • 幫 Skill 取一個好記的名字(例:「英文客服回覆」、「報表解讀」)。
    • 說明它是拿來做什麼的,方便同事看得懂。

    💡 關鍵: 把高頻重複的 Prompt 存成 Skill,可以用「一鍵點擊」取代每次複製貼上與重寫指令。

    你可以立刻做的事
    先想 3 個你每天都會重複貼給 AI 的 Prompt,等一下在「怎麼開始」小節,直接把它們變成 Skills。

    2. 官方預設技能庫:先用現成的再改

    Google 在 Chrome 的 Gemini 側邊欄,內建了一批「預設 Skills」,常見例子(見 Wired 介紹):

    • 食譜優化:例如「最大化蛋白質含量」或改成純素、低卡版。
    • YouTube / 長文總結:幫你抓重點,整理成條列。

    你可以:

    • 先直接用這些現成 Skills。
    • 再把你調整過的 Prompt 版本,存成自己的自訂 Skills(Google 官方文也強調可「discover, save and remix AI workflows」)。

    你可以立刻做的事
    打開 Gemini 側邊欄,先試用 1 個預設 Skill(例如「Summarize this video」),再把回答風格微調後存成自己的版本。

    3. 在任何網頁側邊欄一鍵呼叫

    根據 TechCrunch 與 The Verge 的說明,Skills 的重點是:

    • 跨網站、跨分頁 使用同一個 Skill。
    • 勾選多個 Tab,一次對多個頁面跑同一個 Skill(例如一口氣總結 3 則產品更新頁)。

    實際效果:

    • 你不用再:
    • 開 Notion / Google Docs 找那段老 Prompt。
    • 複製貼上到 Gemini。
    • 只需要:
    • 打開側邊欄 → 點你命名好的 Skill → 選擇要套用的分頁。

    你可以立刻做的事
    打開 2–3 個需要處理的頁面(例如不同客戶信、不同產品頁),試一次「同一 Skill 跑多個分頁」。


    適合誰用?4 個實際場景示範

    1. 批改英文 Email:固定語氣、固定格式

    使用方式:

    1. 在 Gemini 側邊欄寫一個完整 Prompt,例如:

      「請幫我把選取的英文 Email 改寫成禮貌、簡潔、B2B 科技公司口吻,保留原本資訊,但語氣更友善、用詞自然。」

    2. 存成 Skill:命名為「英文客服回信優化」。
    3. 之後每封英文信:
    4. 在 Gmail 開信 → 開側邊欄 → 點這個 Skill → 貼入草稿內容或讓它讀取頁面內容。

    行動建議:
    – 先為 「英文回覆」和「英文道歉信」 分別各做一個 Skill,之後全部照這兩種模板改。

    2. 食譜轉成低卡 / 純素版

    The Verge 舉例,過去你每換一個食譜頁面,就要重新輸入「幫我改成純素版」。現在可以:

    1. 建立 Skill:

      「閱讀這個網頁中的食譜,將其改寫成純素版本,提出必要的食材替代方案,並計算每份大致卡路里。」

    2. 命名為「純素 & 低卡改寫」。
    3. 之後遇到任何食譜頁面,只要一鍵點這個 Skill。

    行動建議:
    – 如果你有特定飲食需求(低醣、高蛋白),為每種飲食習慣做一個專屬 Skill。

    3. 總結長文 / YouTube:變成「固定摘要格式」

    基於 Wired 的範例,你可以把「摘要」做得更標準化:

    1. 在一篇長文章或 YouTube 頁面上,對 Gemini 說:

      「請用繁體中文,幫我整理為:1)三點重點;2)一段 100 字內摘要;3)列出適合轉貼到 Slack 的一句話。」

    2. 存成 Skill「內容三段式摘要」。
    3. 之後任何長文 / 影片都可以套用同樣格式。

    行動建議:
    – 為「給自己看的摘要」和「給團隊看的摘要」各自定義格式,做成兩個 Skills。

    4. 固定格式報表 → 自動生成解讀摘要

    你可能每週都要解讀一份長得很像的數據報表(GA4、廣告報表、CRM 匯出):

    1. 建立 Skill Prompt:

      「閱讀當前頁面的數據表格,幫我用以下格式解讀:
      1)本週 vs 上週差異;2)異常指標與可能原因(列出 3 點假設);3)下週建議行動(列出 3 個具體操作)。請用條列,長度控制在 300 字內。」

    2. 命名為「每週數據解讀 300 字」。
    3. 套用在每週固定打開的報表分頁上。

    行動建議:
    – 先選一份你 最常被問要解釋的報表,為它設計一個專用 Skill,讓 AI 先產出初稿,再微調。


    Workflow 範例:為公司建立一套「團隊共用 Skills」

    雖然 Google 尚未完全打開「公開 Skill 市集」,但你可以先用很簡單的方法做「團隊半共用」。

    1. 客服回覆模板

    1. 在文件中定義好客服回覆規則,例如:
    2. 語氣(專業、溫和、不推責)。
    3. 固定結尾句(例如邀請進一步聯絡)。
    4. 把這段規則寫進 Prompt,存成 Skill「客服標準回覆」。
    5. 把這段 Prompt 原文和「如何新增 Skill」的教學,傳給全團隊,讓大家在各自的 Chrome 裡建一模一樣的 Skill。

    2. 產品 Changelog 生成流程

    假設你每次發版,都要:

    • 從 issue tracker / Git log 撈出變更。
    • 寫成「用戶看得懂的版本更新說明」。

    可以這樣設計 Skill:

    「根據這個頁面的變更紀錄,幫我生成一份產品 Changelog,格式為:1)標題一句話;2)三個重點功能更新;3)一段給現有用戶看的說明(100 字內);4)一段給內部同事看的技術摘要(150 字內)。」

    流程建議:

    1. PM 在自己瀏覽器裡先調到滿意的 Prompt,再存成 Skill。
    2. 把 Prompt 原文放進團隊知識庫(Notion / Confluence),讓其他同事照樣建立。

    你可以立刻做的事
    選一個你們團隊「每週都會重複做、但內容每次都不一樣」的工作(公告、週報、教學信),先為它寫一個完整 Prompt,再交給全員自己建 Skill。


    實作教學:如何在 Chrome 開啟、建立與使用 Skills

    注意:Skills 目前在 桌面版 Chrome 並搭配 Gemini 側邊欄 的環境下提供,實際入口可能會隨版本更新微調,以下以官方 Blog 和多家媒體描述整理出典型流程。

    1. 在哪裡開啟 Skills(設定路徑)

    1. 更新 Chrome 至最新版本。
    2. 登入你的 Google 帳號。
    3. 在右上角找到 Gemini 圖示 或從側邊欄開啟 Gemini(有些版本是「使用 Gemini」按鈕)。
    4. 若已開放 Skills 功能,會在側邊欄看到 Skills 區塊或「Save as Skill」類似選項(可持續留意:TechCrunch 報導)。

    行動建議:
    – 先確認你能在 Chrome 裡正常使用 Gemini 側邊欄,再來找 Skills 相關選項。

    2. 如何從現有 Prompt 儲存成 Skill

    1. 打開任一網頁(例如 Gmail、文件、報表)。
    2. 開啟 Gemini 側邊欄,輸入你想重複使用的 Prompt,先讓它跑一次,調整到你滿意的回答風格。
    3. 在這則對話附近,尋找「Save as Skill」或「Create Skill」按鈕(介面可能是三點選單裡的選項)。
    4. 設定:
    5. Skill 名稱(簡短但具體,例如「GA4 每週報告摘要」)。
    6. 說明 / Tag(方便未來辨識)。
    7. 儲存後,它就會出現在 Skills 清單中。

    行動建議:
    – 第一次先存 1 個 Skill,不要一次做太多,確保你真的會用它,之後再慢慢擴充。

    3. 如何在多個 Tab 上使用 Skills

    根據 The Verge 的說明,Skills 可以在多個分頁上重複使用,典型操作如下:

    1. 開啟多個相關分頁,例如:3 篇產品更新文章、或 3 份不同客戶的簡報頁。
    2. 打開 Gemini 側邊欄 → 選擇你要用的 Skill。
    3. 在 Skills 介面中,選擇要套用的 Tab(有些版本可能支援勾選多個)。
    4. 按下執行,AI 會依序對每個分頁運行該 Skill,生成各自的結果。

    行動建議:
    – 嘗試在 兩個很相似的頁面(例如兩個競品產品頁)使用同一個 Skill 做比較分析,快速得到可對照的結果。


    與「複製貼上 Prompt」相比的優勢

    傳統做法

    • 在 Notion / Google Docs / 備忘錄保存一堆 Prompt。
    • 每次要用時:切換視窗 → 複製 → 回到瀏覽器 → 貼上 → 再調整。

    用 Skills 的差別

    1. 少一步切換工具:Prompt 就在 Chrome 裡,直接點名字就套用。
    2. 減少 Version 混亂:不用在多個文件裡找「最新版 Prompt」,你只維護同一個 Skill。
    3. 跨分頁一致性:同一個 Skill 直接套在不同頁面,輸出風格一致,特別適合報表解讀、客服回覆、摘要格式。
    4. 更適合非技術同事:他們不需要理解什麼是 Prompt Engineering,只要知道「遇到這種工作,就點這個 Skill」。

    💡 關鍵: 把分散在文件裡的常用 Prompt 收斂成少量核心 Skills,可以同時解決「效率低」與「輸出不一致」兩個問題。

    你可以立刻做的事
    – 把你目前收藏 Prompt 的文件打開,挑出 最常用的前 3 個,優先轉成 Skills,其餘的保持在文件裡即可。


    和其他瀏覽器 AI 外掛有什麼不同?

    目前許多 AI 外掛(如各種 ChatGPT / Gemini / Claude 插件)也能在網頁上跑 Prompt,但 Chrome 原生 Skills 有幾個實際差異:

    比較項目 Chrome AI Skills 一般瀏覽器 AI 外掛
    整合程度 直接整合在 Chrome 與 Gemini 側邊欄 需額外安裝擴充功能
    Prompt 儲存方式 以「Skill」形式命名、可跨分頁一鍵呼叫 多為歷史記錄或簡單書籤,重用流程較散亂
    多分頁操作 官方說明可對多個 Tab 套用同一 Skill 多數外掛只對目前分頁或需逐一操作
    團隊共用 目前以「共用 Prompt 文本、各自建立 Skill」為主 有些外掛有雲端模板共享,但使用體驗不一
    安全與權限 跟隨 Google 帳號與官方隱私設定 視外掛開發者而定,需額外確認權限

    如果你已經習慣用某個外掛,可以:

    • 把外掛裡最常用的 Prompt,手動搬到 Chrome 的 Skills,讓「真正會每天用到的那幾個」留在瀏覽器原生工作流程中。

    💡 關鍵: Skills 的優勢不是「功能更多」,而是「離真實工作場景更近」,把 AI 變成瀏覽器內建的工作按鈕。


    怎麼開始:3 步驟快速上手

    1. 確認環境
    2. 更新 Chrome → 登入 Google 帳號。
    3. 確認你能在瀏覽器右側打開 Gemini 側邊欄。

    4. 選出你的「前三名常用 Prompt」

    5. 例如:
      • 英文 Email 改寫。
      • 報表摘要。
      • 網頁 / 影片整理成重點筆記。
    6. 先在 Gemini 裡照平常方式下指令,調整到滿意。

    7. 存成 Skills 並實際跑一次

    8. 用前面教的方式,將這三個 Prompt 各存成一個 Skill。
    9. 立刻在兩種不同頁面上試跑(例如兩封不同的信件、兩篇不同文章),看輸出是否符合期待,必要時再回頭微調 Prompt。

    這樣設定完,你之後在 Chrome 裡看到任何「值得用 AI 幫忙處理」的頁面,就不用思考要怎麼下指令,只要想:「這件事有沒有對應的 Skill 可以點?」

    🚀 你現在可以做的事

    • 打開你存 Prompt 的 Notion 或文件,挑出 3 個最高頻使用的指令,準備轉成 Skills
    • 在桌面版 Chrome 更新並登入 Google 帳號,確認 Gemini 側邊欄與 Skills 入口是否已可使用
    • 選一個固定重複的工作(如週報、Email 模板),寫成完整 Prompt,存成第一個可重複使用的 Skill
  • GAIA 本地多代理實戰指南

    GAIA 本地多代理實戰指南

    📌 本文重點

    • 本地多代理更可控
    • sandbox 與權限隔離
    • 先選小模型再優化
    • Workflow 可 checkpoint

    在本地硬體上跑 GAIA 多代理 workflow,直接解決三個實際痛點:

    💡 關鍵: 本地部署的核心價值,不只是省雲端費用,更是把隱私、延遲和權限控制都收回自己手上。

    1. 隱私與合規:內網知識庫、檔案內容不出機器,減少 DLP 顧慮。
    2. 可控成本與延遲:不綁雲端 API,長任務與大量工具呼叫的成本與延遲可預期。
    3. 更細緻的權限隔離與除錯:工具執行在你設計的 sandbox 內,log、資源監控都在本機可觀測。

    以下以「本地檔案整理 + 內網知識庫助理」為具體任務,示範如何用 GAIA 在單機上組出一個可用的多代理系統,並說清楚在 Apple Silicon / GPU / 純 CPU 場景下要怎麼選 LLM 和調整架構。


    重點說明

    1. GAIA 的基本心智模型:Agent / 任務 / 工具

    GAIA 的抽象其實很單純:

    • Agent:有「目標 + 能力」的行為體,通常綁一個 LLM + 一組工具。
    • 任務(Task / Workflow:定義起點、終點,以及 Agent 如何接力。
    • 工具(Tools:一組可呼叫的函式,如檔案系統、HTTP、向量搜索,GAIA 會把它們包成可被 LLM 呼叫的函式呼叫介面。

    實務上你會這樣切:

    • 一個 Planner Agent 負責拆解高階目標:例如「整理 ~/Downloads 並產出 README」。
    • 一個 FileOps Agent 只負責檔案遍歷、分類、改名,綁定檔案系統工具,權限嚴格限制。
    • 一個 Knowledge Agent 使用向量庫對內網 markdown/PDF 做檢索與摘要。

    2. 在單機協調多代理:比你想像中輕量

    GAIA 不是重型的分散式框架,而是偏 本地 Orchestrator

    • 用一個主 loopworkflow engine 管理 Agent 呼叫順序、中間狀態與錯誤。
    • 每個 Agent 呼叫相同或不同 LLM(例如:Planner 用小模型,Knowledge Agent 用大模型)。
    • 即使只有一張 GPU 或一台 Apple Silicon,透過限流與序列化調度一樣能跑多代理,只是併發要保守。

    3. 本地 LLM 選擇策略(Apple / GPU / CPU)

    Apple Silicon(M1–M4

    • 優先考慮 MLX + Qwen3.5 / Gemma 4 / Llama 家族的 8–9B 量化。
    • 善用像 Reddit 提到的 DFlash 推測解碼:在 9B 級模型上可有 ~4× decoding 加速,對多代理回合式對話很有感。

    💡 關鍵: ~4× decoding 加速代表回合式多代理互動的體感差異會非常明顯,特別是在本地裝置上。

    • 32GB RAM 以上:可以考慮 27B 量級,但要注意 context 與 batch size 的 trade-off。

    桌機 GPUNVIDIA

    • llama.cpp / vLLM / TensorRT-LLM 都可;若用 llama.cpp,可利用社群的 llm-server v2 --ai-tune 自動調 flags,實測 Qwen3.5-27B+50% tok/s 以上,對長任務吞吐提升很明顯。

    💡 關鍵: +50% tok/s 以上的提升,對長任務與大量工具呼叫會直接反映在整體吞吐量上。

    CPU

    • 參考 Gemma 4CPU 的實測,8B 級模型仍可用,但要:
    • 選擇更小模型 + 更 aggressive 量化(如 Q4_K_M);
    • 控制 max_tokens,避免一次生成太長;
    • 任務設計上用更多工具、多輪互動,降低單次生成長度。

    實作範例:從零到一的本地多代理 workflow

    假設你要在 Mac(M2 Pro + 32GB)上做一個:

    指定資料夾路徑 → 自動整理檔案並產出整理報告 → 同時讓知識庫助理可以回答「這次整理做了什麼?」

    以下用簡化版 pseudo-code 示意 GAIA 專案結構與關鍵程式碼。

    專案結構

    my-gaia-local-agents/
    ├── gaia_config.yaml       # GAIA 全域設定(LLM, 日誌, sandbox)
    ├── agents/
    │   ├── planner_agent.py
    │   ├── fileops_agent.py
    │   └── knowledge_agent.py
    ├── tools/
    │   ├── file_tools.py      # 檔案操作工具
    │   └── vectordb_tools.py  # 內網知識庫檢索
    ├── workflows/
    │   └── organize_and_report.py
    └── main.py
    

    1. 定義本地 LLM backend

    假設你用 Ollama + Qwen2.5 7B 作為通用模型(Apple / GPU / CPU 都能跑):

    # gaia_config.yaml
    llm_backends:
      default:
        type: http
        base_url: "http://localhost:11434/v1"
        model: "qwen2.5:7b"
        # 重要:明確限制 context 和輸出長度,避免拖慢整體 workflow
        params:
          max_tokens: 512
          temperature: 0.3
          top_p: 0.9
    
    logging:
      level: INFO
      file: "logs/gaia.log"
    
    sandbox:
      file_root: "./sandbox_root"   # FileOps 只允許在這之下操作
      allow_network: false           # 預設工具無網路
    

    實際好處:

    • HTTP LLM backend,你可以隨時切換到 llama.cpp server / MLX server / vLLM 而不用改 Agent 邏輯。
    • max_tokens + temperature 控制對本地效能非常關鍵,避免一個 Agent 把整個 context 塞爆。

    2. 定義工具:檔案操作與向量檢索

    # tools/file_tools.py
    from gaia import tool
    from pathlib import Path
    
    SANDBOX_ROOT = Path("./sandbox_root").resolve()
    
    @tool(name="list_files", description="列出目錄下的檔案與大小")
    def list_files(path: str) -> dict:
        root = (SANDBOX_ROOT / path).resolve()
        assert root.is_dir() and str(root).startswith(str(SANDBOX_ROOT)), "path out of sandbox"
        files = []
        for p in root.iterdir():
            if p.is_file():
                files.append({"name": p.name, "size": p.stat().st_size})
        return {"files": files}
    
    @tool(name="move_file", description="移動檔案到新資料夾")
    def move_file(src: str, dst: str) -> str:
        src_path = (SANDBOX_ROOT / src).resolve()
        dst_path = (SANDBOX_ROOT / dst).resolve()
        assert str(src_path).startswith(str(SANDBOX_ROOT))
        assert str(dst_path).startswith(str(SANDBOX_ROOT))
        dst_path.parent.mkdir(parents=True, exist_ok=True)
        src_path.rename(dst_path)
        return f"moved {src} to {dst}"
    

    幾個關鍵點:

    • @tool 裝飾器,GAIA 會自動產生給 LLM 用的工具 schema
    • 使用 sandbox_root + startswith 檢查,避免 Agent 亂動整個檔案系統。

    向量檢索工具(略寫):

    # tools/vectordb_tools.py
    from gaia import tool
    from my_vectordb import search
    
    @tool(name="kb_search", description="在內網知識庫中搜尋相關文件")
    def kb_search(query: str, top_k: int = 5) -> list:
        return search(query, top_k=top_k)
    

    3. 定義 Agents

    # agents/planner_agent.py
    from gaia import Agent
    from gaia.llm import LLMClient
    
    llm = LLMClient.from_config("default")
    
    planner = Agent(
      name="planner",
      llm=llm,
      tools=[],  # Planner 不直接動檔案
      system_prompt="""
    你是任務規劃專家。使用簡短 JSON 回覆,包含 steps,
    每個 step 指定要由哪個 agent 執行(fileops 或 knowledge)。
    """
    )
    
    # agents/fileops_agent.py
    from gaia import Agent
    from gaia.llm import LLMClient
    from tools.file_tools import list_files, move_file
    
    llm = LLMClient.from_config("default")
    
    fileops = Agent(
      name="fileops",
      llm=llm,
      tools=[list_files, move_file],
      system_prompt="""
    你負責安全地整理檔案,只能使用提供的工具操作 sandbox 內的路徑。
    每次操作前先列出檔案,再決定如何移動。
    """
    )
    
    # agents/knowledge_agent.py
    from gaia import Agent
    from gaia.llm import LLMClient
    from tools.vectordb_tools import kb_search
    
    llm = LLMClient.from_config("default")
    
    knowledge = Agent(
      name="knowledge",
      llm=llm,
      tools=[kb_search],
      system_prompt="""
    你是內網知識庫助理,先呼叫 kb_search 找到相關內容,
    再用找到的內容回答使用者問題。
    """
    )
    

    4. Workflow:協調多代理 + 任務恢復

    # workflows/organize_and_report.py
    import json
    from gaia import Workflow
    from agents.planner_agent import planner
    from agents.fileops_agent import fileops
    from agents.knowledge_agent import knowledge
    
    class OrganizeWorkflow(Workflow):
        def run(self, target_dir: str):
            # 1) 用 planner 拆解任務
            plan = planner.run_sync(f"請為資料夾 {target_dir} 制定整理計畫,輸出 JSON 格式。")
            steps = json.loads(plan["content"]).get("steps", [])
    
            history = []
            for step in steps:
                agent_name = step["agent"]
                instruction = step["instruction"]
    
                if agent_name == "fileops":
                    result = fileops.run_sync(instruction)
                elif agent_name == "knowledge":
                    result = knowledge.run_sync(instruction)
                else:
                    continue
    
                history.append({"agent": agent_name, "instruction": instruction, "result": result})
                self.save_checkpoint(history)  # **關鍵:長任務可恢復**
    
            return history
    
        def save_checkpoint(self, state):
            with open("./state/organize_checkpoint.json", "w") as f:
                json.dump(state, f, ensure_ascii=False, indent=2)
    

    最後入口:

    # main.py
    from workflows.organize_and_report import OrganizeWorkflow
    
    if __name__ == "__main__":
        wf = OrganizeWorkflow()
        history = wf.run("downloads")
        print("任務完成,歷史記錄:")
        print(history)
    

    實際好處:

    • Workflow + checkpoint 讓你可以安全跑幾十分鐘的整理任務,中途 crash 可恢復。
    • 檔案操作與知識庫檢索被清楚拆成不同 Agent,權限與日誌都更好控管。

    建議與注意事項

    1. 模型大小與上下文限制:先決策、再堆功能

    • 本地 Agent 系統最常見的坑是 一開始就選太大模型 + 太大 context
    • Apple 32GB + 27B 模型 + 128k context 幾乎一定卡。
    • 建議流程:
    • 先用 7–9B 模型 + 8k–16k contextMVP
    • 觀察 GAIA 的日誌與 latency 再決定是否升級模型或 context
    • 用「多輪互動 + 工具」彌補模型容量,而不是盲目換大模型。

    2. 工具執行安全 & sandbox 設計

    • 檔案操作請一定:
    • 使用 sandbox root + path 檢查(如上例)。
    • 禁用 rm -rf 類型操作,必要時只暴露「移動到 trash」工具。
    • Agent 需要網路:
    • proxy 工具封裝(如 http_get),不要讓 Agent 任意發 HTTP
    • 在工具層加 domain allowlist

    3. 長任務與錯誤恢復

    • GAIA workflow 必須:
    • 對每個工具呼叫與 Agent 回應寫入結構化 logJSON)。
    • 週期性 checkpoint 中間狀態(如上例 save_checkpoint)。
    • 常見錯誤種類:
    • LLMJSON 解析失敗 → 在 workflow 層加入重試 + 自我修復 prompt(要求模型只回合法 JSON)。
    • 工具拋例外(路徑不存在、權限錯)→ 在工具層 catch,回傳結構化錯誤訊息給 Agent 解讀,而不是直接 crash。

    4. 本地 vs 雲端 Agent:怎麼選?

    適合用 GAIA 本地落地的場景

    • 需要處理敏感檔案 / 內網知識庫(法務、醫療、R&D 原始碼)。
    • 需要低延遲 + 高互動頻率的工具呼叫(檔案整理、CI/CD 助理、開發環境助手)。
    • 有穩定的本地硬體(Mac Studio / 工作站 / 甚至改造手機當常駐節點,如 Xiaomi + Ollama 案例)。

    仍應用雲端 Agent 平台的情境

    • 短期 PoC,需要快速試多種 SOTA 模型(如 GPT-4.1, Claude 3.7)。
    • 任務高度 bursty,需要按需擴容,或併發數百以上的 Agent 任務。
    • 需要平台級功能(RBAC、審計、隊列管理)而你不想自己實作。

    實務建議:

    • 先在雲端 Agent 平台驗證 prompt、工具設計、整體 UX
    • 穩定後再把核心工作流搬到 GAIA + 本地 LLM 上,對敏感資料與長任務特別划算。

    總結:GAIA 提供的是一個 在本地硬體上「可觀測、可控、可擴展」的多代理骨架。搭配 Apple Silicon/桌機 GPU 的本地 LLM 加速(--ai-tuneDFlash 等),你可以在單機上跑出相當實用的 AI Agents,而不再被雲端 API 綁死。關鍵是:先把 Agent / 工具 / Workflow 的邊界切清楚,再談模型與效能優化

    🚀 你現在可以做的事

    • 先在 Ollamallama.cpp 上跑一個 7B 模型
    • 按本文結構拆出 plannerfileopsknowledge 三個 Agent
    • 先用 sandbox_root 做安全檔案操作,再逐步加上 checkpointkb_search
  • 用 Claude Code routines 把修 Bug 和審 PR 自動化

    用 Claude Code routines 把修 Bug 和審 PR 自動化

    📌 本文重點

    • 用程式碼定義 routine,讓 Claude 自動跑開發流程
    • 支援排程、API、GitHub webhook 等多種觸發方式
    • 適合 CI、PR 初審、重構、錯誤偵測等自動化場景
    • 建議先從「只讀建議」開始,逐步放權到自動修正

    一句話先說清楚:Claude Code routines 就是「用程式碼把 Claude 變成你的自動化開發助理」,幫你在雲端自動跑修 Bug、審 PR、開 issue 等重複工作。

    官方文件:https://code.claude.com/docs/en/routines


    核心功能:用程式碼定義多步驟任務

    routines 的概念很簡單:你先用程式碼把「要怎麼用 Claude 做事」寫成一個流程,之後就讓它自動在雲端重複跑。

    典型一個 routine 可以長這樣:

    1. 拉特定 repo(支援 GitHub 等連接器)
    2. 用 Claude 分析程式碼變更或錯誤
    3. 修改程式碼、產生 patch 或直接開 PR
    4. 把結果回報到 GitHub、Slack 或你的 CI 系統

    根據官方說明和社群分享(Reddit):

    • 多步驟流程可程式化:你不是丟一句 prompt 就結束,而是用程式碼描述整個 pipeline,例如:

    ts
    // 偽程式碼示意:定義一個 routine
    const routine = defineRoutine({
    name: 'lint-and-suggest',
    repo: 'github://my-org/my-repo',
    steps: [
    cloneRepo(),
    runESLint(),
    askClaudeForFixes(),
    commentOnPullRequest(),
    ],
    })

    • 三種觸發方式(都在雲端跑,電腦可關機):
    • 固定排程:例如每天凌晨跑一次重構建議
    • API 呼叫:每個 routine 會有一個 endpoint,你可以從自家服務打 API 觸發
    • GitHub webhook:例如「新 PR 建立時就讓 routine 自動跑審查」

    💡 關鍵: routines 把「一次性的 prompt」變成「可重複觸發的程式化流程」,而且全部在雲端執行,不綁你的電腦在線。

    你可以馬上做的事:

    • 想一個你最常重複做的開發流程(例如「每次 PR 都要跑 lint + 給建議」),把它拆成 3–5 個步驟,列成清單,等等在「怎麼開始」直接照這份清單寫成 routine。

    適合誰用:4 個典型場景

    1. CI 流程自動跑靜態分析 + 修正建議

    場景:你現在的 CI 只會跑 lint / type check,但錯誤一堆,只丟紅燈不給解法。

    用 routines 可以:

    • 在 CI 裡呼叫一個 API routine
    • routine 拉 PR 的 diff,跑 ESLint / mypy 等工具
    • 把錯誤丟給 Claude,讓它:
    • 用自然語言解釋錯誤來源
    • 產生建議修正(甚至 patch)
    • 把結果直接貼回 PR comment

    可執行動作:

    • 選一個語言(例如 TypeScript),從你現有 CI 裡加一個步驟:呼叫 routines API,把 PR 編號、branch、diff 傳給它,讓 routines 回傳「修正建議文字」或「patch 檔」。

    2. PR 自動初審:先讓 AI 篩一輪

    場景:團隊 PR 多,但 Reviewer 不想浪費時間在命名、註解、重複邏輯這種「低階問題」。

    routine 可以幫你:

    • 透過 GitHub webhook,在 PR 開啟時觸發
    • 讀取 diff + 相關檔案
    • 按你定義的規則檢查:
    • 是否有測試
    • 是否破壞既有 API
    • 命名 / 註解 / logging 是否符合約定
    • 自動在 PR 下面留一串初步 review comment

    可執行動作:

    • 先在文件裡列出你希望「PR 初審」檢查的 checklist(3–7 項就好),之後在 routine 的 prompt 中直接貼入這份 checklist,讓 AI 依此審查。

    3. 例行重構 / 格式化:排程交給 AI 擬方案

    場景:技術債知道很多,但沒空系統性整理。

    排程 routine 可以:

    • 每週固定拉主分支
    • 掃特定目錄(例如 /legacy/**
    • 讓 Claude:
    • 找出重複程式碼、過長 function、潛在性能瓶頸
    • 產出「重構提案」文件,列出建議與風險
    • 適度產生小 patch(例如只做格式、抽小 function)

    可執行動作:

    • 挑一個最頭痛的模組,設定一個每週 routine,讓 AI 每週只做一件事:產出一份 markdown 報告 docs/refactor-suggestions.md,你每週開會時直接打開看。

    4. Crash 時自動開 issue + 初步定位

    場景:線上服務 crash,Log 一堆,沒人第一時間看。

    你可以:

    • 在監控系統(如 Datadog、Sentry、自家 APM)裡,當發生特定錯誤時,呼叫 routines API
    • routine 取得:錯誤訊息、stack trace、關聯 log
    • 讓 Claude:
    • 用固定模版在 GitHub / Jira 開 issue
    • 附上「可能原因、優先查看檔案、建議排查步驟」

    可執行動作:

    • 把你目前手動開 issue 的模版貼出來,照樣套到 routine:把欄位(背景、重現步驟、log、可能原因)寫進 prompt,讓 AI 自動填。

    進階玩法:多代理 + DevOps 工具鏈串接

    多代理平行工作:一個負責測試、一個負責安全

    Anthropic 在桌面版 Claude Code 已經支援多代理平行工作(Reddit 範例),在 routines 概念上,你可以照抄這個思路:

    • routine A:專門寫測試
    • 拉 PR diff
    • 找出新增 / 修改的 function
    • 為這些 function 產測試檔 / 測試 case
    • routine B:專門做安全檢查
    • 用「安全檢查 prompt」掃過相同 diff
    • 找 SQL injection、硬編 API key、不安全的反序列化等

    你在 CI / webhook 流程裡:

    • 對同一個 PR 同時觸發 routine A 和 B
    • 兩邊結果都留言回 PR,Reviewer 一次看完

    可執行動作:

    • 先從「拆成兩個 routine」開始:複製一份 PR 初審 routine,一份改成只談測試、一份改成只談安全。兩個端點都掛在同一個 GitHub webhook 上平行觸發。

    💡 關鍵: 把不同責任拆成多個 routine 平行跑,比讓一個超大 prompt 包山包海更穩定、也更好維護。


    和 GitHub Actions / 自家 CI 組合

    根據官方說明,每個 routine 都有自己的 API endpoint,你可以:

    • 在 GitHub Actions 新增一個 step:

    yaml
    - name: Call Claude routine
    run: |
    curl -X POST "$ROUTINE_ENDPOINT" \
    -H "Authorization: Bearer $ROUTINE_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"pr_number": "${{ github.event.pull_request.number }}"}'

    • 在自家 CI(GitLab CI、Jenkins 等)同樣用 curl / http client 呼叫

    可執行動作:

    • 挑一個已存在、每次都必跑的 workflow(例如 ci.yml 中的 lint job),在最後加上一個 step 呼叫 routines,把 log 或 diff 丟給它,先從「只產出建議、不寫檔」開始。

    怎麼開始:從一個「最小可用」 routine 起步

    1. 在哪裡開啟 Claude Code routines?

    前提:需要 Claude 付費帳號(根據 官方公告)。

    步驟概念(介面可能會隨時間微調):

    1. 登入 https://code.claude.com
    2. 在側邊欄找到 Routines 或類似入口
    3. Create routineNew routine
    4. 選擇:
    5. 要連接的 repo(GitHub / 本地鏡像等)
    6. 要用的 connector(例如 Slack、GitHub)
    7. routine 的觸發方式(排程 / API / GitHub webhook)

    可執行動作:

    • 現在就登入 Claude Code,看你的帳號是否已開 routines,確認你公司 repo 是否能被安全地接入(先選一個 side project 測試)。

    2. 寫一個「最小可用」 lint & 建議 routine

    目標:對指定 repo 做 lint,請 Claude 用自然語言給建議,不動任何程式碼。

    流程示意(概念層級):

    1. 新建 routine:ts-lint-advisor
    2. 設定:
    3. Repo:github://your-org/your-repo
    4. 觸發:API(先手動呼叫)
    5. 在 routine 腳本中:
    6. Step 1:git clone 對應 branch
    7. Step 2:跑 pnpm lintnpm run lint,把輸出存成文字
    8. Step 3:呼叫 Claude,把 lint log + 相關檔案片段丟給它,prompt 約略:

      你是一位 TypeScript 專案維護者。根據以下 ESLint 輸出,請:
      1. 依錯誤類型分組
      2. 解釋造成這些錯誤的程式風格 / 設計問題
      3. 提出 3–5 條優先修正建議(包含具體檔案與規則)

    9. 回傳結果:只輸出 markdown 報告,不修改 repo

    可執行動作:

    • 先做一版「只讀不寫」的 lint 報告 routine,確定你喜歡它的輸出風格,再考慮讓 routine 產 patch 或自動發 PR。

    💡 關鍵: 先用「只讀報告」驗證 routine 的品質與風格,比直接讓它改碼、開 PR 安全得多。


    3. 設定 GitHub webhook:新 PR 自動觸發

    當你有一個穩定的 PR 初審 routine 之後,可以這樣接 GitHub:

    1. 在 routines 介面確認此 routine 的 API endpoint
    2. 到 GitHub 專案 Settings → Webhooks
    3. Payload URL:貼上 routines endpoint
    4. Content type:application/json
    5. Which events:勾選「Pull requests」
    6. 在 routine 的程式裡解析 GitHub webhook payload:
    7. 取得 pull_request.numberhead.refbase.ref
    8. 用這些資訊去抓 diff + 檔案內容

    可執行動作:

    • 先對「一個測試 repo」開 webhook,不要直接上 production monorepo;等確認 routine 不會亂刷 comment、沒權限問題,再複製設定到正式專案。

    風險提示與 Best Practices

    1. 權限控制:不要讓 Agent 直接推到 main

    routines 能改程式碼,也能開 PR。建議:

    • 對 routines 用的 GitHub Token:
    • 禁止直接 push 到 main / master
    • 只給「開 PR」和「留言」的權限
    • 在 Org Policy 中明定:AI 開的 PR 一律需要人審核才能合併

    可執行動作:

    • 立刻確認你準備給 routines 用的 GitHub PAT / App 權限,把 push to protected branches 關掉。

    2. 改動記錄與審計:每一個 AI 動作都要有跡可循

    為了避免「不知道是哪個 routine 改了什麼」:

    • 統一規範 AI 開 PR 的 branch 命名,例如:ai/routine-name/feature-x
    • PR 描述固定包含:
    • 使用的 routine 名稱 & version
    • 執行時間、輸入參數(例如針對哪個 issue / PR)
    • 可以在 routine 程式裡主動把自己的輸出寫入一個 log 檔或 S3 / DB,供日後查詢。

    可執行動作:

    • 寫一個簡單規範:所有 routines 在 PR 描述最上方都要加一段固定訊息,例如:[Generated by routine: pr-initial-review v0.3],方便日後搜尋、回溯。

    3. 慢慢放權:先從「建議」再到「自動修改」

    導入策略可以分三層:

    1. 只讀模式:只產報告 / 建議,不動任何檔案
    2. Patch 模式:產生 patch 檔、開 PR,但不自動合併
    3. 半自動修正:對低風險項目(格式化、註解)允許自動合併,高風險項目仍需人工

    可執行動作:

    • 先列出「允許 AI 自動處理」與「必須人工審核」的改動類型(例如:格式化、註解 vs. 核心業務邏輯、資料庫 schema),在 routine 的 prompt 裡明寫清楚。

    小結:從一個 routine 開始,把最煩的事交給 Claude

    你可以把 Claude Code routines 當成「可編程的 AI Bot 平台」:

    • 把你每天重複做的開發流程拆成步驟
    • 用程式碼和 prompt 變成 routine
    • 用排程、API 或 GitHub webhook 觸發

    最實際的下一步

    1. 選一個最討厭但規則清楚的工作(例如 PR 初步檢查命名和註解)。
    2. 在 Claude Code 裡建一個 routine,先只產出文字建議。
    3. 跑一週,觀察輸出品質,再決定要不要進一步讓它產 patch、開 PR。

    從一個小 routine 開始,你就能感受到「用程式碼把 Claude 變成你的自動化開發助理」的威力。

    🚀 你現在可以做的事

    • 打開一個 side project repo,列出 3–5 步驟的「最煩例行工作」,照文中流程設計第一個 routine
    • 在 CI 或 GitHub Actions 中加上一個「只讀建議」的 routines 呼叫 step,觀察一週效果
    • 為 routines 設計權限與審計規範(Token 權限、branch 命名、PR 描述格式),再逐步放權到 patch / 開 PR