Files
okaris d91c4376f2 refactor: reorganize skills into tools, guides, sdk, and ui
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.
2026-03-03 21:46:56 +01:00

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