每天清晨,十個尚未凝結的新創點子。
Asagiri(朝霧,morning mist,指天亮前那層尚未散去的薄霧)是一台每日自動運行的新創點子研究引擎。
每晚它調度一條 CLI agent 鏈、向本機 SearXNG 搜尋網路訊號,再綜合出十個有根據的新創點子,
寫進 data/<日期>/ideas.json,隔天早上由 webapp 瀏覽。
像晨霧,多數點子會在中午前蒸發,少數會留下來。
往下展開卷軸,跟著一次完整的生成過程
其一 / Scene I
架構:一條薄的調度層 / The thin orchestrator
舊引擎綁死三家廠商 SDK,每家還各自帶一套網路搜尋。新引擎反過來:它不擁有任何 SDK, 只擁有一個路由器。搜尋與生成是兩個獨立的失敗面,刻意解耦,可以各自除錯、各自抽換。
batch · nightly
engine/
Python。每晚透過 run-nightly.bat 跑 agent 鏈,綜合出點子。沒有 HTTP API。
artifact
ideas.json
當天的產物,落在 data/<日期>/。每個點子含問題、解法、市場、護城河、分數、來源。
read-only UI
webapp/
Next.js 16。dashboard、kanban、territory、settings,純讀取 JSON、本機優先。
引擎內部是三個互不相識的純模組,加一層膠水。下面這幅 橫向絵巻 把完整管線 從左到右畫成一幅手卷:領域挑選 → agent 鏈 → SearXNG → 綜合 → ideas.json → webapp。 用鍵盤方向鍵、拖曳、或捲動可在這條手卷裡左右移動。
想看引擎內部三個對等模組如何被同一層膠水串起,下面這張靜態分層圖標出全部細節:
四個階段,點開看細節
挑選領域 / Domain selection agent_research._select_domains
依 config.yaml 的 strategy 與 theme_schedule,每天從領域池洗牌挑出十個槽位
(themed 日會把一半灌進當日主題,其餘隨機)。當天還會依年內日序輪選一個「purpose lens」價值透鏡,
讓部分點子帶上特定框架,其餘維持純探索。
抓網路訊號 / Web context search.search → SearXNG (Brave fallback)
針對每個領域組查詢,先打本機 SearXNG(127.0.0.1:8888 的 Docker 容器),
回傳純 dict 清單 {title, url, snippet, engine}。SearXNG 掛掉或上游引擎全被擋時,
落到 Brave(需 BRAVE_API_KEY)。全部失敗則 prompt 標註「無即時網路結果」,agent 改用既有知識綜合。
渲染 prompt / Prompt as a file skill_loader.load_skill('research')
研究 prompt 是一個檔案,住在 engine/skills/research/SKILL.md:YAML frontmatter + Jinja body。
把領域、搜尋脈絡、價值透鏡填進去渲染出最終 prompt。改這個檔案,下一次運行行為就變,不用改任何程式碼、不用重新部署。
調度 agent 鏈 / Tiered dispatch agents.dispatch · claude → codex → gemini → ollama
agents.dispatch 依品質分級(claude t10 → codex t9 → gemini t7 → ollama t6)逐一嘗試。
所有失敗模式(非零退出、逾時、空 stdout、OSError)都正規化成同一條「這個輸了,換下一個」的路徑。
預設 min_tier=8 只放行 claude 與 codex。最後把 agent 回傳的 JSON 解析成一個 Idea,
寫進當天的 ideas.json。
其二 / Scene II
生成演練 / Watch today's run
真正的引擎一晚才跑完。這裡用今天(2026-05-31)真實的 ideas.json 在瀏覽器端重播一次:
先串流 agent 鏈的每一步,再讓十張真實點子卡像晨露凝結般一張張顯現。完全離線、不呼叫任何後端。
開啟「減少動態效果」(prefers-reduced-motion) 時,會略過動畫直接顯示全部結果。
其三 / Scene III
站長控制台 / Owner controls
以上每個點子,站長可以決定下一步。解鎖後,每張卡會長出站長操作,主要的一個是 「進行 MVP 製作 / Build MVP」。下面是一道僅供原型展示的密碼閘。
已解鎖。 每張點子卡下方已出現站長操作。你也可以從這裡觸發一次新的生成(同樣是佔位)。
這些操作都是佔位 stub:不會真的呼叫引擎(引擎要跑一整晚),只會顯示確認對話框與通知。