敵方 agent 真的接上 0G 了:修掉不存在的模型名、關掉 thinking、驗證改用 provider 位址 - #18
Merged
Merged
Conversation
實際打了一次 router 才發現,整套 0G Compute 的接線從頭到尾沒有生效過。
一、預設模型 deepseek-chat-v3-0324 在 router 上不存在
{"error":{"message":"Model not found. See GET /v1/models ...","code":"model_not_found"}}
每一回合都拿到 404 → 靜靜退回本地啟發式。敵方 agent 從來沒有真的跑在 0G 上,
而狀態燈一直是綠的,因為當時只檢查「有沒有設金鑰」。
· 預設改成 0gm-1.0-35b-a3b。
· agent.js 裡有第二份重複的 providerConfig,把模型名又寫死了一次 —— 兩個真相
來源,而實際打 router 的是那一份。刪掉,改成從 og/_shared.js 匯入。
· status.js 現在會真的去打 /v1/models,確認設定的模型存在。設了金鑰不等於
叫得動那個模型 —— 這個假綠燈就是讓上面那個 bug 躲了那麼久的原因。
二、模型選擇的判準是 verifiability,不是「有沒有 TEE 字樣」
router 的 /v1/models 標三種狀態,差別直接決定 TEE 的主張成不成立:
TeeML 模型本身跑在 TEE 裡 ← 只有這個撐得起「同一位 agent」
TeeTLS TEE 只終結 TLS,推論在上游廠商那邊(大多數模型是這種)
(沒有) 完全沒有 TEE —— Claude / GPT 系列都屬於這類
TeeML 的只有五個。選 0gm-1.0-35b-a3b:支援 response_format(-sia 不支援)、
glm-5.3 的 deep thinking 關不掉逐回合太慢、而且便宜。status 現在把 verifiability
一起回報,選錯模型會直接顯示成「非 TEE 模型」。
三、這個模型預設開著 thinking,會把 max_tokens 吃光
"content": "", "reasoning_content": "Here's a thinking process...",
"finish_reason": "length", "reasoning_tokens": 35
content 是空的 → 解析不到 JSON → 又退回本地啟發式。實測 reasoning_effort: 'none'
有效:reasoning_tokens 0、content 直接是乾淨的 JSON、只花 10 個 token。
max_tokens 也從 320 拉到 512。
四、0G 不隨回應附簽名,但有 provider 鏈上位址
實際回應裡沒有 signature / attestation 欄位,所以 attested 與 signed 這兩級目前
拿不到。但每次回應都帶服務它的 provider 位址(標頭 x-provider,body
x_0g_trace.provider)。配合 router 標的 TeeML,可以做出一個誠實而且有意義的主張。
新增兩級,並讓「換過」變成獨立的否定結果:
same-provider 每回合同一個 provider,且模型登記為 TeeML
same-provider-untrusted 每回合同一個 provider,但模型不是 TeeML
changed provider 位址或簽章公鑰中途換過
ok 仍然只留給 attested —— same-provider 是有意義的證據(provider 被換掉抓得到),
但不是我們自己驗過的密碼學證明,徽章給琥珀色不給藍色,文案也講明這一點。
另外 same-agent 改成由伺服器自己去 router 查 TEE 狀態,不再採信前端送來的
attestation —— 要證明給玩家看的結論,材料不能由被證明的那一方提供。
本地實測:
沒有金鑰 → status: modelAvailable=false, error="未設定 OG_COMPUTE_API_KEY"
同一 provider → same-provider-untrusted(查不到 TeeML 時的正確降級)
中途換掉 → changed「provider 位址中途換過(出現 2 個)」
沒有身分 → consistent
完整對局 → 5 回合勝 3:0,行為與改動前一致
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015NBxaWtzqEX3i8NvoZEeq3
npm run check:links 在上一個 commit 後立刻報出 4 個跑掉的連結 —— 正是加它的理由。
_shared.js#L89-L97 → #L108-L116 ogComputeConfig 被新註解往後推
status.js#L34-L57 → #L35-L58 probeIndexer
status.js#L59-L157 → #L60-L177 onRequestGet
agent.js#L188-L291 → #L168-L276 刪掉重複的 providerConfig 後整體上移,
舊範圍甚至超出檔案長度(279 行)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015NBxaWtzqEX3i8NvoZEeq3
There was a problem hiding this comment.
🟡 Changes recommended
有幾處邏輯會造成誤判或相容性問題(例如 reasoning_effort 對 OpenAI 供應商的請求、same-agent 的 per-turn 比對、providerAddress 格式未驗證)。
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
這個 PR 針對 0G Compute Router 的實際接線失效問題做修正:更換成 router 上存在且具 TeeML 的預設模型、關閉預設 thinking 以避免回傳空 content 造成靜默 fallback,並把「同一位 agent」的驗證改為由伺服器端主動向 router 探測模型/TEE 狀態,同時新增以 provider 位址為主的降級驗證層級與 UI 呈現。
Changes:
- 修正 0G Compute 預設模型為
0gm-1.0-35b-a3b,並移除 agent 端重複/寫死的 provider 設定來源,統一由og/_shared.js提供。 - 新增 router
/v1/models探測(含verifiability),讓 status 與 same-agent 驗證能判斷模型是否可用且是否為 TeeML。 - 前端/後端驗證邏輯與 UI 文案更新:加入
same-provider/same-provider-untrusted/changed等層級與 provider 位址證據顯示;並在 agent 呼叫時關閉 thinking、提高max_tokens。
File summaries
| File | Description |
|---|---|
| README.md | 更新 0G Compute 模型與 Router/TEE 主張的說明與連結行號。 |
| public/js/main.js | 更新 same-agent 驗證呼叫方式與徽章/逐回合顯示文案。 |
| public/css/style.css | 新增 same-provider / same-provider-untrusted 徽章樣式。 |
| functions/api/og/tee.js | 新增 router models 探測、擴充證據抽取與驗證分級(含 provider 位址)。 |
| functions/api/og/status.js | status 端點改用 probeComputeModel 真實檢查模型可用性與 TeeML 狀態。 |
| functions/api/og/same-agent.js | same-agent 改由伺服器端 probe router 取得 verifiability/TEE 資訊並回傳逐回合結果。 |
| functions/api/og/_shared.js | 新增 TeeML 預設模型常數並統一 provider 設定來源。 |
| functions/api/agent.js | 改用共享 providerConfig、提高 token、加入關閉 thinking 參數。 |
| .env.example | 更新 OG_COMPUTE_MODEL 預設與 verifiability(TeeML) 說明。 |
Review details
Suppressed comments (1)
functions/api/og/tee.js:184
providerAddress目前不論格式只要有值就會納入統計與一致性判斷;若上游回應裡有一般的provider欄位(非鏈上位址),可能被誤當成位址,導致same-provider/changed誤判。建議在計算addresses/addressed時只接受看起來像 0x40-byte 位址的字串。
const lower = (v) => (v ? String(v).toLowerCase() : null);
const signers = new Set(turns.map((t) => lower(t.signer)).filter(Boolean));
const addresses = new Set(turns.map((t) => lower(t.providerAddress)).filter(Boolean));
const models = new Set(turns.map((t) => t.model).filter(Boolean));
const providers = new Set(turns.map((t) => t.provider).filter(Boolean));
- Files reviewed: 9/9 changed files
- Comments generated: 4
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+209
to
+213
| // 0G 自家模型預設開著 thinking,實測 max_tokens 會被推理吃光、content 回空字串 | ||
| // (reasoning_tokens 35 / finish_reason "length" / content "")。解析不到 JSON | ||
| // 就會靜靜退回本地啟發式 —— 正是這個 bug 躲了那麼久的原因。 | ||
| // reasoning_effort: 'none' 實測有效:reasoning_tokens 0,content 直接是乾淨的 JSON。 | ||
| reasoning_effort: 'none', |
Comment on lines
+66
to
+71
| // 「跟第一回合是不是同一個」—— 有簽章公鑰就比公鑰,沒有就比 provider 位址 | ||
| sameAsFirst: (() => { | ||
| const mine = t.signer || t.providerAddress; | ||
| const first = chain[0].signer || chain[0].providerAddress; | ||
| return !mine || !first ? null : mine.toLowerCase() === first.toLowerCase(); | ||
| })(), |
| */ | ||
|
|
||
| import { sha256Hex } from './_shared.js'; | ||
| import { sha256Hex, ogComputeConfig } from './_shared.js'; |
| @@ -890,10 +890,19 @@ async function pollStorage(root, note, attempts = 6) { | |||
| * 結果分四級,刻意不做成通過/不通過:能證明到哪一層完全取決於供應商回了什麼。 | |||
| * 把「只是紀錄一致」畫成綠燈,比沒有這個功能更糟。 | |||
k66inthesky
added a commit
that referenced
this pull request
Sep 10, 2026
三條賽道線上全部實測通過,文件跟上。 README 有一列講反了 —— 最後那列還寫「敵方 AI agent(OpenAI,非 0G)… 對戰時每回合 都要叫一次,需要低延遲,所以另外走 OpenAI」。那正是 #16 / #18 改掉的東西。改成說明 敵方 agent 本體就跑在 enclave 裡,並點明這是 TEE 主張的關鍵前提。 第一列的判準也修正了:原本寫「金鑰在 pc.0g.ai 選 Private(TEE enclave)模式」, 但真正的判準是模型的 verifiability —— TeeML 才代表模型本身在 enclave 裡, TeeTLS 只有傳輸層。金鑰模式決定不了這件事。 新增三列:同一位 agent 的證據鏈、分級驗證(為什麼刻意不回傳 true/false)、 模型可用性探測(它要解決的就是「有金鑰但模型不存在」那個假綠燈)。 接力圖重畫,把證據鏈那條線畫進去 —— 鏈上那個 SHA-256 不只蓋住戰報敘述,也蓋住 「這七回合是同一位 agent 打的」那份證據,第三方拿摘要就能重驗整場。 端點清單補上 same-agent,示範刻意用「第 2 回合換掉 provider」的鏈,實跑確認會回 level: "changed" —— 不是寫一個沒驗過的範例。 簡報第 5 頁的 0G Compute 卡片從「金鑰為 TEE enclave 模式 / deepseek-chat-v3-0324 / 敵方 agent 另走 OpenAI」改成「0gm-1.0-35b-a3b · TeeML · TDX / 敵方 agent 本體跑在 enclave 裡 / 整場七回合同一個 provider」。0G Storage 那張改成通過,結語補上「刻意不 回傳 true/false」,第 3 頁失效的行號一併更正。五頁重新渲染,都確認沒有溢出。 行號連結從 15 個增加到 19 個,npm run check:links 全過。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
實際打了一次 router 才發現,整套 0G Compute 的接線從頭到尾沒有生效過。
一、預設模型在 router 上不存在
{"error":{"message":"Model not found. See GET /v1/models ...","code":"model_not_found"}}deepseek-chat-v3-0324不在清單裡。每一回合都拿到 404 → 靜靜退回本地啟發式。敵方 agent 從來沒有真的跑在 0G 上,而狀態燈一直是綠的 —— 因為當時只檢查「有沒有設金鑰」。0gm-1.0-35b-a3bagent.js裡有第二份重複的providerConfig,把模型名又寫死了一次 —— 兩個真相來源,而實際打 router 的是那一份。刪掉,改成從og/_shared.js匯入status.js現在會真的去打/v1/models確認模型存在。設了金鑰不等於叫得動那個模型 —— 這個假綠燈就是讓上面那個 bug 躲那麼久的原因二、選模型的判準是
verifiabilityTeeMLTeeTLSTeeML 的只有五個。選
0gm-1.0-35b-a3b:支援response_format(-sia不支援)、glm-5.3的 deep thinking 關不掉逐回合太慢、而且便宜。status 現在把verifiability一起回報,選錯模型會直接顯示成「非 TEE 模型」。三、這個模型預設開著 thinking,會把 max_tokens 吃光
content是空的 → 解析不到 JSON → 又退回本地啟發式。實測reasoning_effort: 'none'有效:reasoning_tokens0、content 直接是乾淨的 JSON、只花 10 個 token。max_tokens320 → 512。四、0G 不隨回應附簽名,但有 provider 鏈上位址
實際回應沒有
signature/attestation欄位,所以attested與signed這兩級目前拿不到。但每次回應都帶服務它的 provider 位址(標頭x-provider、bodyx_0g_trace.provider)。新增兩級,並讓「換過」成為獨立的否定結果:
same-providersame-provider-untrustedchangedok仍然只留給attested——same-provider是有意義的證據(provider 被換掉抓得到),但不是我們自己驗過的密碼學證明,所以徽章給琥珀色不給藍色,文案也講明這一點。另外
same-agent改成由伺服器自己去 router 查 TEE 狀態,不再採信前端送來的 attestation —— 要證明給玩家看的結論,材料不能由被證明的那一方提供。測試
npm run check:links在第一個 commit 後立刻報出 4 個跑掉的連結(其中agent.js的舊範圍甚至超出檔案長度)—— 正是加它的理由,已在第二個 commit 修好。🤖 Generated with Claude Code
https://claude.ai/code/session_015NBxaWtzqEX3i8NvoZEeq3
Generated by Claude Code