skills/infographic-generation/references/SSE-EVENTS.md

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]
```