mirror of
https://github.com/qu-skills/superpowers.git
synced 2026-09-14 16:20:40 +08:00
d91c4376f2
Restructure the repository for better organization: - tools/ - App & model running skills - image/ (ai-image-generation, flux-image, nano-banana, qwen-image-2, etc.) - video/ (ai-video-generation, google-veo, ai-avatar-video, etc.) - audio/ (text-to-speech, speech-to-text, ai-music-generation, etc.) - llm/ (llm-models, web-search, ai-rag-pipeline) - social/ (twitter-automation) - utilities/ (agentic-browser, python-executor, related-skill) - agent-tools/ - sdk/ - SDK documentation - javascript-sdk/ - python-sdk/ - ui/ - UI components - agent-ui, chat-ui, tools-ui, widgets-ui - guides/ - How-to guides & workflows - content/, design/, photo/, product/ - prompting/, social/, video/, writing/ Update README to reflect new structure.
382 lines
8.6 KiB
Markdown
382 lines
8.6 KiB
Markdown
# Tool Builder Reference
|
|
|
|
Complete guide to building tools with the Python SDK.
|
|
|
|
## Parameter Types
|
|
|
|
### Basic Types
|
|
|
|
```python
|
|
from inferencesh import string, number, integer, boolean
|
|
|
|
# String parameter
|
|
name = string("The user's full name")
|
|
|
|
# Number (float)
|
|
score = number("Score between 0 and 1")
|
|
|
|
# Integer
|
|
count = integer("Number of items")
|
|
|
|
# Boolean
|
|
enabled = boolean("Whether feature is enabled")
|
|
```
|
|
|
|
### Enum Type
|
|
|
|
```python
|
|
from inferencesh import enum_of
|
|
|
|
priority = enum_of(
|
|
["low", "medium", "high", "critical"],
|
|
"Task priority level"
|
|
)
|
|
```
|
|
|
|
### Array Type
|
|
|
|
```python
|
|
from inferencesh import array, string
|
|
|
|
# Array of strings
|
|
tags = array(string("Tag name"), "List of tags")
|
|
|
|
# Array of objects
|
|
items = array(
|
|
obj({
|
|
"name": string("Item name"),
|
|
"qty": integer("Quantity")
|
|
}),
|
|
"List of items"
|
|
)
|
|
```
|
|
|
|
### Object Type
|
|
|
|
```python
|
|
from inferencesh import obj, string, integer, optional
|
|
|
|
address = obj({
|
|
"street": string("Street address"),
|
|
"city": string("City name"),
|
|
"state": string("State code"),
|
|
"zip": optional(string("ZIP code"))
|
|
}, "Mailing address")
|
|
```
|
|
|
|
### Optional Parameters
|
|
|
|
```python
|
|
from inferencesh import optional, string
|
|
|
|
# Optional string
|
|
nickname = optional(string("User's nickname"))
|
|
```
|
|
|
|
## Tool Types
|
|
|
|
### Client Tools
|
|
|
|
Tools that execute in your code:
|
|
|
|
```python
|
|
from inferencesh import tool, string, integer
|
|
|
|
# Basic tool
|
|
greet = (
|
|
tool("greet")
|
|
.describe("Greets a user")
|
|
.param("name", string("Name to greet"))
|
|
.build()
|
|
)
|
|
|
|
# Tool with multiple parameters
|
|
send_email = (
|
|
tool("send_email")
|
|
.display("Send Email")
|
|
.describe("Sends an email to a recipient")
|
|
.param("to", string("Recipient email"))
|
|
.param("subject", string("Email subject"))
|
|
.param("body", string("Email body"))
|
|
.param("priority", integer("Priority 1-5"), default=3)
|
|
.require_approval()
|
|
.build()
|
|
)
|
|
```
|
|
|
|
### App Tools
|
|
|
|
Tools that call inference.sh apps:
|
|
|
|
```python
|
|
from inferencesh import app_tool, string
|
|
|
|
# Basic app tool
|
|
generate = (
|
|
app_tool("generate_image", "infsh/flux-schnell@latest")
|
|
.describe("Generate an image from a text prompt")
|
|
.param("prompt", string("Image description"))
|
|
.build()
|
|
)
|
|
|
|
# App tool with setup and defaults
|
|
translate = (
|
|
app_tool("translate", "infsh/translator@latest")
|
|
.describe("Translate text between languages")
|
|
.param("text", string("Text to translate"))
|
|
.param("target_lang", string("Target language code"))
|
|
.setup({
|
|
"model": "advanced",
|
|
"preserve_formatting": True
|
|
})
|
|
.input({
|
|
"source_lang": "auto"
|
|
})
|
|
.build()
|
|
)
|
|
```
|
|
|
|
### Agent Tools
|
|
|
|
Tools that delegate to other agents:
|
|
|
|
```python
|
|
from inferencesh import agent_tool, string
|
|
|
|
researcher = (
|
|
agent_tool("research", "my-org/researcher@v1")
|
|
.describe("Research a topic in depth")
|
|
.param("topic", string("Topic to research"))
|
|
.param("depth", string("Research depth: brief, moderate, comprehensive"))
|
|
.build()
|
|
)
|
|
|
|
coder = (
|
|
agent_tool("write_code", "my-org/coder@latest")
|
|
.describe("Write code to solve a problem")
|
|
.param("task", string("Coding task description"))
|
|
.param("language", string("Programming language"))
|
|
.build()
|
|
)
|
|
```
|
|
|
|
### Webhook Tools
|
|
|
|
Tools that call external HTTP endpoints:
|
|
|
|
```python
|
|
from inferencesh import webhook_tool, string
|
|
|
|
# Slack notification
|
|
slack = (
|
|
webhook_tool("notify_slack", "https://hooks.slack.com/services/...")
|
|
.describe("Send a message to Slack")
|
|
.param("channel", string("Channel name"))
|
|
.param("message", string("Message text"))
|
|
.build()
|
|
)
|
|
|
|
# Webhook with secret
|
|
github = (
|
|
webhook_tool("create_issue", "https://api.github.com/repos/org/repo/issues")
|
|
.describe("Create a GitHub issue")
|
|
.secret("GITHUB_TOKEN") # Uses stored secret
|
|
.param("title", string("Issue title"))
|
|
.param("body", string("Issue description"))
|
|
.build()
|
|
)
|
|
```
|
|
|
|
## Tool Builder Methods
|
|
|
|
### Common Methods
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `.describe(text)` | Set tool description |
|
|
| `.display(name)` | Set display name |
|
|
| `.param(name, type, default=None)` | Add parameter |
|
|
| `.require_approval()` | Require human approval |
|
|
| `.build()` | Build the tool |
|
|
|
|
### App Tool Methods
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `.setup(config)` | Hidden setup configuration |
|
|
| `.input(defaults)` | Default input values |
|
|
|
|
### Webhook Tool Methods
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `.secret(name)` | Use stored secret for auth |
|
|
|
|
## Internal Tools
|
|
|
|
Built-in capabilities you can enable:
|
|
|
|
```python
|
|
from inferencesh import internal_tools
|
|
|
|
config = (
|
|
internal_tools()
|
|
.plan() # Task planning
|
|
.memory() # Information storage
|
|
.web_search(True) # Web search capability
|
|
.code_execution(True) # Run code
|
|
.image_generation({
|
|
"enabled": True,
|
|
"app_ref": "infsh/flux@latest"
|
|
})
|
|
.build()
|
|
)
|
|
```
|
|
|
|
### Internal Tool Options
|
|
|
|
| Tool | Description |
|
|
|------|-------------|
|
|
| `.plan()` | Enable task breakdown and planning |
|
|
| `.memory()` | Enable information storage |
|
|
| `.web_search(enabled)` | Enable/disable web search |
|
|
| `.code_execution(enabled)` | Enable/disable code running |
|
|
| `.image_generation(config)` | Configure image generation |
|
|
|
|
## Handling Tool Calls
|
|
|
|
### Basic Handler
|
|
|
|
```python
|
|
def handle_tool(call):
|
|
if call.name == "greet":
|
|
result = f"Hello, {call.args['name']}!"
|
|
elif call.name == "calculate":
|
|
result = eval(call.args['expression'])
|
|
else:
|
|
result = {"error": f"Unknown tool: {call.name}"}
|
|
|
|
agent.submit_tool_result(call.id, result)
|
|
|
|
response = agent.send_message(
|
|
"Greet John",
|
|
on_tool_call=handle_tool
|
|
)
|
|
```
|
|
|
|
### With Approval
|
|
|
|
```python
|
|
def handle_tool(call):
|
|
if call.requires_approval:
|
|
print(f"Tool: {call.name}")
|
|
print(f"Args: {call.args}")
|
|
approved = input("Approve? (y/n): ").lower() == 'y'
|
|
|
|
if not approved:
|
|
agent.submit_tool_result(call.id, {
|
|
"error": "Denied by user"
|
|
})
|
|
return
|
|
|
|
result = execute_tool(call.name, call.args)
|
|
agent.submit_tool_result(call.id, result)
|
|
```
|
|
|
|
### Widget Results
|
|
|
|
Return structured data for UI widgets:
|
|
|
|
```python
|
|
def handle_tool(call):
|
|
if call.name == "confirm_order":
|
|
# Return widget data
|
|
agent.submit_tool_result(call.id, {
|
|
"action": {"type": "confirm"},
|
|
"form_data": {
|
|
"order_id": "12345",
|
|
"items": ["Widget A", "Widget B"],
|
|
"total": 99.99
|
|
}
|
|
})
|
|
```
|
|
|
|
## Complete Example
|
|
|
|
```python
|
|
from inferencesh import (
|
|
inference, tool, app_tool, webhook_tool,
|
|
string, number, integer, boolean, enum_of,
|
|
array, obj, optional, internal_tools
|
|
)
|
|
|
|
client = inference(api_key="inf_...")
|
|
|
|
# Calculator tool
|
|
calculator = (
|
|
tool("calculate")
|
|
.display("Calculator")
|
|
.describe("Perform mathematical calculations")
|
|
.param("expression", string("Math expression to evaluate"))
|
|
.build()
|
|
)
|
|
|
|
# Image generation tool
|
|
image_gen = (
|
|
app_tool("generate_image", "infsh/flux-schnell@latest")
|
|
.describe("Generate an image from text")
|
|
.param("prompt", string("Image description"))
|
|
.param("style", enum_of(["realistic", "artistic", "cartoon"], "Image style"))
|
|
.setup({"quality": "high"})
|
|
.input({"steps": 20})
|
|
.require_approval()
|
|
.build()
|
|
)
|
|
|
|
# Slack notification tool
|
|
slack = (
|
|
webhook_tool("notify", "https://hooks.slack.com/...")
|
|
.describe("Send Slack notification")
|
|
.param("message", string("Message to send"))
|
|
.build()
|
|
)
|
|
|
|
# Built-in tools
|
|
internals = (
|
|
internal_tools()
|
|
.web_search(True)
|
|
.code_execution(True)
|
|
.build()
|
|
)
|
|
|
|
# Create agent with all tools
|
|
agent = client.agent({
|
|
"core_app": {"ref": "infsh/claude-sonnet-4@latest"},
|
|
"system_prompt": "You are a helpful assistant with various capabilities.",
|
|
"tools": [calculator, image_gen, slack],
|
|
"internal_tools": internals,
|
|
"temperature": 0.7
|
|
})
|
|
|
|
# Handle tool calls
|
|
def handle_tool(call):
|
|
if call.name == "calculate":
|
|
try:
|
|
result = eval(call.args["expression"])
|
|
agent.submit_tool_result(call.id, {"result": result})
|
|
except Exception as e:
|
|
agent.submit_tool_result(call.id, {"error": str(e)})
|
|
elif call.requires_approval:
|
|
approved = input(f"Allow {call.name}? (y/n): ").lower() == 'y'
|
|
if approved:
|
|
# Let the app/webhook tool execute
|
|
pass
|
|
else:
|
|
agent.submit_tool_result(call.id, {"error": "Denied"})
|
|
|
|
response = agent.send_message(
|
|
"Calculate 15% tip on $85, then notify Slack",
|
|
on_tool_call=handle_tool
|
|
)
|
|
```
|