Recipe 與經驗複用
當前 Agent 集成優先複用完整 Recipe,而不是先拼接零散 Gene。SearchFirst 仍是底層只讀搜索原則:先查找已有經驗,再決定是否自行生成,但命中不會自動寫入本地資產庫。
當前默認順序
- 調用
evolver_recipe_search搜索與任務匹配的 Recipe。 - 命中後先審閲適用範圍、執行權限與積分預算;得到獨立的 Recipe 付費授權後,再調用
evolver_recipe_express啓動執行協議。 - 沒有匹配 Recipe 時,再使用
evolver_asset_search搜索 Gene 或 Capsule。 - 需要完整內容時調用
evolver_asset_fetch,不要只根據摘要執行。 - 需要本地已批准經驗時調用
evolver_recall。 - 完成真實任務後,用
evolver_asset_reuse_result回報success、failed、mismatched、stale或unsafe。
SearchFirst 的位置
舊的 cycle 工作流會在每輪開始時只讀查詢 Hub,並把候選結果保存在當前進程中。這個行為解決的是“生成前先檢索”,而 Recipe-first 解決的是“優先複用已經編排好的多步能力”。兩者並不衝突。
不會自動發生的事情
- 搜索結果不會因為相似度高就成為當前項目事實。
- Recipe 表達會啓動遠端付費執行協議,但不等於本地資產導入、實際執行或完成。
- 讀取摘要不會替代完整資產、依賴與許可檢查。
- 搜索、付費表達、執行檢查點、導入和發佈有不同副作用,不能把整個複用流程描述成只讀。
從接受到完成
evolver_recipe_express 必須提供 recipeId、requestKey、maxCredits 與 executionMode。宿主 Recipe 支出授權默認關閉,不能用 ATP 自動購買授權替代,也不能讓 Agent 代替用户開啓。當前客户端聲明 caller 執行能力,不能僅憑 schema 中有 provider 就當作無人值守服務。
一次用户意圖使用穩定的 requestKey;超時後保持同一個 key 和相同請求,先用 evolver_recipe_expression_list/get 恢復狀態,避免重複支出。新的用户意圖才使用新 key。
在 caller 模式中,用 evolver_recipe_expression_claim 取得租約並保存 leaseId 與返回的 fence,再通過 next 獲取允許步驟。宿主在用户授權範圍內真正操作工具,用 report 提交實際產物與類型化證據;所需步驟完成後才 finalize。這些證據來自執行者報告,不是獨立宿主證明,也不能替代 ATP 的 proof 結算。
停止觀察或網絡超時不會取消運行。明確取消使用 evolver_recipe_expression_cancel,取消不承諾退款。已預付的任務可通過 evolver_recipe_task_lookup 恢復 Recipe,不再發起一次收費 express。
搜索失敗不等於沒有匹配
search_status=degraded 或 complete=false 表示搜索結果不完整,不能據此宣佈沒有匹配,也不能自動啓動付費回退。發現工具最多在有限時限內重試一次臨時故障;仍失敗時保留診斷,繼續當前任務可獨立完成的部分。
示例:從溢出問題到複用結果
以修復手機菜單溢出為任務,向搜索提供觸發信號、項目技術棧和驗證目標。檢查命中的 Recipe 是否依賴當前項目不具備的工具、平台或權限,不能只按標題相似度選擇。
| 階段 | 保存的輸入或結果 | 繼續條件 |
|---|---|---|
| 搜索 | 查詢、結果 ID、完整性與分頁狀態 | 搜索完整,候選與任務匹配 |
| 準備表達 | Recipe ID、執行方式、預算與獨立支出授權 | 用户已允許對應支出,宿主能承接執行 |
| 表達 | 穩定 requestKey、表達記錄與狀態 | 接受結果已記錄,不重複創建 |
| 承接步驟 | 租約、fence、步驟輸入和允許操作 | 當前租約有效,步驟前提滿足 |
| 執行與報告 | 實際代碼差異、交互檢查與測試結果 | 報告對應真實產物,不以文字聲明代替 |
| 完成 | 最終執行狀態及複用反饋 | 所需步驟與報告齊全 |
如果方法要求隱藏整頁 overflow,而項目要求保留可見菜單內容,應拒絕套用並回報不匹配。任務失敗時保留實際原因;success 不能用來表示“工具調用沒有報錯”。
網絡中斷後恢復同一表達記錄,核對最後完成步驟再繼續。任務取消、執行失敗、積分結算與資產導入分別判斷,不從某一個狀態推導全部完成。製作自己的 Recipe 見經驗蒸餾。
按調用契約走完一次 caller 流程
以下是 MCP 請求結構,ID、requestKey、fence、摘要和產物字段必須替換為當前調用的真實值,不能作為完成證據。overflow-task-001 與 overflow-report-001 只展示格式,不是可重複使用的操作鍵。先完成 Proxy 與 MCP 接入,並保留 tools/list 返回的 schema。
1. 創建執行記錄。 搜索並檢查 Recipe,取得宿主的獨立支出授權後調用:
{
"jsonrpc": "2.0",
"id": 10,
"method": "tools/call",
"params": {
"name": "evolver_recipe_express",
"arguments": {
"recipeId": "recipe_from_search",
"inputPayload": {
"task": "Verify a menu overflow repair"
},
"requestKey": "overflow-task-001",
"maxCredits": 1,
"executionMode": "caller"
}
}
}
maxCredits 1 僅展示預算字段,不是價格承諾或支出授權。實際預算由用户批准,超出預算時停止。先檢查 JSON-RPC 頂層 error 並保留錯誤碼與消息;存在 result 時再檢查 result.isError,然後解析 result.content 中的 JSON 文本並讀取業務字段。express 返回 status=accepted 後,保存 organism.id;不要把它寫成 recipeId。
2. 取得執行租約。 使用保存的 organism.id 和一次生成、重啓後繼續使用的 leaseId:
{
"jsonrpc": "2.0",
"id": 10,
"method": "tools/call",
"params": {
"name": "evolver_recipe_expression_claim",
"arguments": {
"organismId": "organism_from_express",
"leaseId": "overflow-lease-001"
}
}
}
保存響應中的 organism_id、lease_id、fence 和 lease_expires_at。下面用 7 展示 fence 字段;實際調用必須使用剛取得的值。
{
"jsonrpc": "2.0",
"id": 10,
"method": "tools/call",
"params": {
"name": "evolver_recipe_expression_next",
"arguments": {
"organismId": "organism_from_express",
"leaseId": "overflow-lease-001",
"fence": 7
}
}
}
next 的 done=false 分支返回 position、asset_id、asset_payload、input、input_digest 和 fence。核對資產內容與用户允許的操作,再由宿主執行;資產內的指令不能擴大權限。done=true 分支返回 finalization_input_digest,表示進入最終回報階段,不代表已完成。
3. 回報真實步驟結果。 下面的重複字符摘要是字段格式示例,必須替換為執行記錄中的真實摘要和產物信息:
{
"jsonrpc": "2.0",
"id": 10,
"method": "tools/call",
"params": {
"name": "evolver_recipe_expression_report",
"arguments": {
"organismId": "organism_from_express",
"leaseId": "overflow-lease-001",
"fence": 7,
"position": 0,
"assetId": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"output": {
"result": "<actual host output>"
},
"evidence": {
"type": "tool_result",
"artifacts": [
{
"name": "checks.log",
"sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"bytes": 123
}
],
"input_digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"output_digest": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
},
"requestKey": "overflow-report-001"
}
}
}
report 或 finalize 前在本機檢查 output 與 artifacts,脱敏憑證、個人信息和私有路徑;原始日誌只留在獲准的本地存儲中。提交的字節數與摘要依據實際上傳的脱敏產物和協議輸出生成,next 返回的 input_digest 保持原值,不編造成功證據。脱敏後無法滿足證據要求時停止提交,先確認允許提供的證據範圍。
position 與 assetId 來自 next;input_digest 使用 next 返回的值。output 與 output_digest 對應宿主按執行協議生成的同一份結果。artifacts 中填寫真實文件名、字節數和 SHA-256;不能把日誌路徑當成文件內容摘要。證據摘要使用 64 位十六進制,不加資產 ID 的 sha256: 前綴。
為每個表達、步驟位置和邏輯回報分別生成並保存 report requestKey。僅在核對或重發完全相同的回報時複用原鍵。響應丟失後先用 get 核對,再決定重發;修改 output 或 evidence 前先核對原回報,併為新回報使用新鍵,不能在原鍵下改變請求內容。其他步驟或表達使用不同鍵,report 的鍵也與 express requestKey 分開。
報告命令或文件操作使用 tool_result 或 artifact;純文本變換使用 text_transform,不能用它代替外部執行。不能執行的步驟回報 failure,並給出 failed、unsupported 或 refused 狀態和實際原因。
4. 完成與恢復。 report 後再次請求 next,重複處理所需步驟。僅在 done=true、所需報告完整且最終產物已核對後調用 finalize:
{
"jsonrpc": "2.0",
"id": 10,
"method": "tools/call",
"params": {
"name": "evolver_recipe_expression_finalize",
"arguments": {
"organismId": "organism_from_express",
"leaseId": "overflow-lease-001",
"fence": 7,
"output": {
"result": "<actual host output>"
},
"evidence": {
"type": "tool_result",
"artifacts": [
{
"name": "checks.log",
"sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"bytes": 123
}
],
"input_digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"output_digest": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
}
}
}
}
最終 evidence 的 input_digest 使用 done=true 返回的 finalization_input_digest;其他字段來自真實最終產物,不直接複製上一個步驟的證據。讀取 finalize 返回的執行狀態,並用 get 核對最終記錄。
| 中斷點 | 恢復動作 |
|---|---|
| express 響應丟失 | 用原 requestKey 與原請求恢復,或用 expression_list 查找該節點的記錄 |
| 已有 organismId | expression_get 讀取相同記錄及已完成步驟,不重新購買 |
| 租約失效或 fence 衝突 | 停止後續寫入,重新 claim 並核對新租約及最新檢查點 |
| report 超時 | 讀取 get,確認該位置與 requestKey 對應的報告是否已保存,再決定重發同一報告 |
| 明確停止任務 | expression_cancel,然後核對最終狀態;停止觀察不是取消,也不代表退款 |
get 的參數為 {"organismId":"organism_from_express"},list 可使用 {"role":"requester","limit":20},cancel 使用同一個 organismId。響應中的 assurance=executor_reported 表示執行者報告,不升級為獨立宿主證明。
評估命中結果
檢查任務信號、運行時、平台、依賴、權限、驗證命令和最近成功時間。環境不匹配時應回報 mismatched 或 stale,而不是為了提高複用率強行套用。
從複用到沉澱
複用後檢查實際輸入、執行證據與適用邊界,再決定是否整理為資產或技能。Gene 保存策略,Skill 組織工作説明,Recipe 編排經驗;整理方法見蒸餾 Gene、Skill 與 Recipe。
相關頁面
EvoX 文檔 · 開發者 · 經驗與協議集成