crewAI-examples 研究筆記¶
本篇涵蓋整個
crewAI-examplescollection,並對 stock_analysis、landing_page_generator、instagram_post 三個 crew 做逐檔解剖。
資料來源¶
| 項目 | 連結 |
|---|---|
| GitHub Repo | https://github.com/crewAIInc/crewAI-examples |
| stock_analysis | crews/stock_analysis |
| landing_page_generator | crews/landing_page_generator |
| instagram_post | crews/instagram_post |
| 姊妹 repo | crewAI-cookbook(功能導向的短教學,與本 repo 的「完整應用」定位互補) |
| 框架本身 | 本站筆記 CrewAI |
Repo 現況(2026-07-28):★ 6,120 / fork 2,169 / repo 根目錄無 LICENSE 檔(GitHub 顯示 null,但個別 crew 的 README 各自宣告 MIT)/ 建立 2023-12-19 / 最後 push 2026-04-20(約 3 個月未更新) / open issues 75。原作者是 CrewAI 創辦人 @joaomdmoura。
Collection 全貌¶
根 README 的定位很明確:這裡放完整應用,功能導向的短教學去 crewAI-cookbook。並聲明「所有範例使用 CrewAI 0.152.0 與 uv」——但下面會看到這句話並不成立。
🌊 Flows(6 個)— 有狀態的複雜編排¶
| 範例 | 重點 |
|---|---|
| Content Creator Flow | 多 crew 協作產出部落格 / LinkedIn / 研究報告 |
| Email Auto Responder Flow | 郵件監控與自動回覆 |
| Lead Score Flow | 潛在客戶評分,含 human-in-the-loop 覆核 |
| Meeting Assistant Flow | 會議記錄處理 + Trello / Slack 整合 |
| Self Evaluation Loop Flow | 自我檢視的迭代改稿迴圈 |
| Write a Book with Flows | 平行章節生成的自動寫書 |
👥 Crews(16 個)¶
| 分類 | 範例 |
|---|---|
| 內容與行銷 | Game Builder、Instagram Post、Landing Page Generator、Marketing Strategy、Screenplay Writer |
| 商業與生產力 | Job Posting、Prep for a Meeting、Recruitment、Stock Analysis |
| 資料與研究 | Industry Agents、Match Profile to Positions(CV 對職缺,向量搜尋)、Meta Quest Knowledge(PDF QA)、Markdown Validator |
| 旅遊規劃 | Surprise Trip、Trip Planner |
| 範本 | Starter Template |
🔌 Integrations(3 個)¶
CrewAI-LangGraph(跨框架整合)、Azure Model、NVIDIA Models。
📓 Notebooks(5 個)¶
Coding Assistant、Flows_101、Landing Page Flow、QA Agent、Simple QA Crew + Flow。
兩代專案骨架並存 — 這是意外的教學價值¶
repo 裡同時存在 CrewAI 的新舊兩種專案結構,而且可以直接並排比較:
【新骨架】stock_analysis / landing_page_generator 【舊骨架】instagram_post
src/<name>/ .
├── config/ ├── agents.py # Agent 用 Python 建構
│ ├── agents.yaml # 角色定義抽成 YAML ├── tasks.py # Task 用 Python 建構
│ └── tasks.yaml # 任務描述抽成 YAML ├── main.py # 手動組 Crew(...)
├── crew.py # @CrewBase / @agent / @task └── tools/
├── main.py # kickoff(inputs={...})
└── tools/
uv.lock poetry(README 仍寫 poetry install)
新骨架的核心是三個 decorator:@CrewBase 標記類別、@agent / @task 標記方法,框架自動蒐集成 self.agents / self.tasks。把角色與任務的自然語言描述抽進 YAML,程式碼只剩「誰用哪些工具」的接線——這是 CrewAI 這兩年最重要的結構演進,而這個 repo 讓你能在同一次 clone 裡看到 before / after。
代價是文件沒跟上:根 README 說「全部用 0.152.0 + uv」,但 instagram_post/README.md 寫的是「crewAI==0.130.0」與 poetry install。
深入一:stock_analysis¶
設計¶
三個 agent、四個任務,Process.sequential 串接:
Agent(agents.yaml) |
工具 |
|---|---|
financial_analyst — The Best Financial Analyst |
Scrape、WebsiteSearch、Calculator、SEC10Q、SEC10K |
research_analyst — Staff Research Analyst |
Scrape、SEC10Q、SEC10K |
investment_advisor — Private Investment Advisor |
Scrape、WebsiteSearch、Calculator |
Task(tasks.yaml) |
內容 |
|---|---|
financial_analysis |
P/E、EPS 成長、營收趨勢、負債權益比 + 同業比較 |
research |
新聞、新聞稿、市場情緒、分析師意見、將至的財報等事件 |
filings_analysis |
從 EDGAR 抓最新 10-Q / 10-K,看 MD&A、財報、內部人交易、揭露風險 |
recommend |
綜合前三者產出完整投資建議,須包含內部人交易與將至事件 |
tasks.yaml 的寫法值得注意:每個任務都拆成 description(做什麼)與 expected_output(產出長什麼樣),而 expected_output 裡塞了不少約束(「必須是給客戶的建議」「要漂亮、格式良好」「務必用最新資料」)。這是 CrewAI 的核心提示工程介面——輸出契約寫在 YAML 而不是散在程式碼裡。
calculator_tool.py — 這個寫得很好¶
if not re.match(r'^[0-9+\-*/().% ]+$', operation): # 字元白名單
raise ValueError("Invalid characters in mathematical expression")
tree = ast.parse(operation, mode='eval') # AST 解析,不用 eval()
allowed_operators = {ast.Add: operator.add, ...} # 運算子白名單
AST 解析 + 運算子白名單 + 字元前置檢查,完全避開 eval()。早期 CrewAI 範例的計算機工具是直接 eval(operation),這份顯然做過安全硬化。想給 agent 一個安全計算器的人可以直接抄。
但同一個 crew 裡有數處明確問題¶
以下都是讀 HEAD 程式碼交叉比對的結果:
1. crew.py 有重複定義的方法。 financial_analysis 這個 @task 方法被定義兩次,Python 的後者會覆蓋前者。同時有兩個 agent(financial_agent 與 financial_analyst_agent)綁到同一個 config key agents_config['financial_analyst'],角色/目標/背景完全一樣,只有工具不同——典型的複製貼上殘留。
2. 股票代號寫死成 AMZN。
tools=[..., SEC10QTool("AMZN"), SEC10KTool("AMZN")] # crew.py,兩個 agent
inputs = {'query': '...', 'company_stock': 'AMZN'} # main.py
README 說「執行後輸入要分析的公司」,但 main.py 從頭到尾沒有 input();'query' 欄位的值還直接是提示字串本身('What is the company you want to analyze?')。要換股票得改三個地方。
3. README 與程式碼直接矛盾。 README 開頭寫「預設使用 GPT-4,所以你需要有 GPT-4 權限」並警告會花錢;程式碼第一行卻是:
from langchain.llms import Ollama # 已棄用的 import 路徑
llm = Ollama(model="llama3.1") # 模組層級寫死,每個 agent 都吃這個
4. README 指向不存在的檔案。 說 key components 是 ./stock_analysis_tasks.py 與 ./stock_analysis_agents.py、安裝用 poetry install --no-root。實際結構是 src/stock_analysis/ + YAML + uv.lock。這份 README 停在骨架遷移之前。
5. sec_tools.py 的正則會把財報數字洗掉。
註解說是「移除非英文字、錢字號、數字、換行以外的東西」,但這條規則會一併刪掉小數點、逗號、負號、百分比符號:
| 原文 | 洗完 |
|---|---|
1,234.56 |
123456 |
-5.2% |
52 |
$(1,200) |
$1200 |
對一個「用來做財務分析」的工具而言,這等於把它要分析的數字全毀了。 而且方向性資訊(負號、括號表示的負值)也一併消失。
6. 其他。 SEC 請求的 User-Agent 寫死了某人的個人信箱("crewai.com bisan@crewai.com");__init__ 裡留著 print("enter init") 除錯輸出;RagTool 在建構時就下載並嵌入整份 10-K,所以光是組出這個 crew 就會觸發 4 次下載 + 4 次 embedding。
深入二:landing_page_generator¶
三個 crew 串成的流水線¶
單一 crew.py(8.8KB)裡定義了多個 @CrewBase 類別:
ExpandIdeaCrew → ChooseTemplateCrew → (內容編修)
├ Senior Idea Analyst ├ Senior React Engineer └ Senior Content Editor
└ Senior Comms Strategist (+ FileManagementToolkit
(Golden Circle 方法) root_dir='workdir')
四個角色定義在 agents.yaml,其中 Senior Communications Strategist 明確被要求用 Golden Circle 方法(Simon Sinek 的 why-how-what)來組織敘事——把具體的方法論寫進 backstory,是比「你是一個很棒的文案」有效得多的角色設定。
它跑不起來,而且作者明講¶
main.py 開頭就是:
! YOU MUST FORK THIS BEFORE USING IT !
Disclaimer: This will use gpt-4 unless you changed it not to,
and by doing so it will cost you money (~2-9 USD).
The full run might take around ~10-45m.
然後檢查 ./templates 是否為空,空的就直接 exit():
Templates are not included as they are Tailwind templates. Place Tailwind individual template folders in
./templates, if you have a license you can download them at https://tailwindui.com/templates
這個範例依賴一份付費的 Tailwind UI 授權,範本不隨 repo 散布。 換句話說它不是「clone 下來就能跑的 demo」,而是「你有 Tailwind UI 授權時的自動化骨架」。
值得肯定的是它明碼標出成本與時間(2–9 美元、10–45 分鐘)。多數 agent 範例對「跑一次要花多少錢」完全沉默,而這正是初學者最常踩的坑。
檔案工具做過完整的安全硬化¶
file_tools.py 的 write_file 有五層檢查:
if not re.match(r'^[a-zA-Z0-9._/\-]+$', path): ... # 字元白名單
if path.startswith("/"): return "絕對路徑不允許"
if ".." in relative_path: return "偵測到路徑穿越"
if not str(resolved_path).startswith(str(workdir)): ... # resolve 後再確認包含關係
allowed_extensions = {'.jsx','.js','.tsx','.ts','.css',...} # 副檔名白名單
template_tools.py 同樣:範本名稱字元白名單、明確拒絕 .. / / / \、來源與目的地雙向包含檢查、目的地已存在時拒絕覆寫。再加上 FileManagementToolkit(root_dir='workdir') 這層框架級的根目錄限制。
讓 LLM 寫檔案是最危險的工具類型之一,這份實作可以當作硬化樣板直接參考。
深入三:instagram_post¶
舊骨架 + 兩段式 crew 串接¶
五個角色(Lead Market Analyst、Chief Marketing Strategist、Creative Content Creator、Senior Photographer、Chief Creative Director),組成兩個依序執行的 crew,用 Python 手動接線:
ad_copy = copy_crew.kickoff() # 3 agents / 4 tasks:產品分析 → 競品分析 → 活動企劃 → 廣告文案
# ↓ ad_copy 當成輸入傳入下一段
take_photo = tasks.take_photograph_task(senior_photographer, ad_copy, ...)
image = image_crew.kickoff() # 2 agents / 2 tasks:攝影 → 創意總監覆核
這是在 Flows 出現之前,CrewAI 做多階段工作流的標準寫法:crew 的輸出當成下一個 crew 的 task 參數手動傳遞。 對照 flows/ 目錄裡有狀態的 Flow 寫法,可以清楚看出框架為什麼要引入 Flows。
「Senior Photographer」不拍照,它寫 Midjourney prompt¶
程式最後印的是:
這個誠實的設計值得一提:LLM agent 不生成圖片,它生成「給圖像模型的提示詞」,然後由 Chief Creative Director agent 覆核這段提示詞。多代理系統在能力邊界上的正確做法就是這樣——不要假裝 agent 能做它做不到的事,讓它產出交給下一個專門系統的輸入。
工具裡藏著一個成本陷阱¶
browser_tools.py 的 scrape_and_summarize_website:
content = [content[i:i + 8000] for i in range(0, len(content), 8000)] # 切成 8000 字元塊
for chunk in content:
agent = Agent(role='Principal Researcher', ...) # 每塊都新建一個 agent
task = Task(agent=agent, description=f'...{chunk}')
summary = task.execute() # 每塊一次 LLM 呼叫
一次網頁抓取 = N 次 LLM 呼叫(N = 內容長度 / 8000)。抓一個 80KB 的頁面就是 10 次呼叫,而且每次都重新建構 Agent 物件。這個範例全跑本地 Ollama 所以感覺不出來,但同樣的模式換成 GPT-4 就是帳單爆炸的來源。想抄這段的人務必加快取與長度上限。
目前限制與注意事項¶
| 項目 | 說明 |
|---|---|
| repo 根目錄沒有 LICENSE | GitHub API 回傳 license: null。個別 crew 的 README 各自寫「MIT License」,但整個 collection 沒有頂層授權宣告。要商用引用前建議先確認 |
| 約 3 個月未更新 | 最後 push 2026-04-20,open issues 75 |
| 「全部用 0.152.0 + uv」不成立 | instagram_post 仍是 0.130.0 + poetry + 舊骨架 |
| README 與程式碼普遍失同步 | stock_analysis 最嚴重(模型、檔名、安裝方式、輸入方式四項全錯)。讀這個 repo 一律以程式碼為準 |
| 安全性硬化過,功能正確性沒有 | 三個 crew 的工具層都有明顯的安全 review 痕跡(AST 計算器、路徑穿越防護、副檔名白名單),但同一批檔案裡的重複方法、寫死 AMZN、洗掉小數點的正則都還在。這強烈暗示曾經跑過一次自動化安全掃描的修補,而沒有人重跑過功能測試 |
| 無測試、無 CI 驗證 | 30 個範例沒有任何機制確認它們在當前 CrewAI 版本下還能跑 |
| landing_page_generator 需付費授權 | Tailwind UI 範本不隨附,沒有就直接 exit |
| stock_analysis 不適合當金融工具 | 除了上述 bug,它產出的是 LLM 生成的「投資建議」,沒有任何回測或驗證 |
uv.lock 巨大 |
instagram_post 的 lock 檔 610KB、landing_page 539KB、stock_analysis 433KB,佔了 repo 大部分體積 |
研究價值與啟示¶
關鍵洞察¶
1. 官方範例集的真正價值是「輸出契約」的寫法,不是程式碼。
tasks.yaml 裡 description 與 expected_output 的二分法,是 CrewAI 最值得學的介面設計。description 說做什麼,expected_output 說產出長什麼樣——而後者才是真正在約束 LLM 的地方(「必須是給客戶的完整報告」「務必包含內部人交易章節」「要漂亮、格式良好」)。把輸出契約從程式碼裡抽出來變成可編輯的 YAML,讓非工程師也能調整 agent 行為,這是 CrewAI 相對於「一切寫在 Python 裡」的框架最實際的優勢。
2. 新舊骨架並存,意外成為框架演進的活教材。
instagram_post(Python 建構 + 手動串接兩個 crew)與 stock_analysis(YAML + decorator)並排放在同一個 repo,正好展示 CrewAI 為什麼要走向宣告式:舊版把角色描述、工具接線、流程編排全混在 Python 裡,改一句 backstory 要動程式碼;新版把「說什麼」與「接什麼線」分離。再對照 flows/ 目錄,能看出第三階段的動機——crew 的手動串接(ad_copy = copy_crew.kickoff() 再傳給下一個)在超過兩段之後就不可維護了,於是需要有狀態的 Flow。 三代寫法同時可見的框架 repo 不多。
3. 「安全掃描修好了,功能沒人管」是官方範例集的典型腐化模式。
這個 repo 最有意思的矛盾是:calculator_tool.py 從 eval() 改成 AST 白名單、file_tools.py 有五層路徑穿越防護、template_tools.py 連目的地覆寫都擋——顯然做過認真的安全審查。但同一批檔案裡,crew.py 有重複定義的方法、股票代號寫死成 AMZN、README 說用 GPT-4 而程式碼寫死 Ollama。解釋只有一個:安全問題會被自動化工具掃出來並排進待辦,功能正確性不會。 範例程式碼沒有測試、沒有人跑,壞掉了也沒有訊號。這對所有維護範例集的人都是警訊——BYOA Core 用 13 個 eval task、i-have-adhd 用 CI 真的裝一次 plugin,正是為了解決這個問題。
4. sec_tools.py 那條正則是「LLM 時代的資料清洗」最好的反面教材。
re.sub(r"[^a-zA-Z$0-9\s\n]", "", text) 的動機可以理解——把 HTML 轉出來的雜訊清掉,讓 embedding 乾淨一點。但套在 SEC 財報上,它刪掉的是小數點、逗號、負號、百分比。清洗規則是為「文字」設計的,套用對象卻是「數字密集的財務文件」。 這類錯誤在 RAG 管線裡特別隱蔽:embedding 照樣產生、檢索照樣有結果、LLM 照樣給出看起來專業的分析——只是數字全錯,而且沒有任何一層會報錯。任何要對數值型文件做 RAG 的人,都該把「清洗前後抽樣比對數字」列為必做步驟。
5. landing_page_generator 明碼標出「2–9 美元、10–45 分鐘」,這件小事應該變成慣例。
Agent 範例最常見的隱藏成本是「跑一次到底要多少錢」。多代理 + 工具呼叫 + 網頁摘要,一次執行輕易上百次 LLM 呼叫。這個範例在 main.py 執行前就把成本與時間印出來,加上 instagram_post 那個「每 8000 字元一次 LLM 呼叫」的抓取工具(不標成本就會很痛),對比之下更顯得必要。Agent 應用的 README 應該像 API 文件標 rate limit 一樣標成本區間。
6. 「Senior Photographer 產出 Midjourney prompt」是能力邊界處理的正確示範。 與其讓 agent 假裝能拍照,不如讓它產出交給圖像模型的提示詞,再讓另一個 agent(Chief Creative Director)覆核這段提示詞。多代理系統的價值不在於「每個角色都能做真事」,而在於把一個模糊任務拆成一串各自明確的文字產出,最後由人或專門系統接手執行。這也解釋了為什麼 CrewAI 的範例大多集中在內容、行銷、研究、規劃——這些領域的「產出」本來就是文字。
與其他專案的關聯¶
| 專案 | 關係 |
|---|---|
| CrewAI | 框架本身的筆記。這份範例集是它的實作對照——想知道 Process.sequential、@CrewBase、expected_output 實際長什麼樣,看這裡比看文件快 |
| GenAI Agents (NirDiamant) | 最直接的對照。那份是跨框架教學集(三分之二 LangGraph),這份是單框架官方應用集。GenAI_Agents 裡 CrewAI 只有一個範例,想學 CrewAI 得來這裡 |
| StockAgent | 都用多代理處理股票,但層次完全不同。StockAgent 模擬市場(一群投資人 agent 互相交易),stock_analysis crew 模擬一間投顧公司(分析師 + 研究員 + 顧問串接產出報告)。兩者放一起可以看出「多代理」這個詞在金融場景的兩種用法 |
| AI Hedge Fund、TradingAgents | 同樣是「多個角色 agent 產出投資建議」,但那些有回測與真實資料。stock_analysis 是骨架示範,沒有任何驗證機制——不要把它當投資工具用 |
| LangGraph Multi-Agent | integrations/CrewAI-LangGraph 是官方的跨框架整合範例。兩個框架的分工哲學不同:CrewAI 宣告角色與任務,LangGraph 宣告狀態與轉移 |
| BYOA Core | 對照「範例集如何腐化」與「單人專案如何用 eval 擋住腐化」。BYOA 的 13 個 eval task 正是這份 repo 缺的東西 |
| Claude Cookbooks | 同為官方範例集。差別在維護節奏——Anthropic 有動機讓範例跟著 API 更新;這份 repo 停在 4 月,而 README 宣稱的版本與實際內容已經對不上 |