AI Horde 可以成為學生 AI Agent 的第十五種燃料,但它不是一個承諾固定 token 額度的商業 API。它是由社群志工分享閒置 GPU 與 CPU 的免費生成服務,透過佇列把文字或圖片工作交給當下可用的 worker。這個差異很重要:學生拿到的是免費的社群計算機會,不是永遠在線、固定延遲、固定模型或固定 RPM 的供應合約。

當日敲門模型:google/gemma-4-31b(查核快照)
以 2026 年 8 月 25 日直接回讀 AI Horde 官方文字模型狀態 endpoint 的結果,本文先把 google/gemma-4-31b 當成敲門候選:它在當日 catalog 可見,查核當下回傳 queue 528、ETA 約 22 秒。這些數字會隨志工 worker 和佇列即時變動,不能當成品質排名、固定延遲或 SLA;模型名稱也不代表每次都由同一組權重或 worker 完成。主要 Agent 每次提交前仍要重新讀取 官方 text model status,核對模型可用性、license、queue、deadline 和課程 allowlist;若候選消失或排隊超過門檻,就回到本地 mock/fallback,不輪換 key 繞過限制。
因此本文把 AI Horde 放在主要 Agent 的低風險、可等待、可取消實驗層。它適合做摘要草稿、改寫練習、提示詞比較、離線教材的文字生成,以及不含敏感資料的圖片概念草圖;不適合承擔登入流程、付款決策、即時客服、醫療或法律判斷、機密資料處理,或任何使用者會依賴固定完成時間的 production 路徑。免費不等於可以忽略資料權利和服務條件。
AI Horde 的免費來源
AI Horde 官方首頁說明,服務由志工分享 spare computer power,提供文字與圖片生成;官方 Mission 頁進一步把它描述成 volunteer-run、non-profit 的開放生成服務。這是一種共享算力模型,不是把供應商的試用金額換算成 token 後交給你。當志工 worker 上線,某些模型才有可用算力;當 worker 離線或請求突然增加,排隊時間就可能改變。
官方首頁也提供即時狀態與統計入口,讓開發者查看 worker、throughput 和 queue depth。主要 Agent 應在送出工作前取得當下模型和佇列狀態,保存查核時間,並且把狀態視為 admission signal,而不是承諾。不要把今天看到的 worker 數、最快完成時間或某次成功結果寫成下一週仍然存在的服務水準。
Kudos 不是免費 token
AI Horde 的 Kudos 是佇列優先級與社群貢獻的記帳單位,不是文字 token、圖片像素,也不是可兌換現金的 credit。官方 FAQ 和 Mission 頁說明,worker 完成請求可以得到 Kudos,使用者用它提高自己請求的優先級;Kudos 不能買賣,官方 Mission 更明確說優先權不能用付費購買。主要 Agent 不應把 Kudos 當成「還剩多少免費 token」顯示給學生。
未註冊的匿名請求可以開始學習,但在併發量高時優先級最低。註冊帳戶會產生自己的 API key,並能以社群貢獻建立優先級。這不代表可以建立多個帳戶輪流排隊,也不代表可以蒐集別人的 key。帳戶、Kudos 和請求歷史要維持單一可追溯的使用者邊界;遇到排隊,不以換 key、偽造身份或大量重送來規避系統。
註冊與匿名路線
官方 Register 頁提供帳戶建立流程,也提醒由第三方 provider 登入時會產生一把 API key。頁面說明,若只建立匿名帳戶而遺失 key,服務方無法替你恢復,通常需要重新註冊;因此 key 應由持有人放在自己的秘密管理器或環境變數中。本文不展示任何可直接使用的匿名識別值,也不收集學生帳戶的真實 key。
對課堂來說,匿名路線可用來做最小化的 connectivity mock,但不適合當作共享 production credential。若真的需要註冊,學生自行在官方網站建立自己的 key,gateway 只接受校內批准的短任務,不把 key 放入前端、Git、截圖、教學文章、issue 或公開日誌。課堂結束後由持有人檢查 usage,必要時撤銷並重新建立自己的 key。
直接 REST API 的生命週期
AI Horde 的官方 REST 文件列出文字生成與圖片生成的 asynchronous endpoint。一次請求通常不是立刻回傳完整答案,而是先建立 job,再用回傳的 id 查詢狀態。文字路線可使用 POST /v2/generate/text/async 提交,使用 GET /v2/generate/text/status/{id} 讀取,若超過本地 deadline,則以 DELETE /v2/generate/text/status/{id} 取消未完成工作。圖片路線也有相對應的 async、status 和 cancel endpoint。
這個生命週期應該由 adapter 封裝,而不是讓每個學生 notebook 自己無限輪詢。adapter 要保存 request id、模型、建立時間、deadline、輪詢次數、最後一次狀態和取消結果;完成後只回傳必要的生成結果與來源 metadata。若結果包含 worker 或模型資訊,也要保留它,讓後續評估知道一次回答是在哪個可變的社群環境產生。
const apiKey = process.env.AI_HORDE_API_KEY;
const model = process.env.AI_HORDE_TEXT_MODEL || 'google/gemma-4-31b';
const baseUrl = 'https://aihorde.net/api';
if (!apiKey) {
throw new Error('Set AI_HORDE_API_KEY on the server');
}
const response = await fetch(`${baseUrl}/v2/generate/text/async`, {
method: 'POST',
headers: {
apikey: apiKey,
'Client-Agent': 'student-agent-lab:1.0',
'Content-Type': 'application/json'
},
body: JSON.stringify({
prompt: '只使用公開教材,產生一段可人工核對的摘要草稿。',
models: [model],
params: {
max_length: 160,
max_context_length: 2048,
temperature: 0.2
}
})
});
if (!response.ok) throw new Error(`AI Horde submit failed: ${response.status}`);
const job = await response.json();
console.log({ id: job.id, warnings: job.warnings ?? [] });
這段範例只示範 server-side request 的形狀,沒有放真實 key;預設模型只是 2026-08-25 的查核候選,不是永久固定名稱。正式 gateway 必須在提交前以當日 model status、課程 allowlist、模型 license 和 queue read-back 覆寫或拒絕它;可用模型會受志工 worker、模型版本與社群狀態影響。max_length 和 max_context_length 也應該由本地課程預算限制,不能因為免費就把上下文和輸出拉到最大。
輪詢、期限與取消
AI Horde 官方文件把 status 和 cancel 分成不同操作。主要 Agent 要設一個比課堂任務更短的本地 deadline,例如實驗最多等待幾十秒或幾分鐘,實際值依任務而定;deadline 到達後停止輪詢,嘗試取消,並把結果標成 cancelled 或 timed_out。不要讓瀏覽器關閉、網路斷線或學生離開頁面後,後端仍持續提交大量無主工作。
async function waitForHorde(jobId, apiKey, timeoutMs = 90000) {
const baseUrl = 'https://aihorde.net/api';
const started = Date.now();
let delayMs = 2000;
while (Date.now() - started < timeoutMs) {
const response = await fetch(
`${baseUrl}/v2/generate/text/status/${encodeURIComponent(jobId)}`,
{ headers: { apikey: apiKey } }
);
if (!response.ok) throw new Error(`AI Horde status failed: ${response.status}`);
const status = await response.json();
if (status.done) return status;
await new Promise((resolve) => setTimeout(resolve, delayMs));
delayMs = Math.min(8000, Math.round(delayMs * 1.4));
}
const cancel = await fetch(
`${baseUrl}/v2/generate/text/status/${encodeURIComponent(jobId)}`,
{ method: 'DELETE', headers: { apikey: apiKey } }
);
if (!cancel.ok && cancel.status !== 404) {
throw new Error(`AI Horde cancel failed: ${cancel.status}`);
}
throw new Error('AI Horde job timed out and was cancelled or already finished');
}
範例用有限輪詢和退避,並把取消當成明確的狀態轉移。實作時還要處理 job 已完成但結果尚未完整回讀、取消與完成同時發生、網路 timeout、服務暫時不可用,以及同一個 job 被重複回收等情況。若 cancel 回傳失敗,gateway 要留下人工可查的 job id,不要立刻重送同一份 prompt。
佇列不是 rate limit 表
商業 API 常以 RPM、TPM 或每日額度描述容量;AI Horde 的核心體驗是社群佇列,完成時間取決於請求優先級、模型、等待中的工作和在線 worker。官方首頁提供 live status 與 queue depth,但沒有給學生一個可以永久承諾的固定 token 表。文章、gateway 和課程說明都應寫「當下狀態」,不能把一個觀察值宣稱成 SLA。
每一個請求仍要有本地 token 或字元預算,因為沒有固定 provider quota 不代表本地成本為零。長 prompt 會延長排隊和消耗 worker 資源;無限制併發也會傷害社群服務。主要 Agent 可以用每位學生的每日 request budget、同時工作的上限、每個工作最大輸出和總等待時間,先在自己的 gateway 做 admission control。
OpenAI 相容 pilot 的界線
AI Horde 另有官方 OpenAI API microservice pilot,目的是讓已有 OpenAI API client 的工具接到社群 LLM 算力。官方頁面明確提醒,這條路線比 direct AI Horde API 有更多限制,context window 和 max tokens 會被當下可用 worker 所限制,而且 pilot 可能依流量和資源影響而收縮或擴大。它因此適合相容性教學,不應被誤寫成穩定的 OpenAI drop-in replacement。
如果主要 Agent 使用 OpenAI SDK,先建立一個 provider adapter,將 model、base URL、timeout、max tokens、資料分類和錯誤分流全部顯式設定。不要把學生在網路上找到的第三方 proxy 當成官方路線,也不要把 direct REST 的工作送到 pilot 後就假設兩者支援完全相同的參數。每次切換都要重新執行 mock、status、取消和輸出格式測試。
文字與圖片要分開治理
官方 REST 文件同時列出文字和圖片生成,因此 AI Horde 可以支援多媒體教學;但文字與圖片的 prompt、模型、結果保存、內容過濾、模型 license 和評估方法不同。主要 Agent 不應用一條 generic generate 函式把兩者混在一起。文字任務要評估事實、引用和拒答;圖片任務要評估人物權利、商標、來源、輸出標記和是否能公開發布。
模型清單與 worker 狀態會改變,同一個 model name 不應被當成固定權重的永久身份。每次請求保存 model name、狀態查核時間、參數、request id 和輸出 hash;如果課堂要比較模型,固定資料、提示、seed 規則和評估集,並記錄當時可用的 worker 條件。比較結果只能說明該次社群狀態,不代表供應商長期品質。
志工 worker 的資料邊界
AI Horde 的 Worker 頁面說明,API 在把 request 派給 worker 前會做匿名化,worker 不會收到提交者的 identifying information。這是重要的保護,但不是學生可以把秘密送出的理由。prompt 本身可能包含姓名、帳號、研究內容、內部 URL、密碼片段或可推回身份的上下文;匿名化請求者,不會自動消除 prompt 內的敏感內容。
免費社群路線的預設資料分類應是 public 或 synthetic。禁止送出 API key、cookie、session、密碼、付款資料、個資、健康資訊、未公開程式碼、商業機密、學生作業原文或會觸發外部工具的指令。若要練習 RAG,先在本地把資料替換成合成文件和假來源;若任務仍需要真實私有資料,就退出 AI Horde 路線。
隱私、條款與模型 license
官方站點提供 Privacy Policy 和 Terms of Service 的入口,OpenAI API pilot 頁面也說明 direct service 的條款和隱私政策同樣適用。學生建立課程 adapter 前,應保存查核日期、使用的 endpoint、帳戶型態、資料分類、內容政策、輸出保存期限和模型 license。只讀到「免費」三個字,不能代替這些法律與產品檢查。
AI Horde Mission 頁面主張使用與推廣 open-source models,但實際可用模型的 license、訓練資料限制、商標條款和輸出權利仍要以該模型的正式資料為準。學生做文章、圖片或程式碼練習時,保留 model attribution 和來源,並把「可在課堂實驗」與「可商業發布」分成兩個判斷。沒有 license 證據時,不自動公開輸出。
錯誤分流與停止條件
AI Horde adapter 要把錯誤分成可等待、可取消和需人工的三類。網路 timeout、暫時無 worker 或佇列太長,可以在仍有本地 deadline 時有限等待;請求格式錯誤、model 不存在、內容政策拒絕和超出參數邊界,要先修正輸入;身份錯誤、key 遺失、帳戶狀態異常和反覆服務錯誤,則應停止而不是換 key 重試。
同一份工作最多做一次有限 retry,且每次 retry 要產生新的 attempt 記錄。遇到無 worker、等待超過 deadline、取消失敗、輸出不完整、模型回傳與 allowlist 不一致、內容安全檢查不明確,回傳 human_review_required 或 provider_unavailable。不要把「沒有收費」當成可以無限重試的理由,因為社群資源和學生的任務預算仍然有限。
主要 Agent 的安全 adapter
function admitHordeTask(task, liveState) {
const allowedKinds = new Set(['public_text_draft', 'synthetic_image_prompt']);
if (!allowedKinds.has(task.kind)) return { ok: false, reason: 'data_policy' };
if (task.prompt.length > 8000) return { ok: false, reason: 'input_budget' };
if (task.attempts >= 2) return { ok: false, reason: 'retry_budget' };
if (!liveState.modelAvailable) return { ok: false, reason: 'provider_unavailable' };
if (liveState.queueDepth > task.maxQueueDepth) {
return { ok: false, reason: 'queue_too_long' };
}
return {
ok: true,
policy: 'low-risk-community-queue',
deadlineMs: Math.min(task.deadlineMs, 90000)
};
}
const decision = admitHordeTask(studentTask, currentHordeState);
if (!decision.ok) {
console.log({ status: 'human_or_local_fallback', reason: decision.reason });
} else {
console.log({ status: 'ready_to_submit', deadlineMs: decision.deadlineMs });
}
這個 admission gate 把資料分類、輸入長度、重試次數、即時模型狀態和佇列深度放在提交前檢查。currentHordeState 必須由官方 status endpoint 或可信的內部快照取得,不能由學生自己填一個永遠為真的布林值。實際系統還要加上每日請求預算、課程使用者身份、結果保存規則、內容檢查與 audit log;範例不是可以直接當 production policy 的完整實作。
學生可以做的三種練習
第一種是 async queue lab:用合成 prompt 提交一個小型文字工作,觀察 request id、等待、status、完成、取消和 timeout,最後把每個狀態畫成事件時間線。這能讓學生理解非同步 provider,而不是只學會把一個 endpoint 包成 chat function。第二種是模型比較:在固定的公開題目和小輸出上,記錄模型、worker 條件、等待時間、答案品質和失敗率。
第三種是多媒體治理:先只做不含真實人物和品牌的圖片概念 prompt,再比較圖片輸出的 metadata、license 研究、人工審核和發布前阻擋。若要把結果送到 YOLO LAB 或其他公開網站,必須另外通過來源、權利、編輯與發布閘門,不會因為 AI Horde 免費就自動取得公開發布權。
與其他免費燃料的搭配
AI Horde 適合當 fallback experiment,不適合單獨成為主要 Agent 的唯一 provider。可以把它放在 routing graph 的低優先級節點:先判斷資料是否 public、是否可接受等待、是否有可用 model,再決定送 AI Horde;否則回到本地 mock、已批准的商業免費額度或人工佇列。每個 provider 都要有自己的 adapter、budget、資料政策和停止條件,不能以「免費」為由共用一套寬鬆規則。
這也解釋了為什麼學生不該把所有免費 key 放在一個輪換器裡。輪換會掩蓋限流、破壞可追溯性,還可能違反供應商規則;AI Horde 的 Kudos 與匿名優先級更不應被當成可套利的 token 池。正確做法是先縮小任務、降低 concurrency、等待或取消,再由人工決定是否換到另一個已批准 provider。
觀測與成本帳本
雖然 AI Horde 不以一般商業 token credit 計價,gateway 仍然要建立 usage ledger。至少保存 course id、student pseudonym、task kind、prompt hash、model、request id、submit time、first status、complete time、cancel time、output size、attempt count 和 policy decision。原文 prompt 和完整生成結果只在資料政策允許時保存,公開 dashboard 不應顯示可回推出內容的字串。
用這本帳可以算出課程真正需要的資源:完成率、p50/p95 等待時間、取消率、無 worker 次數、重試比例和每個模型的可用性。這些數字是本課程期間的觀測,不是 AI Horde 的官方 SLA。若 p95 已超過課堂容忍時間,正確動作是把任務標成不可用或改用本地 mock,不是偷偷提高輪詢頻率。
不用 key 也能先完成的 mock
在沒有授權帳戶前,學生仍可先完成 provider contract。用本地 fixture 模擬提交回傳 id、排隊中的 status、完成的 text、timeout、cancel success、cancel race、400、401 和暫時錯誤,讓 adapter 測試不依賴社群佇列。fixture 必須明確標記為 mock,不能把 mock response、固定等待時間或假模型名稱寫成 live capability。
真正需要 live smoke 時,由持有人在官方網站建立自己的 key,在小型 synthetic prompt 上做一次受控測試,再立即檢查 status、結果、帳戶使用量和 key 保存位置。Codex 不代收、建立、分享或猜測學生的 secret;本系列的文章和腳本只保留環境變數名稱與 provider 介面。這樣才有清楚的責任邊界,也不會把公開教學變成秘密散播點。
官方查核入口
開始前先閱讀 AI Horde 官方 REST API 文件 的服務與 endpoint 說明,再以 官方 text model status 和 heartbeat 確認當日模型、佇列與服務狀態。Kudos、worker 和匿名化邊界可回讀 官方 FAQ 與 Worker 說明;OpenAI 相容 pilot 的限制則以 官方 OpenAI API 頁面 為準。
資料和法律判斷要另外查看 Privacy Policy、Terms of Service、Mission 和實際使用模型的 license。官方頁面可能更新,模型、佇列、pilot scope 和內容政策也可能改變;每次課程啟動都應保存查核日期與頁面版本,不能只依賴本篇文章的舊快照。
與主要 Agent 的接線方式
在主要 Agent 中,AI Horde 應被註冊為 community_async_generation provider,能力宣告至少包括 text、image、async、cancel、variable_latency 和 public_data_only。router 先執行資料分類、任務風險、即時佇列和模型 allowlist,再建立一次性 job。完成後,評估器必須把結果標成 draft,除非通過事實檢查、內容檢查、來源檢查和人工批准,否則不能發布或觸發外部工具。
如果要讓學生閱讀更多接線原則,可連到 YOLO LAB AI Agent FAQ,但站內說明不能取代 AI Horde 官方條款。文章的實際交付目標是讓學生知道「何時可以用、何時必須等待或取消、何時必須拒絕」,而不是鼓勵把免費社群算力包裝成無限燃料。
本篇的批准結論
AI Horde 通過本系列的候選介紹,但批准範圍很窄:只作低風險、公開或合成資料、可等待、可取消的學習與 fallback 工作。它沒有固定 token 額度承諾,也沒有穩定 latency 或 production SLA;Kudos 不是 token,匿名優先級最低,OpenAI 相容路線是有明確限制的 pilot。學生若需要穩定主要模型,應回到另一個有清楚額度與條款的已批准 provider。
本篇草稿未建立或分享任何真實 API key,也未宣稱已做 live API smoke。下一次執行前,重新查核官方 model list、queue、terms、privacy 和 OpenAI pilot 狀態;若 live 狀態或條款改變,就重建 adapter manifest。完成一篇後再開始下一篇的原則維持不變:每一個免費入口都要先證明合法、可回讀、可停止,才可以進入學生 Agent 的燃料清單。
若課程要長期使用,還要指定一位維護者每天檢查失敗率與等待分位數,每週清理未完成 job 和過期 fixture;當志工數量下降、模型消失、條款更新或內容風險升高時,立即把 provider 標成 paused。這個暫停狀態要能被 router 真正讀到,並向學生顯示原因與替代練習,不以靜默降級掩蓋社群服務已經不可用。
KEEP READING
接著讀什麼?
從同一主題繼續閱讀,或回到 YOLO LAB 的完整文章索引,找到下一個值得投入時間的問題。


發表迴響