advanced-usage
```python from backend.data.block import Block, BlockSchema, BlockType from pydantic import BaseModel
$ npx -y skills add OpenLAIR/dr-claw --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
Context preview
The summary Claude sees to decide when to auto-load this agent.
```python from backend.data.block import Block, BlockSchema, BlockType from pydantic import BaseModel
Agent definition
advanced-usage.mdAutoGPT Advanced Usage Guide
Custom Block Development
Block structure
from backend.data.block import Block, BlockSchema, BlockType
from pydantic import BaseModel
class MyBlockInput(BaseModel):
"""Input schema for the block."""
query: str
max_results: int = 10
class MyBlockOutput(BaseModel):
"""Output schema for the block."""
results: list[str]
count: int
class MyCustomBlock(Block):
"""Custom block for specific functionality."""
id = "my-custom-block-uuid"
name = "My Custom Block"
description = "Does something specific"
block_type = BlockType.STANDARD
input_schema = MyBlockInput
output_schema = MyBlockOutput
async def execute(self, input_data: MyBlockInput) -> dict:
"""Execute the block logic."""
# Implement your logic
results = await self.process(input_data.query, input_data.max_results)
yield "results", results
yield "count", len(results)
async def process(self, query: str, max_results: int) -> list[str]:
"""Internal processing logic."""
# Implementation
return ["result1", "result2"]Block registration
# backend/blocks/__init__.py
from backend.blocks.my_block import MyCustomBlock
# Add to block registry
BLOCKS = [
MyCustomBlock,
# ... other blocks
]Block with credentials
from backend.data.block import Block
from backend.integrations.providers import ProviderName
class APIIntegrationBlock(Block):
"""Block that uses external API credentials."""
credentials_required = [ProviderName.OPENAI]
async def execute(self, input_data):
# Get credentials from the system
credentials = await self.get_credentials(ProviderName.OPENAI)
# Use credentials
client = OpenAI(api_key=credentials.api_key)
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": input_data.prompt}]
)
yield "response", response.choices[0].message.contentBlock with cost tracking
from backend.data.block import Block
from backend.data.block_cost_config import BlockCostConfig
class LLMBlock(Block):
"""Block with cost tracking."""
cost_config = BlockCostConfig(
cost_type="token",
cost_per_unit=0.00002, # Per token
provider="openai"
)
async def execute(self, input_data):
response = await self.call_llm(input_data.prompt)
# Report token usage for cost tracking
self.report_usage(
input_tokens=response.usage.prompt_tokens,
output_tokens=response.usage.completion_tokens
)
yield "output", response.contentAdvanced Execution Patterns
Parallel node execution
from backend.executor.manager import ExecutionManager
async def execute_parallel_nodes(graph_exec_id: str, node_ids: list[str]):
"""Execute multiple nodes in parallel."""
manager = ExecutionManager()
tasks = [
manager.execute_node(graph_exec_id, node_id)
for node_id in node_ids
]
results = await asyncio.gather(*tasks)
return resultsConditional branching
from backend.blocks.branching import BranchingBlock
class SmartBranchBlock(BranchingBlock):
"""Advanced conditional branching."""
async def execute(self, input_data):
condition = await self.evaluate_condition(input_data)
if condition == "path_a":
yield "output_a", input_data.value
elif condition == "path_b":
yield "output_b", input_data.value
else:
yield "output_default", input_data.valueLoop execution
class LoopBlock(Block):
"""Execute a subgraph in a loop."""
async def execute(self, input_data):
items = input_data.items
results = []
for i, item in enumerate(items):
# Execute nested graph for each item
result = await self.execute_subgraph(
graph_id=input_data.subgraph_id,
inputs={"item": item, "index": i}
)
results.append(result)
yield "progress", f"Processed {i+1}/{len(items)}"
yield "results", resultsGraph composition
Nested agents
from backend.blocks.agent import AgentExecutorBlock
class ParentAgentBlock(Block):
"""Execute child agents within a parent agent."""
async def execute(self, input_data):
# Execute child agent
child_result = await self.execute_agent(
agent_id=input_data.child_agent_id,
inputs={"query": input_data.query}
)
# Process child result
processed = await self.process_result(child_result)
yield "output", processedDynamic graph construction
from backend.data.graph import GraphModel, NodeModel, LinkModel
async def create_dynamic_graph(user_id: str, template: str):
"""Create a graph dynamically based on template."""
graph = GraphModel(
name=f"Dynamic Graph - {template}",
description="Auto-generated graph",
user_id=user_id
)
# Add nodes based on template
nodes = []
if template == "research":
nodes = [
NodeModel(block_id="search-block", position={"x": 0, "y": 0}),
NodeModel(block_id="summarize-block", position={"x": 200, "y": 0}),
NodeModel(block_id="output-block", position={"x": 400, "y": 0})
]
elif template == "code-review":
nodes = [
NodeModel(block_id="github-block", position={"x": 0, "y": 0}),
NodeModel(block_id="review-block", position={"x": 200, "y": 0}),
NodeModel(block_id="comment-block", position={"x": 400, "y": 0})
]
graph.nodes = nodes
# Create links between nodes
for i in range(len(nodes) - 1):
graph.links.append(LinkModel(Read more
AutoGPT Advanced Usage Guide
Custom Block Development
Block structure
from backend.data.block import Block, BlockSchema, BlockType
from pydantic import BaseModel
class MyBlockInput(BaseModel):
"""Input schema for the block."""
query: str
max_results: int = 10
class MyBlockOutput(BaseModel):
"""Output schema for the block."""
results: list[str]
count: int
class MyCustomBlock(Block):
"""Custom block for specific functionality."""
id = "my-custom-block-uuid"
name = "My Custom Block"
description = "Does something specific"
block_type = BlockType.STANDARD
input_schema = MyBlockInput
output_schema = MyBlockOutput
async def execute(self, input_data: MyBlockInput) -> dict:
"""Execute the block logic."""
# Implement your logic
results = await self.process(input_data.query, input_data.max_results)
yield "results", results
yield "count", len(results)
async def process(self, query: str, max_results: int) -> list[str]:
"""Internal processing logic."""
# Implementation
return ["result1", "result2"]Block registration
# backend/blocks/__init__.py
from backend.blocks.my_block import MyCustomBlock
# Add to block registry
BLOCKS = [
MyCustomBlock,
# ... other blocks
]Block with credentials
from backend.data.block import Block
from backend.integrations.providers import ProviderName
class APIIntegrationBlock(Block):
"""Block that uses external API credentials."""
credentials_required = [ProviderName.OPENAI]
async def execute(self, input_data):
# Get credentials from the system
credentials = await self.get_credentials(ProviderName.OPENAI)
# Use credentials
client = OpenAI(api_key=credentials.api_key)
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": input_data.prompt}]
)
yield "response", response.choices[0].message.contentBlock with cost tracking
from backend.data.block import Block
from backend.data.block_cost_config import BlockCostConfig
class LLMBlock(Block):
"""Block with cost tracking."""
cost_config = BlockCostConfig(
cost_type="token",
cost_per_unit=0.00002, # Per token
provider="openai"
)
async def execute(self, input_data):
response = await self.call_llm(input_data.prompt)
# Report token usage for cost tracking
self.report_usage(
input_tokens=response.usage.prompt_tokens,
output_tokens=response.usage.completion_tokens
)
yield "output", response.contentAdvanced Execution Patterns
Parallel node execution
from backend.executor.manager import ExecutionManager
async def execute_parallel_nodes(graph_exec_id: str, node_ids: list[str]):
"""Execute multiple nodes in parallel."""
manager = ExecutionManager()
tasks = [
manager.execute_node(graph_exec_id, node_id)
for node_id in node_ids
]
results = await asyncio.gather(*tasks)
return resultsConditional branching
from backend.blocks.branching import BranchingBlock
class SmartBranchBlock(BranchingBlock):
"""Advanced conditional branching."""
async def execute(self, input_data):
condition = await self.evaluate_condition(input_data)
if condition == "path_a":
yield "output_a", input_data.value
elif condition == "path_b":
yield "output_b", input_data.value
else:
yield "output_default", input_data.valueLoop execution
class LoopBlock(Block):
"""Execute a subgraph in a loop."""
async def execute(self, input_data):
items = input_data.items
results = []
for i, item in enumerate(items):
# Execute nested graph for each item
result = await self.execute_subgraph(
graph_id=input_data.subgraph_id,
inputs={"item": item, "index": i}
)
results.append(result)
yield "progress", f"Processed {i+1}/{len(items)}"
yield "results", resultsGraph composition
Nested agents
from backend.blocks.agent import AgentExecutorBlock
class ParentAgentBlock(Block):
"""Execute child agents within a parent agent."""
async def execute(self, input_data):
# Execute child agent
child_result = await self.execute_agent(
agent_id=input_data.child_agent_id,
inputs={"query": input_data.query}
)
# Process child result
processed = await self.process_result(child_result)
yield "output", processedDynamic graph construction
from backend.data.graph import GraphModel, NodeModel, LinkModel
async def create_dynamic_graph(user_id: str, template: str):
"""Create a graph dynamically based on template."""
graph = GraphModel(
name=f"Dynamic Graph - {template}",
description="Auto-generated graph",
user_id=user_id
)
# Add nodes based on template
nodes = []
if template == "research":
nodes = [
NodeModel(block_id="search-block", position={"x": 0, "y": 0}),
NodeModel(block_id="summarize-block", position={"x": 200, "y": 0}),
NodeModel(block_id="output-block", position={"x": 400, "y": 0})
]
elif template == "code-review":
nodes = [
NodeModel(block_id="github-block", position={"x": 0, "y": 0}),
NodeModel(block_id="review-block", position={"x": 200, "y": 0}),
NodeModel(block_id="comment-block", position={"x": 400, "y": 0})
]
graph.nodes = nodes
# Create links between nodes
for i in range(len(nodes) - 1):
graph.links.append(LinkModel(A Super AI Lab with massive AI Doctors as Assistants. Best IDE for Research via AI Power.
Repo: OpenLAIR/dr-claw
Other agents on dr-claw.
- troubleshooting
**Error**: `Cannot connect to the Docker daemon`
Open agent - flows
Flows provide event-driven orchestration with precise control over execution paths, state management, and conditional branching. Use Flows when you need more control than Crews provide.
Open agent - tools
Install the tools package:
Open agent - integration
Integration with vector stores, LangSmith observability, and deployment.
Open agent - rag
Complete guide to Retrieval-Augmented Generation with LangChain.
Open agent - data_connectors
300+ data connectors via LlamaHub.
Open agent

