人工æºè½è¿å±æ´æ°æ¹æ³ | AIçæåç¿»è¯
é®é¢ï¼OpenClawï¼ä¸ä¸ªAIæºè½ä½ï¼å¨å¤ç大åé®é¢æ¶å¦ä½å±ç¤ºå®æ¶è¿åº¦æ´æ°ââå®åªæ¯åå¤åéæ´æ°åçç¶ææ¶æ¯åï¼
çæ¡ï¼
AIæºè½ä½å¦ä½æ¨éè¿åº¦æ´æ°
æ¯çï¼æ¬è´¨ä¸å¦æ¤ââä½å ·ä½å®ç°æ¹å¼æå ç§ä¸åæºå¶ã以䏿¯å ¶å·¥ä½åçï¼
1. æå¡å¨æ¨éäºä»¶ï¼SSEï¼ââæå¸¸ç¨
å端éè¿æä¹ çHTTPè¿æ¥å°å¢éæ´æ°æµå¼ä¼ è¾å°å端ã
客æ·ç«¯ â POST /run-agent
æå¡å¨ â ä¿æè¿æ¥æå¼ï¼æ¨éææ¬åï¼
"data: æ£æ¥æ°æ®åºç»æä¸...\n\n"
"data: åç°25个表...\n\n"
"data: å¯å¨ç¼ç¨æºè½ä½...\n\n"
å端çå¬å¹¶å°æ¯ä¸ªææ¬å宿¶è¿½å å°ç¨æ·çé¢ãClaude.aièªèº«å³éç¨æ¤æ¹å¼ââææ¬éåâæµå¼âåç°ã
2. WebSocketââååéä¿¡
类似SSE使¯æååéä¿¡ãæºè½ä½å¨æ§è¡è¿ç¨ä¸åéç¶æå¸§ï¼
{ "type": "status", "message": "æ«æ76个CI3模å¼ä¸..." }
{ "type": "status", "message": "è¿è¡sedæ¿æ¢ä¸..." }
{ "type": "result", "message": "宿ã已修å¤76å¤å¹é
项ã" }
3. 轮询ââæ´ç®åä½ä¸å¤ä¼é
å端æ¯éä¸ä¸¤ç§éå¤è¯¢é®â宿äºåï¼âï¼
客æ·ç«¯ â GET /task/status?id=123 â { "status": "running", "log": "..." }
客æ·ç«¯ â GET /task/status?id=123 â { "status": "running", "log": "..." }
客æ·ç«¯ â GET /task/status?id=123 â { "status": "done", "result": "..." }
4. âæ¥å¿è¡âå¦ä½çæ
æºè½ä½æ¬èº«åªéå¨ä»£ç çå ³é®æ£æ¥ç¹è°ç¨æ¥å¿/åé彿°ï¼
emit("æ£æ¥æ°æ®åºç»æä¸...")
result = check_db()
emit(f"åç°{len(tables)}个表")
run_migration()
emit("å¯å¨ç¼ç¨åæºè½ä½...")
sub_agent.run()
æ¯ä¸ªemit()è°ç¨é½ä¼éè¿SSE/WebSocketå°æ¶æ¯æ¨éå°ç¨æ·çé¢ãçé¢å°å
¶è¿½å å°å¯è§æ¥å¿ä¸ã
5. æ¨åäº«çææ¡£ä¸çå°çå 容
æ¨ç²è´´çè½¬å½ææ¬æ£æ¯è¿ç§æ¨¡å¼ââæºè½ä½å¨æ§è¡è¿ç¨ä¸å®æ¶ææ¥èªèº«æ¥éª¤ï¼
- âè®©ææ£æ¥æ°æ®åºç»æâ¦â â æ§è¡æ¥è¯¢ â åéç»æ
- âåç°å¦ä¸ä¸ªCI3âCI4é®é¢â¦â â åéåç°
- âè¿æ¯æ¹éä¿®å¤ä»»å¡ã让æå¯å¨ç¼ç¨æºè½ä½â¦â â åéå¯å¨äºä»¶
è¿äºé½æ¯æ£æ¥ç¹æ¥å¿æ¶æ¯ï¼éè¿æµå¼ä¼ è¾éæ¥è¾åºï¼è®©ç¨æ·ç¥ææºè½ä½ä»å¨è¿è¡ä¸åå¾è¿å±ï¼èééé»æèµ·ã
æ»ç»
æºè½ä½æ¬èº«åªé卿¯ä¸ªæ¥éª¤è°ç¨emit(message)ââä¼ è¾å±ï¼SSE/WebSocketï¼è´è´£å°å
¶å®æ¶åç°å¨æ¨çå±å¹ä¸ã
