arcrun — AI workflow execution engine (clean history)

Self-hosted 開源:WASM 零件 + recipe + cypher-executor,跑在你自己的 Cloudflare。

此為重建的乾淨歷史起點(移除曾誤 commit 的 GCP SA 金鑰,舊歷史保留在
richblack/arcrun 與本地 backup 分支)。含:
- acr init --self-hosted installer(建 KV/R2 + codeload 拉預編譯 wasm + wrangler deploy + seed recipe)
- recipe push 把關(資料外流提醒 + 打通檢查)
- 19 個正當零件預編譯 wasm(claude_api/km_writer/kbdb_upsert_block 排除:違反 DECISIONS §1)
- CLI / cypher-executor / registry / 完整 SDD

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
uncle6me-web
2026-06-03 15:52:38 +08:00
commit 922a57fe34
485 changed files with 89356 additions and 0 deletions
@@ -0,0 +1,38 @@
# parallel-fanout
## 解決什麼問題
同一份輸入要做多種處理(摘要 / 翻譯 / 分類 / 等)。
不想等順序執行(總時長 = 全部加總)→ 並行(總時長 = 最慢一個)。
## 怎麼觸發
```bash
curl -X POST https://cypher.arcrun.dev/webhooks/named/parallel_fanout/trigger \
-H "X-Arcrun-API-Key: ak_xxx" \
-d '{"api_key":"ak_xxx","text":"...","target_lang":"en"}'
```
## 預期行為
- 3 個子 workflow 同時啟動,各自獨立執行
- 主 workflow 返回所有子 workflow 都 trigger 成功的時間(毫秒級)
- 子 workflow 完成的結果**不會回到** parent —— 各自寫各自的 KBDB / 通知
## 改成你自己的
- 增 / 減 dispatch 節點數
- workflow_name 換你的真實處理 workflow
- 若需要等子 workflow 都完成 → 子 workflow 寫完成標記到 KBDBparent 後續 cron 撿
## 變體:等所有子 workflow 完成
arcrun 預設 trigger_workflow 是 fire-and-awaitpaused 也算 success)。
若要嚴格「等到完成」,要:
1. 子 workflow 末步寫 `done:{request_id}` block 到 KBDB
2. parent 加 polling 節點 + wait 重試
M2 之後會出 wait_for_workflows 內建零件)
## 為什麼這 pattern 重要
- arcrun 是 multi-tenant / multi-tier 平台。Fan-out 讓你能 build「主 controller + N 個 worker」架構
- 比 promise.all 更穩:每個子 workflow 獨立 paused/resume,互不污染狀態
## 學到什麼
- **Fan-out**:一個節點多條 ON_SUCCESS 邊出去,並行執行
- `trigger_workflow` 是內建 orchestration 零件(cypher-executor in-process call,繞 CF self-fetch
- input 變數在 fan-out 時複製給每條分支(不互相影響)
@@ -0,0 +1 @@
["fan-out", "parallel", "trigger_workflow", "multi-step", "advanced"]
@@ -0,0 +1,35 @@
name: parallel_fanout
description: 一份輸入分發多個子 workflow 並行處理(trigger_workflow 模式)
flow:
- "input >> ON_SUCCESS >> dispatch_to_summary"
- "input >> ON_SUCCESS >> dispatch_to_translate"
- "input >> ON_SUCCESS >> dispatch_to_classify"
config:
# 三個並行子 workflow 觸發。各自獨立執行、互不影響、不等彼此
# cypher-executor 處理 fan-out:三條邊同源 (input) → 三個目標各自跑
dispatch_to_summary:
component: trigger_workflow
workflow_name: "llm_classify_example" # 改成你的 summary workflow
api_key: "{{api_key}}"
input:
api_key: "{{api_key}}"
text: "{{input.text}}"
dispatch_to_translate:
component: trigger_workflow
workflow_name: "your_translate_workflow"
api_key: "{{api_key}}"
input:
api_key: "{{api_key}}"
text: "{{input.text}}"
target_lang: "{{input.target_lang}}"
dispatch_to_classify:
component: trigger_workflow
workflow_name: "llm_classify_example"
api_key: "{{api_key}}"
input:
api_key: "{{api_key}}"
text: "{{input.text}}"