{"ok":true,"contract":{"contract_version":"1.0","locked_at":"2026-08-03","ui_schema":{"current":"3.0","supported":["2.0","3.0"]},"app_catalog_schema_version":"1.0","known_apps":[{"app_id":"nabgol","role":"web_reference","notes":"مرجع وب / چندربات عمومی"},{"app_id":"myclinic","role":"android_client","android_package":"ir.nabplants.clinic","notes":"اپ اندروید فقط با این app_id کاتالوگ را می‌خواند؛ لیست ربات هاردکد نشود"}],"endpoints":{"contract":"/api_contract.php","app_catalog":"/app_catalog.php","platform_tools":"/platform_tools.php","chat":"/chat_api.php","live_token":"/live_token.php"},"platform_tools":{"schema_version":"1.0","runtime_version":"1.0","list":"GET /platform_tools.php?list=1","by_app":"GET /platform_tools.php?app_id=myclinic","builtin_run":"POST /platform_tools.php {\"op\":\"builtin_run\",\"robot_id\":\"…\",\"tool\":{\"id\":\"clock_now\",\"args\":{}}}","forbidden":["shell","eval","arbitrary_code","raw_filesystem_write"],"notes_fa":"ابزارها از روی robots.json فعال می‌شوند؛ موتور agent_engine و ExternalToolRunner موازی ساخته نشود"},"chat_request":{"required":["robot_id","message"],"recommended":["ui_schema_version","stream","client"],"optional":["image","video","audio","pdf","file","file_mime_type","file_name","audio_mime_type","conversation_id","feedback","kb_pin","messages"],"notes":{"ui_schema_version":"کلاینت نسخهٔ UI را بفرستد؛ ترجیح 3.0","stream":"true برای SSE","robot_id":"از app_catalog؛ هاردکد نکن"}},"chat_response_dto":{"required_fields":["schema_version","message_id","display_mode","chat_message","interactive_elements","content_panel","workflow_state"],"display_modes":{"2.0":["CHAT_ONLY","CHAT_AND_PANEL","PANEL_ONLY"],"3.0":["CHAT_ONLY","CONTENT_PANEL","CONTROL_SURFACE"]},"panel_actions":{"2.0":["NONE","OPEN","UPDATE","CLOSE"],"3.0":["NONE","CREATE","UPDATE","APPEND"]},"components":{"2.0":["single_choice","confirmation","slider","text_input","action_button","table","card","list","chart"],"3.0":["single_choice","multiple_choice","confirmation","slider","text_input","action_button"]},"content_panel_fields":["action","panel_id","title","content_markdown"],"workflow_state_fields":["current_step","total_steps_estimated","step_title","is_completed"]},"sse_events":[{"type":"content","payload":{"content":"string"}},{"type":"ui","payload":{"dto":"ChatResponseDto"}},{"type":"meta","payload":{"audio_url":"string?"}},{"type":"done","payload":{"done":true}},{"type":"[DONE]","payload":"raw terminator"}],"errors":{"chat_missing_fields":{"http":400,"body_keys":["error"]},"catalog_app_id_required":{"http":400,"error":"app_id_required"},"catalog_not_found":{"http":404,"error":"app_not_found"}},"client_rules":["لیست ربات را از app_catalog با app_id بگیر؛ هاردکد نکن","ابزارهای فعال هر ربات در app_catalog → robots[].tools و /platform_tools.php","starter_chips هر ربات در app_catalog → robots[].starter_chips (empty-state موبایل/اپ)","chat_message را با sanitizeUiProse/normalizeProse پاک کن؛ هرگز sanitizeUiField روی متن چت نزن","JSON خراب یا متن ساده = فقط chat_message؛ بقیه خالی/ایمن","نسخهٔ قرارداد را از /api_contract.php بخوان و با نسخهٔ کلاینت مقایسه کن","اجرای شِل/کد دلخواه روی سرور یا کلاینت ممنوع؛ فقط ابزارهای ثبت‌شده","conversation_id پایدار per-session بفرست"],"capability_flags":["tts","live","ui_engine","workspace","interactive","web_search","agentic"]}}