--- title: WebSocket Connection --- This guide explains how to connect to the OpenHands WebSocket API to receive real-time events and send actions to the agent. ## Overview OpenHands uses [Socket.IO](https://socket.io/) for WebSocket communication between the client and server. The WebSocket connection allows you to: 1. Receive real-time events from the agent 2. Send user actions to the agent 3. Maintain a persistent connection for ongoing conversations ## Connecting to the WebSocket ### Connection Parameters When connecting to the WebSocket, you need to provide the following query parameters: - `conversation_id`: The ID of the conversation you want to join - `latest_event_id`: The ID of the latest event you've received (use `-1` for a new connection) - `providers_set`: (Optional) A comma-separated list of provider types ### Connection Example Here's a basic example of connecting to the WebSocket using JavaScript: ```javascript import { io } from "socket.io-client"; const socket = io("http://localhost:3000", { transports: ["websocket"], query: { conversation_id: "your-conversation-id", latest_event_id: -1, providers_set: "github,gitlab" // Optional } }); socket.on("connect", () => { console.log("Connected to OpenHands WebSocket"); }); socket.on("oh_event", (event) => { console.log("Received event:", event); }); socket.on("connect_error", (error) => { console.error("Connection error:", error); }); socket.on("disconnect", (reason) => { console.log("Disconnected:", reason); }); ``` ## Sending Actions to the Agent To send an action to the agent, use the `oh_user_action` event: ```javascript // Send a user message to the agent socket.emit("oh_user_action", { type: "message", source: "user", message: "Hello, can you help me with my project?" }); ``` ## Receiving Events from the Agent The server emits events using the `oh_event` event type. Here are some common event types you might receive: - User messages (`source: "user", type: "message"`) - Agent messages (`source: "agent", type: "message"`) - File edits (`action: "edit"`) - File writes (`action: "write"`) - Command executions (`action: "run"`) Example event handler: ```javascript socket.on("oh_event", (event) => { if (event.source === "agent" && event.type === "message") { console.log("Agent says:", event.message); } else if (event.action === "run") { console.log("Command executed:", event.args.command); console.log("Result:", event.result); } }); ``` ## Using Websocat for Testing [Websocat](https://github.com/vi/websocat) is a command-line tool for interacting with WebSockets. It's useful for testing your WebSocket connection without writing a full client application. ### Installation ```bash # On macOS brew install websocat # On Linux curl -L https://github.com/vi/websocat/releases/download/v1.11.0/websocat.x86_64-unknown-linux-musl > websocat chmod +x websocat sudo mv websocat /usr/local/bin/ ``` ### Connecting to the WebSocket ```bash # Connect to the WebSocket and print all received messages echo "40{}" | \ websocat "ws://localhost:3000/socket.io/?EIO=4&transport=websocket&conversation_id=your-conversation-id&latest_event_id=-1" ``` ### Sending a Message ```bash # Send a message to the agent echo '42["oh_user_action",{"type":"message","source":"user","message":"Hello, agent!"}]' | \ websocat "ws://localhost:3000/socket.io/?EIO=4&transport=websocket&conversation_id=your-conversation-id&latest_event_id=-1" ``` ### Complete Example with Websocat Here's a complete example of connecting to the WebSocket, sending a message, and receiving events: ```bash # Start a persistent connection websocat -v "ws://localhost:3000/socket.io/?EIO=4&transport=websocket&conversation_id=your-conversation-id&latest_event_id=-1" # In another terminal, send a message echo '42["oh_user_action",{"type":"message","source":"user","message":"Can you help me with my project?"}]' | \ websocat "ws://localhost:3000/socket.io/?EIO=4&transport=websocket&conversation_id=your-conversation-id&latest_event_id=-1" ``` ## Event Structure Events sent and received through the WebSocket follow a specific structure: ```typescript interface OpenHandsEvent { id: string; // Unique event ID source: string; // "user" or "agent" timestamp: string; // ISO timestamp message?: string; // For message events type?: string; // Event type (e.g., "message") action?: string; // Action type (e.g., "run", "edit", "write") args?: any; // Action arguments result?: any; // Action result } ``` ## Best Practices 1. **Handle Reconnection**: Implement reconnection logic in your client to handle network interruptions. 2. **Track Event IDs**: Store the latest event ID you've received and use it when reconnecting to avoid duplicate events. 3. **Error Handling**: Implement proper error handling for connection errors and failed actions. 4. **Rate Limiting**: Avoid sending too many actions in a short period to prevent overloading the server. ## Troubleshooting ### Connection Issues - Verify that the OpenHands server is running and accessible - Check that you're providing the correct conversation ID - Ensure your WebSocket URL is correctly formatted ### Authentication Issues - Make sure you have the necessary authentication cookies if required - Verify that you have permission to access the specified conversation ### Event Handling Issues - Check that you're correctly parsing the event data - Verify that your event handlers are properly registered