mvp-factory-setups/openhands-api-reference.md

322 lines
7.3 KiB
Markdown

# OpenHands API Reference for n8n Integration
**Base URL:** `http://localhost:3000`
**API Version:** 0.62.0
**Documentation:** http://localhost:3000/docs
**OpenAPI Spec:** http://localhost:3000/openapi.json
---
## 🔑 Key Endpoints for n8n Automation
### 1. Create New Conversation
**Endpoint:** `POST /api/conversations`
**Purpose:** Initialize a new OpenHands session/conversation
**Request Body:**
```json
{
"initial_user_msg": "Your task here",
"repository": null,
"selected_branch": null,
"git_provider": null
}
```
**Response:**
```json
{
"status": "ok",
"conversation_id": "f0f3e760dca14af1b94d04d825aca43a",
"message": null,
"conversation_status": "STARTING"
}
```
**Notes:**
- The `conversation_id` is required for all subsequent calls
- `conversation_status` will be "STARTING" initially
- Runtime container will be created automatically
- First run takes 2-3 minutes to initialize
---
### 2. Get Conversation Status
**Endpoint:** `GET /api/conversations/{conversation_id}`
**Purpose:** Check the current status of a conversation
**Response:**
```json
{
"conversation_id": "f0f3e760dca14af1b94d04d825aca43a",
"title": "Conversation f0f3e",
"last_updated_at": "2025-11-29T19:23:46.858186Z",
"status": "STARTING",
"runtime_status": "STATUS$STARTING_RUNTIME",
"selected_repository": null,
"trigger": "gui",
"num_connections": 0,
"created_at": "2025-11-29T19:23:46.841828Z"
}
```
**Status Values:**
- `STARTING` - Conversation is initializing
- `RUNNING` - Agent is actively working
- `STOPPED` - Conversation has ended
- `AWAITING_USER_INPUT` - Waiting for user response
---
### 3. Get Conversation Events
**Endpoint:** `GET /api/conversations/{conversation_id}/events`
**Purpose:** Retrieve events/actions from the conversation (for monitoring progress)
**Query Parameters:**
- `limit` (optional): Number of events to return
- `offset` (optional): Event offset for pagination
**Response:**
```json
{
"events": [
{
"id": 0,
"timestamp": "2025-11-29T19:23:46.850918",
"source": "environment",
"message": "",
"observation": "agent_state_changed",
"content": "",
"extras": {
"agent_state": "loading",
"reason": ""
}
}
],
"has_more": false
}
```
**Event Types:**
- `agent_state_changed` - Agent status change
- `action` - Agent performing an action
- `observation` - System observation/response
- `message` - User or assistant message
---
### 4. Send Message to Conversation
**Endpoint:** `POST /api/conversations/{conversation_id}/message`
**Purpose:** Add a new message/task to an existing conversation
**Request Body:**
```json
{
"content": "Your message or task here",
"image_urls": []
}
```
**Use Case:** Send additional instructions or feedback to a running conversation
---
### 5. Start Conversation
**Endpoint:** `POST /api/conversations/{conversation_id}/start`
**Purpose:** Explicitly start the agent loop
**Note:** Usually auto-started if `initial_user_msg` is provided during creation
---
### 6. Stop Conversation
**Endpoint:** `POST /api/conversations/{conversation_id}/stop`
**Purpose:** Stop a running conversation/agent
**Use Case:** Cancel a long-running task or end the session
---
### 7. List All Conversations
**Endpoint:** `GET /api/conversations`
**Purpose:** Get a list of all conversations
**Query Parameters:**
- `page_size` (optional): Number of results per page
- `page_id` (optional): Pagination token
**Response:**
```json
{
"results": [
{
"conversation_id": "2394472401834b10b8550afe1be9f617",
"title": "Conversation 23944",
"last_updated_at": "2025-11-28T16:35:31.804925Z",
"status": "STOPPED",
"created_at": "2025-11-28T16:35:31.789194Z"
}
],
"next_page_id": null
}
```
---
### 8. Get Available Models
**Endpoint:** `GET /api/options/models`
**Purpose:** List all supported LLM models
**Response:** Array of 1000+ model names (MiniMax, OpenAI, Claude, Gemini, etc.)
---
### 9. Get Available Agents
**Endpoint:** `GET /api/options/agents`
**Purpose:** List available agent types
**Response:**
```json
[
"BrowsingAgent",
"CodeActAgent",
"DummyAgent",
"LocAgent",
"ReadOnlyAgent",
"VisualBrowsingAgent"
]
```
---
## 🔄 Typical Workflow for n8n
### Simple One-Shot Task:
```
1. POST /api/conversations
→ Get conversation_id
2. Poll GET /api/conversations/{id}
→ Wait for status != "STARTING"
3. Poll GET /api/conversations/{id}/events
→ Monitor progress
→ Check for completion or errors
4. When done, optionally POST /api/conversations/{id}/stop
```
### With Repository:
```
1. POST /api/conversations with repository URL
→ Get conversation_id
2. Wait for runtime initialization
3. POST /api/conversations/{id}/message
→ "Run npm install && npm test && npm build"
4. Poll events for results
5. On failure, POST /api/conversations/{id}/message
→ Send error feedback for retry
```
---
## ⚙️ Configuration
### Current Server Config:
- **Model:** openai/MiniMax-M2
- **API Base:** https://api.minimax.chat/v1/text/chatcompletion_v2
- **Runtime Image:** docker.openhands.dev/openhands/runtime:latest-nikolaik
- **Default Workspace:** /workspace (inside container)
### Environment Variables (configured in systemd):
```bash
LLM_MODEL=openai/MiniMax-M2
LLM_API_KEY=${MINIMAX_API_KEY}
LLM_BASE_URL=https://api.minimax.chat/v1/text/chatcompletion_v2
SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.openhands.dev/openhands/runtime:latest-nikolaik
LOG_ALL_EVENTS=true
```
---
## 🧪 Testing with curl
### Test 1: Create Conversation
```bash
curl -X POST http://localhost:3000/api/conversations \
-H "Content-Type: application/json" \
-d '{"initial_user_msg": "Create a file named test.txt with content: Hello World"}'
```
### Test 2: Check Status
```bash
CONV_ID="your-conversation-id-here"
curl http://localhost:3000/api/conversations/${CONV_ID}
```
### Test 3: Get Events
```bash
curl "http://localhost:3000/api/conversations/${CONV_ID}/events?limit=10"
```
### Test 4: Send Additional Message
```bash
curl -X POST http://localhost:3000/api/conversations/${CONV_ID}/message \
-H "Content-Type: application/json" \
-d '{"content": "Now create another file called test2.txt"}'
```
---
## 📊 Response Status Codes
- `200 OK` - Successful request
- `422 Unprocessable Entity` - Invalid request body
- `404 Not Found` - Conversation not found
- `500 Internal Server Error` - Server error
---
## 🐛 Common Issues
### Issue: Conversation stuck in "STARTING"
- **Cause:** Runtime container still initializing
- **Solution:** Wait 2-3 minutes on first run, ~30s on subsequent runs
- **Check:** `docker logs openhands-runtime-{conversation_id}`
### Issue: "Field required" error
- **Cause:** Missing required fields in request body
- **Solution:** Check OpenAPI spec at /docs for exact schema
### Issue: Events not updating
- **Cause:** Agent may be waiting for runtime or processing
- **Solution:** Poll events endpoint every 5-10 seconds
---
## 🔗 Additional Resources
- **Swagger UI:** http://localhost:3000/docs
- **OpenAPI Spec:** http://localhost:3000/openapi.json
- **OpenHands Docs:** https://docs.openhands.dev
- **Server Status:** `sudo systemctl status openhands.service`
- **Server Logs:** `sudo journalctl -u openhands.service -f`
---
**Last Updated:** 2025-11-29
**Next Steps:** Implement n8n workflow using these endpoints