482 lines
10 KiB
Markdown
482 lines
10 KiB
Markdown
# SSE Event Reference
|
|
|
|
Detailed documentation for all Server-Sent Events (SSE) returned by the each::sense `/v1/chat/completions` endpoint.
|
|
|
|
## Event Format
|
|
|
|
Events are wrapped in OpenAI `chat.completion.chunk` format with an `eachlabs` extension field:
|
|
```
|
|
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","choices":[{"delta":{"content":""}}],"eachlabs":{"type":"event_type",...}}\n\n
|
|
```
|
|
|
|
Stream ends with:
|
|
```
|
|
data: [DONE]\n\n
|
|
```
|
|
|
|
---
|
|
|
|
## Event Types (18 Total)
|
|
|
|
### thinking_delta
|
|
|
|
AI reasoning streamed in real-time. Use this to show users what the AI is thinking.
|
|
|
|
```json
|
|
{
|
|
"type": "thinking_delta",
|
|
"content": "Let me find the best model for portrait generation..."
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `content` | string | Incremental thinking text |
|
|
|
|
---
|
|
|
|
### text_response
|
|
|
|
Assistant message content (explanations, answers, plans).
|
|
|
|
```json
|
|
{
|
|
"type": "text_response",
|
|
"content": "I'll create a stunning portrait for you with cinematic lighting and a warm mood."
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `content` | string | Text response content |
|
|
|
|
---
|
|
|
|
### status
|
|
|
|
Current operation being executed. Shows tool usage and parameters.
|
|
|
|
```json
|
|
{
|
|
"type": "status",
|
|
"message": "Searching for image generation models...",
|
|
"tool_name": "search_models",
|
|
"parameters": {"use_case": "text to image portrait"}
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `message` | string | Human-readable status message |
|
|
| `tool_name` | string | Internal tool being used |
|
|
| `parameters` | object | Tool parameters (optional) |
|
|
|
|
---
|
|
|
|
### tool_call
|
|
|
|
Details of a tool being called. Useful for debugging and transparency.
|
|
|
|
```json
|
|
{
|
|
"type": "tool_call",
|
|
"name": "execute_model",
|
|
"input": {
|
|
"model_name": "flux-2-max",
|
|
"inputs": {
|
|
"prompt": "A beautiful woman portrait...",
|
|
"aspect_ratio": "1:1"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `name` | string | Tool name |
|
|
| `input` | object | Tool input parameters |
|
|
|
|
---
|
|
|
|
### message
|
|
|
|
Informational message from the agent.
|
|
|
|
```json
|
|
{
|
|
"type": "message",
|
|
"content": "Your video is being processed. This typically takes 2-3 minutes."
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `content` | string | Message content |
|
|
|
|
---
|
|
|
|
### progress
|
|
|
|
Progress update with percentage completion.
|
|
|
|
```json
|
|
{
|
|
"type": "progress",
|
|
"message": "Generating image...",
|
|
"percent": 65
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `message` | string | Progress description |
|
|
| `percent` | number | Completion percentage |
|
|
|
|
---
|
|
|
|
### generation_response
|
|
|
|
Generated media URL (image, video, audio). This is the primary output event.
|
|
|
|
```json
|
|
{
|
|
"type": "generation_response",
|
|
"url": "https://storage.eachlabs.ai/outputs/abc123.png",
|
|
"generations": ["https://storage.eachlabs.ai/outputs/abc123.png"],
|
|
"model": "flux-2-max",
|
|
"execution_time_ms": 8500
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `url` | string | Primary output URL |
|
|
| `generations` | array | All generated URLs |
|
|
| `model` | string | Model used for generation |
|
|
| `execution_time_ms` | number | Processing time in milliseconds |
|
|
|
|
---
|
|
|
|
### clarification_needed
|
|
|
|
AI needs more information to proceed. Present options to the user.
|
|
|
|
```json
|
|
{
|
|
"type": "clarification_needed",
|
|
"question": "What type of edit would you like to make to this image?",
|
|
"options": [
|
|
"Remove the background",
|
|
"Apply a style transfer",
|
|
"Upscale to higher resolution",
|
|
"Add or modify elements"
|
|
],
|
|
"context": "I can see you've uploaded an image, but I need to understand what changes you'd like.",
|
|
"requires_response": true
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `question` | string | The question to ask the user |
|
|
| `options` | array | Suggested options (can be displayed as buttons) |
|
|
| `context` | string | Additional context about the clarification |
|
|
| `requires_response` | boolean | Whether a response is required to proceed |
|
|
|
|
**Handling:** Display the question and options to the user. Send their response in a follow-up request with the same `session_id`.
|
|
|
|
---
|
|
|
|
### web_search_query
|
|
|
|
Web search being executed.
|
|
|
|
```json
|
|
{
|
|
"type": "web_search_query",
|
|
"query": "best AI video generation models 2024",
|
|
"recency": "month"
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `query` | string | Search query |
|
|
| `recency` | string | Time filter (day, week, month, year) |
|
|
|
|
---
|
|
|
|
### web_search_citations
|
|
|
|
Citations from web search results.
|
|
|
|
```json
|
|
{
|
|
"type": "web_search_citations",
|
|
"citations": [
|
|
{"title": "AI Video Comparison", "url": "https://example.com/ai-video", "snippet": "..."}
|
|
]
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `citations` | array | Array of objects with `title`, `url`, `snippet` |
|
|
|
|
---
|
|
|
|
### workflow_created
|
|
|
|
New workflow was created for complex multi-step generation.
|
|
|
|
```json
|
|
{
|
|
"type": "workflow_created",
|
|
"workflow_id": "wf_abc123",
|
|
"version_id": "v1",
|
|
"steps_count": 5
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `workflow_id` | string | Unique workflow identifier |
|
|
| `version_id` | string | Workflow version |
|
|
| `steps_count` | number | Number of steps in workflow |
|
|
|
|
---
|
|
|
|
### workflow_fetched
|
|
|
|
Existing workflow was loaded (when `workflow_id` is provided in request).
|
|
|
|
```json
|
|
{
|
|
"type": "workflow_fetched",
|
|
"workflow_name": "Product Video Generator",
|
|
"existing_steps": 3,
|
|
"existing_definition": {}
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `workflow_name` | string | Name of the workflow |
|
|
| `existing_steps` | number | Number of existing steps |
|
|
| `existing_definition` | object | Current workflow definition |
|
|
|
|
---
|
|
|
|
### workflow_built
|
|
|
|
Workflow definition was constructed.
|
|
|
|
```json
|
|
{
|
|
"type": "workflow_built",
|
|
"steps_count": 4,
|
|
"definition": {
|
|
"version": "v1",
|
|
"input_schema": {},
|
|
"steps": []
|
|
}
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `steps_count` | number | Number of steps |
|
|
| `definition` | object | Full workflow definition |
|
|
|
|
---
|
|
|
|
### workflow_updated
|
|
|
|
Workflow was pushed to the EachLabs API.
|
|
|
|
```json
|
|
{
|
|
"type": "workflow_updated",
|
|
"success": true,
|
|
"workflow_id": "wf_abc123",
|
|
"version_id": "v1",
|
|
"definition": {}
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `success` | boolean | Whether update succeeded |
|
|
| `workflow_id` | string | Workflow identifier |
|
|
| `version_id` | string | Version identifier |
|
|
| `definition` | object | Updated definition |
|
|
|
|
---
|
|
|
|
### execution_started
|
|
|
|
Workflow execution has begun.
|
|
|
|
```json
|
|
{
|
|
"type": "execution_started",
|
|
"execution_id": "exec_xyz789",
|
|
"workflow_id": "wf_abc123"
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `execution_id` | string | Unique execution identifier |
|
|
| `workflow_id` | string | Workflow being executed |
|
|
|
|
---
|
|
|
|
### execution_progress
|
|
|
|
Progress update during workflow execution.
|
|
|
|
```json
|
|
{
|
|
"type": "execution_progress",
|
|
"step_id": "step2",
|
|
"completed_steps": 2,
|
|
"total_steps": 5
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `step_id` | string | Current step identifier |
|
|
| `completed_steps` | number | Steps completed so far |
|
|
| `total_steps` | number | Total steps in workflow |
|
|
|
|
---
|
|
|
|
### execution_completed
|
|
|
|
Workflow execution finished.
|
|
|
|
```json
|
|
{
|
|
"type": "execution_completed",
|
|
"execution_id": "exec_xyz789",
|
|
"output": "https://storage.eachlabs.ai/outputs/final.mp4",
|
|
"all_outputs": {
|
|
"step1": "https://storage.eachlabs.ai/outputs/step1.png",
|
|
"step2": "https://storage.eachlabs.ai/outputs/step2.png",
|
|
"step3": "https://storage.eachlabs.ai/outputs/final.mp4"
|
|
},
|
|
"total_time_ms": 45000
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `execution_id` | string | Execution identifier |
|
|
| `output` | string | Final output URL |
|
|
| `all_outputs` | object | All step outputs keyed by step_id |
|
|
| `total_time_ms` | number | Total execution time in milliseconds |
|
|
|
|
---
|
|
|
|
### complete
|
|
|
|
Final event with summary. Always sent when stream completes.
|
|
|
|
```json
|
|
{
|
|
"type": "complete",
|
|
"task_id": "chat_1708345678901",
|
|
"status": "ok",
|
|
"generations": ["https://storage.eachlabs.ai/outputs/abc123.png"],
|
|
"model": "flux-2-max"
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `task_id` | string | Unique task identifier |
|
|
| `status` | string | Final status (ok, error, clarification_needed) |
|
|
| `generations` | array | All generated output URLs |
|
|
| `model` | string | Primary model used |
|
|
|
|
**Status values:**
|
|
- `ok` - Completed successfully
|
|
- `clarification_needed` - Waiting for user clarification
|
|
- `error` - An error occurred
|
|
|
|
---
|
|
|
|
### error
|
|
|
|
An error occurred during processing.
|
|
|
|
```json
|
|
{
|
|
"type": "error",
|
|
"message": "Failed to generate image: Invalid aspect ratio",
|
|
"error_code": "INVALID_INPUT",
|
|
"details": {}
|
|
}
|
|
```
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `message` | string | Error message |
|
|
| `error_code` | string | Error code identifier |
|
|
| `details` | object | Additional error details |
|
|
|
|
---
|
|
|
|
## Event Flow Examples
|
|
|
|
### Simple Image Generation
|
|
|
|
```
|
|
thinking_delta → "I'll create a beautiful portrait..."
|
|
status → "Searching for models..."
|
|
status → "Getting model details..."
|
|
text_response → "Here's your generated image..."
|
|
generation_response → {url: "https://...", model: "flux-2-max", execution_time_ms: 8500}
|
|
complete → {status: "ok", generations: [...]}
|
|
[DONE]
|
|
```
|
|
|
|
### Clarification Flow
|
|
|
|
```
|
|
thinking_delta → "I see an image, but need to know what edit..."
|
|
clarification_needed → {question: "What edit?", options: [...]}
|
|
complete → {status: "clarification_needed"}
|
|
[DONE]
|
|
```
|
|
|
|
### Workflow Execution
|
|
|
|
```
|
|
thinking_delta → "Creating a multi-step workflow..."
|
|
status → "Searching for models..."
|
|
workflow_created → {workflow_id: "wf_123", steps_count: 5}
|
|
execution_started → {execution_id: "exec_456"}
|
|
execution_progress → {completed_steps: 1, total_steps: 5}
|
|
execution_progress → {completed_steps: 2, total_steps: 5}
|
|
execution_progress → {completed_steps: 3, total_steps: 5}
|
|
execution_progress → {completed_steps: 4, total_steps: 5}
|
|
execution_completed → {output: "https://...", all_outputs: {...}, total_time_ms: 45000}
|
|
complete → {status: "ok"}
|
|
[DONE]
|
|
```
|
|
|
|
### Web Search
|
|
|
|
```
|
|
thinking_delta → "Let me search for current information..."
|
|
web_search_query → {query: "best AI models 2024"}
|
|
status → "Searching the web..."
|
|
web_search_citations → {citations: [{title, url, snippet}, ...]}
|
|
text_response → "Based on current information..."
|
|
complete → {status: "ok"}
|
|
[DONE]
|
|
```
|