<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pydantic-Ai on Justmaker's KB</title><link>https://justmaker.github.io/tags/pydantic-ai/</link><description>Recent content in Pydantic-Ai on Justmaker's KB</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Thu, 02 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://justmaker.github.io/tags/pydantic-ai/index.xml" rel="self" type="application/rss+xml"/><item><title>2026 AI 平台調研：哪些平台支援完全自訂 Agent？</title><link>https://justmaker.github.io/post/ai-tools/custom-agent-platforms-2026/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>https://justmaker.github.io/post/ai-tools/custom-agent-platforms-2026/</guid><description>&lt;h2 id="前言">前言
&lt;/h2>&lt;p>「完全自訂 Agent」是什麼意思？不是在 GUI 上拖拉 prompt template，而是&lt;strong>逐行撰寫 agent 邏輯&lt;/strong>——決定什麼時候呼叫哪個工具、怎麼處理結果、失敗了怎麼重試、哪些行為絕對不允許。&lt;/p>
&lt;p>這篇調研針對 2025–2026 年市面上的 AI 平台，找出哪些真正支援這件事。&lt;/p>
&lt;hr>
&lt;h2 id="平台比較表">平台比較表
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>平台&lt;/th>
&lt;th>自訂程度&lt;/th>
&lt;th>語言&lt;/th>
&lt;th>自訂 Tools&lt;/th>
&lt;th>Multi-Agent&lt;/th>
&lt;th>State 管理&lt;/th>
&lt;th>部署&lt;/th>
&lt;th>定價&lt;/th>
&lt;th>成熟度&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>LangGraph&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;td>Python, JS/TS&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅ Checkpointing + 記憶&lt;/td>
&lt;td>Self-hosted / Cloud&lt;/td>
&lt;td>MIT License；LangSmith 按量&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AutoGen (Microsoft)&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;td>Python&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅ 核心就是 multi-agent&lt;/td>
&lt;td>✅ 對話歷史&lt;/td>
&lt;td>Self-hosted / Azure&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Semantic Kernel&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;td>Python, C#, Java&lt;/td>
&lt;td>✅ Plugin 系統&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅ Memory store&lt;/td>
&lt;td>Self-hosted / Azure&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Pydantic AI&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;td>Python&lt;/td>
&lt;td>✅ decorator 即 tool&lt;/td>
&lt;td>⚠️ 基本支援&lt;/td>
&lt;td>⚠️ 手動管理&lt;/td>
&lt;td>Self-hosted&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Mastra&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;td>TypeScript&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅ 內建 memory + RAG&lt;/td>
&lt;td>Self-hosted / Node&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>CrewAI&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;td>Python&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅ Crew 協作&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Self-hosted / Cloud&lt;/td>
&lt;td>MIT；Cloud 按量&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>smolagents&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;td>Python&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>⚠️ 基本&lt;/td>
&lt;td>Self-hosted&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>🔬 Experimental&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AWS Bedrock Agents&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐&lt;/td>
&lt;td>任何 Lambda 語言&lt;/td>
&lt;td>✅ Lambda functions&lt;/td>
&lt;td>⚠️ 有限&lt;/td>
&lt;td>✅ Session state&lt;/td>
&lt;td>Cloud (AWS)&lt;/td>
&lt;td>按用量&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Google Vertex AI ADK&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;td>Python&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅ Session + memory&lt;/td>
&lt;td>Cloud (GCP)&lt;/td>
&lt;td>按用量&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Azure AI Agent Service&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;td>Python, C#&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅ SK 整合&lt;/td>
&lt;td>✅ Thread-based&lt;/td>
&lt;td>Cloud (Azure)&lt;/td>
&lt;td>按用量&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Salesforce Agentforce&lt;/strong>&lt;/td>
&lt;td>⭐⭐&lt;/td>
&lt;td>Apex&lt;/td>
&lt;td>✅ Apex actions&lt;/td>
&lt;td>⚠️ 有限&lt;/td>
&lt;td>✅ CRM 內建&lt;/td>
&lt;td>Cloud (Salesforce)&lt;/td>
&lt;td>企業授權 $2/conv&lt;/td>
&lt;td>✅ CRM 場景&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ServiceNow AI Agents&lt;/strong>&lt;/td>
&lt;td>⭐⭐&lt;/td>
&lt;td>JS (ServiceNow)&lt;/td>
&lt;td>✅ Scripted REST&lt;/td>
&lt;td>⚠️ 有限&lt;/td>
&lt;td>✅ 平台內建&lt;/td>
&lt;td>Cloud (ServiceNow)&lt;/td>
&lt;td>企業授權&lt;/td>
&lt;td>✅ ITSM 場景&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OpenClaw&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;td>TypeScript / Shell&lt;/td>
&lt;td>✅ MCP tools&lt;/td>
&lt;td>✅ Subagent spawn&lt;/td>
&lt;td>✅ Memory files&lt;/td>
&lt;td>Self-hosted&lt;/td>
&lt;td>MIT License&lt;/td>
&lt;td>✅ Production&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="top-5-推薦">Top 5 推薦
&lt;/h2>&lt;h3 id="-langgraph">🥇 LangGraph
&lt;/h3>&lt;p>業界事實標準的 low-level agent 框架。以&lt;strong>有向圖（graph）&lt;/strong> 為核心抽象，每個節點都是你自己寫的函式。&lt;/p>
&lt;p>&lt;strong>核心優勢：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Durable execution&lt;/strong>：agent 中途失敗可從 checkpoint 恢復，不用重跑&lt;/li>
&lt;li>&lt;strong>Human-in-the-loop&lt;/strong>：可在任何節點暫停讓人類介入、審核、修改 state&lt;/li>
&lt;li>&lt;strong>完整記憶&lt;/strong>：短期 working memory + 跨 session 的長期記憶&lt;/li>
&lt;li>Python + JavaScript 雙語言&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>適合：&lt;/strong> 需要 durable execution、複雜多步驟 workflow、需要 human approval 的場景&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langgraph.graph&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">StateGraph&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">END&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">agent_node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 你的自訂邏輯，完全掌控&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">safety_guard&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 硬規則：在 code 裡攔截，LLM 繞不過&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;action&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;delete&amp;#34;&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;target&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">startswith&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;prod&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;blocked&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">state&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">StateGraph&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">AgentState&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;agent&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">agent_node&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;guard&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">safety_guard&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_node&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;execute&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">execute_node&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_edge&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;agent&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;guard&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_conditional_edges&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;guard&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">lambda&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;blocked&amp;#34;&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;blocked&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="s2">&amp;#34;execute&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="-semantic-kernel-microsoft">🥈 Semantic Kernel (Microsoft)
&lt;/h3>&lt;p>三語言支援（Python / C# / Java）是業界獨一無二的優勢，Plugin 系統讓 tool 定義極其靈活。&lt;/p>
&lt;p>&lt;strong>核心優勢：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>三語言&lt;/strong>：後端 .NET 團隊終於有了一流選擇&lt;/li>
&lt;li>&lt;strong>Filter/Hook 系統&lt;/strong>：&lt;code>IFunctionInvocationFilter&lt;/code> 可以在任何 function call 前後插入 validation&lt;/li>
&lt;li>&lt;strong>深度 Azure 整合&lt;/strong>，但不綁定 Azure&lt;/li>
&lt;li>適合企業級合規場景&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>適合：&lt;/strong> 企業 .NET/Java 開發團隊、需要與 Azure 生態整合&lt;/p>
&lt;hr>
&lt;h3 id="-pydantic-ai">🥉 Pydantic AI
&lt;/h3>&lt;p>最 Pythonic 的 agent 框架。&lt;strong>「讓 AI 開發獲得 FastAPI 的感覺」&lt;/strong> 是它的設計目標。&lt;/p>
&lt;p>&lt;strong>核心優勢：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>沒有多餘抽象&lt;/strong>：用 &lt;code>@agent.tool&lt;/code> decorator 定義 tool，用 Pydantic model 定義輸出結構&lt;/li>
&lt;li>&lt;strong>Result validator&lt;/strong>：可以攔截、驗證任何 LLM 輸出，不符規則就重試&lt;/li>
&lt;li>&lt;strong>Type-safe&lt;/strong>：型別錯誤在執行期自動 raise，不靠 LLM 自覺&lt;/li>
&lt;li>&lt;strong>Model-agnostic&lt;/strong>：支援 40+ provider，包含 Anthropic、OpenAI、GitHub Models&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pydantic_ai&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Agent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pydantic&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BaseModel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">JiraResolve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">BaseModel&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fix_version&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span> &lt;span class="c1"># 少一個欄位 → ValidationError → 自動重試&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">build_number&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">build_path&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root_cause&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">solution&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">agent&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;anthropic:claude-sonnet-4-6&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">result_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">JiraResolve&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@agent.tool&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">get_build_info&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">issue_key&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 你自己寫的邏輯，不是 prompt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@agent.result_validator&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">validate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">JiraResolve&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">JiraResolve&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">build_path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">startswith&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">r&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\\&lt;/span>&lt;span class="s2">172.17.25.251&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">ValueError&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Build path 格式錯誤&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># ← Code 強制，不是 prompt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">result&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>適合：&lt;/strong> Python 開發者、想要最小框架 overhead、重視型別安全&lt;/p>
&lt;hr>
&lt;h3 id="4-mastra">4. Mastra
&lt;/h3>&lt;p>TypeScript 生態目前最成熟的 agent 框架，由 Gatsby 原始團隊開發，YC W25。&lt;/p>
&lt;p>&lt;strong>核心優勢：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>TypeScript-native&lt;/strong>：型別推導、IDE 智能提示全程支援&lt;/li>
&lt;li>&lt;strong>40+ provider model routing&lt;/strong>：一個介面換任何 LLM&lt;/li>
&lt;li>&lt;strong>內建 memory + RAG&lt;/strong>：不用自己串 vector store&lt;/li>
&lt;li>&lt;strong>Workflow 系統&lt;/strong>：複雜的 multi-step pipeline 用 code 定義每個步驟&lt;/li>
&lt;li>可無縫整合 React / Next.js&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">Agent&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;@mastra/core/agent&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">myAgent&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Agent&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">id&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;my-agent&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;My Custom Agent&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">instructions&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;You are a specialized assistant for...&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">model&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;anthropic/claude-sonnet-4-6&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">tools&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">myCustomTool&lt;/span> &lt;span class="p">},&lt;/span> &lt;span class="c1">// 完全自訂 tool
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>適合：&lt;/strong> TypeScript 開發者、前後端整合場景&lt;/p>
&lt;hr>
&lt;h3 id="5-crewai">5. CrewAI
&lt;/h3>&lt;p>Multi-agent 協作做得最好，Flows 系統提供 event-driven 的細粒度控制。&lt;/p>
&lt;p>&lt;strong>核心優勢：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>10 萬+ 認證開發者&lt;/strong>，社群資源豐富&lt;/li>
&lt;li>&lt;strong>Flows&lt;/strong>：event-driven、狀態機式的 agent 協作，可精確控制每一步&lt;/li>
&lt;li>&lt;strong>Crews&lt;/strong>：定義角色（researcher、writer、reviewer）自動協作&lt;/li>
&lt;li>&lt;strong>CrewAI Cloud&lt;/strong>：一鍵部署&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>適合：&lt;/strong> Multi-agent 角色扮演、需要自動分工的複雜任務&lt;/p>
&lt;hr>
&lt;h2 id="關鍵洞察prompt-是建議code-是法律">關鍵洞察：Prompt 是建議，Code 是法律
&lt;/h2>&lt;p>這是選擇 agent 框架最重要的認知：&lt;/p>
&lt;pre tabindex="0">&lt;code>❌ 把規則放在 system prompt / AGENTS.md / memory 文件
→ LLM 可能忽略、context window 滿了沒載入、長對話後被沖淡
✅ 把規則寫進 agent code（tool validation、result validator、guard node）
→ 不管 LLM 怎麼想，code 就是不讓它過
&lt;/code>&lt;/pre>&lt;p>&lt;strong>哪些規則應該放 code？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>不允許刪除 production 資源&lt;/li>
&lt;li>必填欄位強制驗證&lt;/li>
&lt;li>只允許操作特定範圍的資源（例如指定 Confluence space）&lt;/li>
&lt;li>Git 推送前驗證帳號身份&lt;/li>
&lt;li>公開平台不能出現特定關鍵字&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>哪些規則放 prompt 就夠？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>回覆語言偏好（繁體中文）&lt;/li>
&lt;li>回覆風格與長度&lt;/li>
&lt;li>格式要求（如超連結格式）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="給開發者的選擇建議">給開發者的選擇建議
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>你的情況&lt;/th>
&lt;th>推薦方向&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Python 開發者，要逐行控制 agent&lt;/td>
&lt;td>&lt;strong>Pydantic AI&lt;/strong>（最少抽象）或 &lt;strong>LangGraph&lt;/strong>（複雜場景）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TypeScript 開發者&lt;/td>
&lt;td>&lt;strong>Mastra&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>企業 .NET / Java 團隊&lt;/td>
&lt;td>&lt;strong>Semantic Kernel&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>需要 multi-agent 角色協作&lt;/td>
&lt;td>&lt;strong>CrewAI&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>需要 durable execution、長時間任務&lt;/td>
&lt;td>&lt;strong>LangGraph&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>已在用雲端平台（AWS / GCP / Azure）&lt;/td>
&lt;td>對應的 agent service，但 agent logic 建議用純框架寫再部署&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CRM / ITSM 整合場景&lt;/td>
&lt;td>Salesforce Agentforce / ServiceNow（但自訂程度有限）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>核心建議：避開 no-code agent builder，選擇 code-first 框架。&lt;/strong> 2025–2026 的 agent 框架已經足夠 production-ready，開源選項完全可用。真正的控制權在於能不能在 code 層面定義 agent 行為，而不是靠 prompt 希望 AI 自覺遵守規則。&lt;/p></description></item></channel></rss>