# llm-classify

## 解決什麼問題
LLM 結構化輸出最常見場景：把自由文字分到固定 category。
claude_api 用 `_recipe_output_format: json` 自動 parse + validate 必填欄位。

## 怎麼觸發
```bash
curl -X POST https://cypher.arcrun.dev/webhooks/named/llm_classify_example/trigger \
  -H "X-Arcrun-API-Key: ak_xxx" \
  -d '{"api_key":"ak_xxx","text":"How to deploy Cloudflare Workers in production?"}'
```

## 預期結果
- claude 回 JSON `{category, confidence, reason}`
- KBDB 寫一筆 block，tags_json 含 `category:tech`
- response 回 `{success: true, data: {id, ...}}`

## 為什麼這 pattern 重要
- `_recipe_output_format: json` + `_recipe_output_required_fields` 是 claude_api 的 magic：
  Claude 回 JSON 後 cypher-executor 自動：
  1. 剝 ```json fence
  2. parse
  3. 驗 required fields 存在
  4. 把每個欄位（category / confidence / reason）放到 ctx 頂層，下游 `{{category}}` 直接用
- 不用寫 parse / validate / shape 邏輯，純 prompt + schema

## 改成你自己的
- prompt 改你的分類規則（category 清單可長可短）
- 下游 save_with_tag 可換成 telegram 推播 / gmail / 等
- 若需要多步分類（先粗分後細分），鏈兩個 claude_api 節點即可

## 注意
- claude_api 走 mira daemon (Phase A)，會 paused 一陣子等 callback resume
- 若 prompt 抽不出 required_fields，會 validation_failed 不寫 KBDB（safer than partial save）
