parent
c77a1b350d
commit
e71bd68509
@ -1,631 +0,0 @@
|
|||||||
# GraphWorkflow API Endpoint Design
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
This document outlines the design for a single API endpoint that allows users to create, configure, and execute GraphWorkflow instances. The endpoint provides a comprehensive interface for leveraging the GraphWorkflow functionality with minimal setup.
|
|
||||||
|
|
||||||
## Base URL
|
|
||||||
|
|
||||||
```
|
|
||||||
POST /api/v1/graph-workflow/execute
|
|
||||||
```
|
|
||||||
|
|
||||||
## Request Schema
|
|
||||||
|
|
||||||
### Main Request Body
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"workflow_config": {
|
|
||||||
"name": "string",
|
|
||||||
"description": "string",
|
|
||||||
"max_loops": 1,
|
|
||||||
"auto_compile": true,
|
|
||||||
"verbose": false
|
|
||||||
},
|
|
||||||
"agents": [
|
|
||||||
{
|
|
||||||
"id": "string",
|
|
||||||
"agent_name": "string",
|
|
||||||
"model_name": "string",
|
|
||||||
"system_prompt": "string",
|
|
||||||
"temperature": 0.7,
|
|
||||||
"max_tokens": 4000,
|
|
||||||
"max_loops": 1,
|
|
||||||
"metadata": {}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"connections": [
|
|
||||||
{
|
|
||||||
"type": "simple",
|
|
||||||
"source": "string",
|
|
||||||
"target": "string",
|
|
||||||
"metadata": {}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"entry_points": ["string"],
|
|
||||||
"end_points": ["string"],
|
|
||||||
"task": "string",
|
|
||||||
"options": {
|
|
||||||
"include_conversation": false,
|
|
||||||
"include_runtime_state": false,
|
|
||||||
"visualization": {
|
|
||||||
"enabled": false,
|
|
||||||
"format": "png",
|
|
||||||
"show_summary": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Detailed Schema Definitions
|
|
||||||
|
|
||||||
#### WorkflowConfig
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"name": "Investment Analysis Workflow",
|
|
||||||
"description": "Multi-agent workflow for comprehensive investment analysis",
|
|
||||||
"max_loops": 1,
|
|
||||||
"auto_compile": true,
|
|
||||||
"verbose": false
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Agent Definition
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "fundamental_analyst",
|
|
||||||
"agent_name": "Fundamental Analysis Agent",
|
|
||||||
"model_name": "gpt-4o-mini",
|
|
||||||
"system_prompt": "You are a fundamental analysis expert specializing in financial analysis...",
|
|
||||||
"temperature": 0.7,
|
|
||||||
"max_tokens": 4000,
|
|
||||||
"max_loops": 1,
|
|
||||||
"autosave": true,
|
|
||||||
"dashboard": false,
|
|
||||||
"metadata": {
|
|
||||||
"specialization": "financial_analysis",
|
|
||||||
"expertise_level": "expert"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Connection Types
|
|
||||||
|
|
||||||
##### Simple Connection
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"type": "simple",
|
|
||||||
"source": "data_gatherer",
|
|
||||||
"target": "fundamental_analyst",
|
|
||||||
"metadata": {
|
|
||||||
"priority": "high"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Fan-out Connection
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"type": "fan_out",
|
|
||||||
"source": "data_gatherer",
|
|
||||||
"targets": ["fundamental_analyst", "technical_analyst", "sentiment_analyst"],
|
|
||||||
"metadata": {
|
|
||||||
"parallel_execution": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Fan-in Connection
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"type": "fan_in",
|
|
||||||
"sources": ["fundamental_analyst", "technical_analyst", "sentiment_analyst"],
|
|
||||||
"target": "synthesis_agent",
|
|
||||||
"metadata": {
|
|
||||||
"aggregation_method": "combine_all"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Parallel Chain
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"type": "parallel_chain",
|
|
||||||
"sources": ["data_gatherer_1", "data_gatherer_2"],
|
|
||||||
"targets": ["analyst_1", "analyst_2", "analyst_3"],
|
|
||||||
"metadata": {
|
|
||||||
"full_mesh": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Response Schema
|
|
||||||
|
|
||||||
### Success Response
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"status": "success",
|
|
||||||
"workflow_id": "uuid-string",
|
|
||||||
"execution_time": 45.23,
|
|
||||||
"results": {
|
|
||||||
"fundamental_analyst": "Analysis output from fundamental analyst...",
|
|
||||||
"technical_analyst": "Technical analysis results...",
|
|
||||||
"synthesis_agent": "Combined analysis and recommendations..."
|
|
||||||
},
|
|
||||||
"conversation": {
|
|
||||||
"history": [
|
|
||||||
{
|
|
||||||
"role": "fundamental_analyst",
|
|
||||||
"content": "Analysis output...",
|
|
||||||
"timestamp": "2024-01-15T10:30:00Z"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"metrics": {
|
|
||||||
"total_agents": 5,
|
|
||||||
"total_connections": 6,
|
|
||||||
"execution_layers": 3,
|
|
||||||
"parallel_efficiency": 85.5
|
|
||||||
},
|
|
||||||
"visualization": {
|
|
||||||
"url": "https://api.example.com/visualizations/workflow_123.png",
|
|
||||||
"format": "png"
|
|
||||||
},
|
|
||||||
"workflow_summary": {
|
|
||||||
"name": "Investment Analysis Workflow",
|
|
||||||
"description": "Multi-agent workflow for comprehensive investment analysis",
|
|
||||||
"entry_points": ["data_gatherer"],
|
|
||||||
"end_points": ["synthesis_agent"],
|
|
||||||
"compilation_status": "compiled"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Error Response
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"status": "error",
|
|
||||||
"error_code": "VALIDATION_ERROR",
|
|
||||||
"message": "Invalid workflow configuration",
|
|
||||||
"details": {
|
|
||||||
"field": "connections",
|
|
||||||
"issue": "Source node 'invalid_node' does not exist",
|
|
||||||
"suggestions": ["Check node IDs in connections", "Verify all referenced nodes exist"]
|
|
||||||
},
|
|
||||||
"timestamp": "2024-01-15T10:30:00Z"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Implementation Example
|
|
||||||
|
|
||||||
### Python FastAPI Implementation
|
|
||||||
|
|
||||||
```python
|
|
||||||
from fastapi import FastAPI, HTTPException
|
|
||||||
from pydantic import BaseModel, Field
|
|
||||||
from typing import List, Dict, Any, Optional
|
|
||||||
import uuid
|
|
||||||
import time
|
|
||||||
from swarms import Agent, GraphWorkflow, Node, NodeType, Edge
|
|
||||||
|
|
||||||
app = FastAPI(title="GraphWorkflow API", version="1.0.0")
|
|
||||||
|
|
||||||
# Pydantic Models
|
|
||||||
class WorkflowConfig(BaseModel):
|
|
||||||
name: str = "Graph-Workflow-01"
|
|
||||||
description: str = "A customizable workflow system"
|
|
||||||
max_loops: int = 1
|
|
||||||
auto_compile: bool = True
|
|
||||||
verbose: bool = False
|
|
||||||
|
|
||||||
class AgentDefinition(BaseModel):
|
|
||||||
id: str
|
|
||||||
agent_name: str
|
|
||||||
model_name: str = "gpt-4o-mini"
|
|
||||||
system_prompt: Optional[str] = None
|
|
||||||
temperature: float = 0.7
|
|
||||||
max_tokens: int = 4000
|
|
||||||
max_loops: int = 1
|
|
||||||
autosave: bool = True
|
|
||||||
dashboard: bool = False
|
|
||||||
metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
||||||
|
|
||||||
class SimpleConnection(BaseModel):
|
|
||||||
type: str = "simple"
|
|
||||||
source: str
|
|
||||||
target: str
|
|
||||||
metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
||||||
|
|
||||||
class FanOutConnection(BaseModel):
|
|
||||||
type: str = "fan_out"
|
|
||||||
source: str
|
|
||||||
targets: List[str]
|
|
||||||
metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
||||||
|
|
||||||
class FanInConnection(BaseModel):
|
|
||||||
type: str = "fan_in"
|
|
||||||
sources: List[str]
|
|
||||||
target: str
|
|
||||||
metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
||||||
|
|
||||||
class ParallelChainConnection(BaseModel):
|
|
||||||
type: str = "parallel_chain"
|
|
||||||
sources: List[str]
|
|
||||||
targets: List[str]
|
|
||||||
metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
||||||
|
|
||||||
class VisualizationOptions(BaseModel):
|
|
||||||
enabled: bool = False
|
|
||||||
format: str = "png"
|
|
||||||
show_summary: bool = True
|
|
||||||
|
|
||||||
class WorkflowOptions(BaseModel):
|
|
||||||
include_conversation: bool = False
|
|
||||||
include_runtime_state: bool = False
|
|
||||||
visualization: VisualizationOptions = Field(default_factory=VisualizationOptions)
|
|
||||||
|
|
||||||
class GraphWorkflowRequest(BaseModel):
|
|
||||||
workflow_config: WorkflowConfig
|
|
||||||
agents: List[AgentDefinition]
|
|
||||||
connections: List[Dict[str, Any]] # Union of all connection types
|
|
||||||
entry_points: Optional[List[str]] = None
|
|
||||||
end_points: Optional[List[str]] = None
|
|
||||||
task: str
|
|
||||||
options: WorkflowOptions = Field(default_factory=WorkflowOptions)
|
|
||||||
|
|
||||||
@app.post("/api/v1/graph-workflow/execute")
|
|
||||||
async def execute_graph_workflow(request: GraphWorkflowRequest):
|
|
||||||
"""
|
|
||||||
Execute a GraphWorkflow with the provided configuration.
|
|
||||||
|
|
||||||
This endpoint creates a workflow from the provided agents and connections,
|
|
||||||
executes it with the given task, and returns the results.
|
|
||||||
"""
|
|
||||||
start_time = time.time()
|
|
||||||
workflow_id = str(uuid.uuid4())
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Create agents from definitions
|
|
||||||
agent_instances = {}
|
|
||||||
for agent_def in request.agents:
|
|
||||||
agent = Agent(
|
|
||||||
agent_name=agent_def.agent_name,
|
|
||||||
model_name=agent_def.model_name,
|
|
||||||
system_prompt=agent_def.system_prompt,
|
|
||||||
temperature=agent_def.temperature,
|
|
||||||
max_tokens=agent_def.max_tokens,
|
|
||||||
max_loops=agent_def.max_loops,
|
|
||||||
autosave=agent_def.autosave,
|
|
||||||
dashboard=agent_def.dashboard,
|
|
||||||
)
|
|
||||||
agent_instances[agent_def.id] = agent
|
|
||||||
|
|
||||||
# Create workflow
|
|
||||||
workflow = GraphWorkflow(
|
|
||||||
id=workflow_id,
|
|
||||||
name=request.workflow_config.name,
|
|
||||||
description=request.workflow_config.description,
|
|
||||||
max_loops=request.workflow_config.max_loops,
|
|
||||||
auto_compile=request.workflow_config.auto_compile,
|
|
||||||
verbose=request.workflow_config.verbose,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add agents to workflow
|
|
||||||
for agent_def in request.agents:
|
|
||||||
workflow.add_node(agent_instances[agent_def.id])
|
|
||||||
|
|
||||||
# Add connections
|
|
||||||
for connection in request.connections:
|
|
||||||
conn_type = connection.get("type", "simple")
|
|
||||||
|
|
||||||
if conn_type == "simple":
|
|
||||||
workflow.add_edge(connection["source"], connection["target"])
|
|
||||||
elif conn_type == "fan_out":
|
|
||||||
workflow.add_edges_from_source(
|
|
||||||
connection["source"],
|
|
||||||
connection["targets"]
|
|
||||||
)
|
|
||||||
elif conn_type == "fan_in":
|
|
||||||
workflow.add_edges_to_target(
|
|
||||||
connection["sources"],
|
|
||||||
connection["target"]
|
|
||||||
)
|
|
||||||
elif conn_type == "parallel_chain":
|
|
||||||
workflow.add_parallel_chain(
|
|
||||||
connection["sources"],
|
|
||||||
connection["targets"]
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set entry and end points
|
|
||||||
if request.entry_points:
|
|
||||||
workflow.set_entry_points(request.entry_points)
|
|
||||||
else:
|
|
||||||
workflow.auto_set_entry_points()
|
|
||||||
|
|
||||||
if request.end_points:
|
|
||||||
workflow.set_end_points(request.end_points)
|
|
||||||
else:
|
|
||||||
workflow.auto_set_end_points()
|
|
||||||
|
|
||||||
# Execute workflow
|
|
||||||
results = workflow.run(request.task)
|
|
||||||
|
|
||||||
# Prepare response
|
|
||||||
execution_time = time.time() - start_time
|
|
||||||
|
|
||||||
response = {
|
|
||||||
"status": "success",
|
|
||||||
"workflow_id": workflow_id,
|
|
||||||
"execution_time": execution_time,
|
|
||||||
"results": results,
|
|
||||||
"metrics": {
|
|
||||||
"total_agents": len(workflow.nodes),
|
|
||||||
"total_connections": len(workflow.edges),
|
|
||||||
"execution_layers": len(workflow._sorted_layers) if workflow._compiled else 0,
|
|
||||||
"parallel_efficiency": calculate_parallel_efficiency(workflow)
|
|
||||||
},
|
|
||||||
"workflow_summary": {
|
|
||||||
"name": workflow.name,
|
|
||||||
"description": workflow.description,
|
|
||||||
"entry_points": workflow.entry_points,
|
|
||||||
"end_points": workflow.end_points,
|
|
||||||
"compilation_status": "compiled" if workflow._compiled else "not_compiled"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add conversation if requested
|
|
||||||
if request.options.include_conversation and workflow.conversation:
|
|
||||||
response["conversation"] = {
|
|
||||||
"history": workflow.conversation.history
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add visualization if requested
|
|
||||||
if request.options.visualization.enabled:
|
|
||||||
try:
|
|
||||||
viz_path = workflow.visualize(
|
|
||||||
format=request.options.visualization.format,
|
|
||||||
view=False,
|
|
||||||
show_summary=request.options.visualization.show_summary
|
|
||||||
)
|
|
||||||
response["visualization"] = {
|
|
||||||
"url": f"/api/v1/visualizations/{workflow_id}.{request.options.visualization.format}",
|
|
||||||
"format": request.options.visualization.format,
|
|
||||||
"local_path": viz_path
|
|
||||||
}
|
|
||||||
except Exception as e:
|
|
||||||
response["visualization"] = {
|
|
||||||
"error": str(e),
|
|
||||||
"fallback": workflow.visualize_simple()
|
|
||||||
}
|
|
||||||
|
|
||||||
return response
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
execution_time = time.time() - start_time
|
|
||||||
raise HTTPException(
|
|
||||||
status_code=400,
|
|
||||||
detail={
|
|
||||||
"status": "error",
|
|
||||||
"error_code": "EXECUTION_ERROR",
|
|
||||||
"message": str(e),
|
|
||||||
"execution_time": execution_time,
|
|
||||||
"workflow_id": workflow_id
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def calculate_parallel_efficiency(workflow):
|
|
||||||
"""Calculate parallel execution efficiency percentage."""
|
|
||||||
if not workflow._compiled or not workflow._sorted_layers:
|
|
||||||
return 0.0
|
|
||||||
|
|
||||||
total_nodes = len(workflow.nodes)
|
|
||||||
max_parallel = max(len(layer) for layer in workflow._sorted_layers)
|
|
||||||
|
|
||||||
if total_nodes == 0:
|
|
||||||
return 0.0
|
|
||||||
|
|
||||||
return (max_parallel / total_nodes) * 100
|
|
||||||
|
|
||||||
# Additional endpoints for workflow management
|
|
||||||
@app.get("/api/v1/graph-workflow/{workflow_id}/status")
|
|
||||||
async def get_workflow_status(workflow_id: str):
|
|
||||||
"""Get the status of a workflow execution."""
|
|
||||||
# Implementation for retrieving workflow status
|
|
||||||
pass
|
|
||||||
|
|
||||||
@app.delete("/api/v1/graph-workflow/{workflow_id}")
|
|
||||||
async def delete_workflow(workflow_id: str):
|
|
||||||
"""Delete a workflow and its associated resources."""
|
|
||||||
# Implementation for cleaning up workflow resources
|
|
||||||
pass
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage Examples
|
|
||||||
|
|
||||||
### Basic Investment Analysis Workflow
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"workflow_config": {
|
|
||||||
"name": "Investment Analysis Workflow",
|
|
||||||
"description": "Multi-agent workflow for comprehensive investment analysis",
|
|
||||||
"max_loops": 1,
|
|
||||||
"verbose": false
|
|
||||||
},
|
|
||||||
"agents": [
|
|
||||||
{
|
|
||||||
"id": "data_gatherer",
|
|
||||||
"agent_name": "Data Gathering Agent",
|
|
||||||
"model_name": "gpt-4o-mini",
|
|
||||||
"system_prompt": "You are a financial data gathering specialist. Collect relevant financial data, news, and market information.",
|
|
||||||
"temperature": 0.3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "fundamental_analyst",
|
|
||||||
"agent_name": "Fundamental Analysis Agent",
|
|
||||||
"model_name": "gpt-4o-mini",
|
|
||||||
"system_prompt": "You are a fundamental analysis expert. Analyze company financials, business model, and competitive position.",
|
|
||||||
"temperature": 0.5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "technical_analyst",
|
|
||||||
"agent_name": "Technical Analysis Agent",
|
|
||||||
"model_name": "gpt-4o-mini",
|
|
||||||
"system_prompt": "You are a technical analysis specialist. Analyze price charts, trends, and trading patterns.",
|
|
||||||
"temperature": 0.5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "synthesis_agent",
|
|
||||||
"agent_name": "Synthesis Agent",
|
|
||||||
"model_name": "gpt-4o-mini",
|
|
||||||
"system_prompt": "You are a synthesis expert. Combine all analysis outputs into comprehensive investment recommendations.",
|
|
||||||
"temperature": 0.7
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"connections": [
|
|
||||||
{
|
|
||||||
"type": "fan_out",
|
|
||||||
"source": "data_gatherer",
|
|
||||||
"targets": ["fundamental_analyst", "technical_analyst"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "fan_in",
|
|
||||||
"sources": ["fundamental_analyst", "technical_analyst"],
|
|
||||||
"target": "synthesis_agent"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"task": "Analyze the investment potential of Tesla (TSLA) stock based on current market conditions, financial performance, and technical indicators. Provide a comprehensive recommendation with risk assessment.",
|
|
||||||
"options": {
|
|
||||||
"include_conversation": true,
|
|
||||||
"visualization": {
|
|
||||||
"enabled": true,
|
|
||||||
"format": "png",
|
|
||||||
"show_summary": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Content Creation Workflow
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"workflow_config": {
|
|
||||||
"name": "Content Creation Workflow",
|
|
||||||
"description": "Multi-stage content creation with research, writing, and review",
|
|
||||||
"max_loops": 1
|
|
||||||
},
|
|
||||||
"agents": [
|
|
||||||
{
|
|
||||||
"id": "researcher",
|
|
||||||
"agent_name": "Research Agent",
|
|
||||||
"model_name": "gpt-4o-mini",
|
|
||||||
"system_prompt": "You are a research specialist. Gather comprehensive information on the given topic.",
|
|
||||||
"temperature": 0.3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "writer",
|
|
||||||
"agent_name": "Content Writer",
|
|
||||||
"model_name": "gpt-4o-mini",
|
|
||||||
"system_prompt": "You are a professional content writer. Create engaging, well-structured content based on research.",
|
|
||||||
"temperature": 0.7
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "editor",
|
|
||||||
"agent_name": "Editor",
|
|
||||||
"model_name": "gpt-4o-mini",
|
|
||||||
"system_prompt": "You are an expert editor. Review and improve content for clarity, accuracy, and engagement.",
|
|
||||||
"temperature": 0.5
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"connections": [
|
|
||||||
{
|
|
||||||
"type": "simple",
|
|
||||||
"source": "researcher",
|
|
||||||
"target": "writer"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "simple",
|
|
||||||
"source": "writer",
|
|
||||||
"target": "editor"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"task": "Create a comprehensive blog post about the future of artificial intelligence in healthcare, including current applications, challenges, and future prospects.",
|
|
||||||
"options": {
|
|
||||||
"include_conversation": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Error Handling
|
|
||||||
|
|
||||||
### Common Error Codes
|
|
||||||
|
|
||||||
- `VALIDATION_ERROR`: Invalid workflow configuration
|
|
||||||
- `AGENT_CREATION_ERROR`: Failed to create agent instances
|
|
||||||
- `CONNECTION_ERROR`: Invalid connections between agents
|
|
||||||
- `EXECUTION_ERROR`: Workflow execution failed
|
|
||||||
- `VISUALIZATION_ERROR`: Failed to generate visualization
|
|
||||||
- `TIMEOUT_ERROR`: Workflow execution timed out
|
|
||||||
|
|
||||||
### Error Response Format
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"status": "error",
|
|
||||||
"error_code": "VALIDATION_ERROR",
|
|
||||||
"message": "Invalid workflow configuration",
|
|
||||||
"details": {
|
|
||||||
"field": "connections",
|
|
||||||
"issue": "Source node 'invalid_node' does not exist",
|
|
||||||
"suggestions": [
|
|
||||||
"Check node IDs in connections",
|
|
||||||
"Verify all referenced nodes exist"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"timestamp": "2024-01-15T10:30:00Z",
|
|
||||||
"workflow_id": "uuid-string"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Rate Limiting and Quotas
|
|
||||||
|
|
||||||
- **Rate Limit**: 10 requests per minute per API key
|
|
||||||
- **Timeout**: 300 seconds (5 minutes) for workflow execution
|
|
||||||
- **Max Agents**: 50 agents per workflow
|
|
||||||
- **Max Connections**: 200 connections per workflow
|
|
||||||
- **Payload Size**: 10MB maximum request size
|
|
||||||
|
|
||||||
## Authentication
|
|
||||||
|
|
||||||
The API requires authentication using API keys:
|
|
||||||
|
|
||||||
```
|
|
||||||
Authorization: Bearer your-api-key-here
|
|
||||||
```
|
|
||||||
|
|
||||||
## Monitoring and Logging
|
|
||||||
|
|
||||||
- All workflow executions are logged with execution time and results
|
|
||||||
- Failed executions are logged with detailed error information
|
|
||||||
- Performance metrics are collected for optimization
|
|
||||||
- Workflow visualizations are cached for 24 hours
|
|
||||||
|
|
||||||
## Best Practices
|
|
||||||
|
|
||||||
1. **Agent Design**: Use clear, specific system prompts for each agent
|
|
||||||
2. **Connection Patterns**: Leverage fan-out and fan-in patterns for parallel processing
|
|
||||||
3. **Task Definition**: Provide clear, specific tasks for better results
|
|
||||||
4. **Error Handling**: Always check the response status and handle errors appropriately
|
|
||||||
5. **Resource Management**: Clean up workflows when no longer needed
|
|
||||||
6. **Testing**: Test workflows with smaller datasets before scaling up
|
|
||||||
|
|
||||||
## Future Enhancements
|
|
||||||
|
|
||||||
- **Streaming Responses**: Real-time workflow execution updates
|
|
||||||
- **Workflow Templates**: Pre-built workflow configurations
|
|
||||||
- **Scheduling**: Automated workflow execution on schedules
|
|
||||||
- **Versioning**: Workflow version control and rollback
|
|
||||||
- **Collaboration**: Multi-user workflow editing and sharing
|
|
||||||
- **Advanced Analytics**: Detailed performance and efficiency metrics
|
|
Loading…
Reference in new issue