diff --git a/model_tools.py b/model_tools.py index cc2cea9c9..c8682dacb 100644 --- a/model_tools.py +++ b/model_tools.py @@ -95,7 +95,6 @@ def _discover_tools(): "tools.send_message_tool", "tools.honcho_tools", "tools.homeassistant_tool", - "tools.infsh_tool", ] import importlib for mod_name in _modules: diff --git a/skills/inference-sh/DESCRIPTION.md b/skills/inference-sh/DESCRIPTION.md deleted file mode 100644 index a4b2aa91c..000000000 --- a/skills/inference-sh/DESCRIPTION.md +++ /dev/null @@ -1,23 +0,0 @@ -# inference.sh - -Run 150+ AI applications in the cloud via the [inference.sh](https://inference.sh) platform. - -**One API key for everything** - Access all AI services with a single account. No need to manage separate API keys for FLUX, Veo, Claude, Tavily, Twitter, etc. You can also bring your own keys if you prefer. - -## Available Skills - -- **cli**: The inference.sh CLI (`infsh`) for running AI apps - -## What's Included - -- **Image Generation**: FLUX, Reve, Seedream, Grok Imagine, Gemini -- **Video Generation**: Veo, Wan, Seedance, OmniHuman, HunyuanVideo -- **LLMs**: Claude, Gemini, Kimi, GLM-4 (via OpenRouter) -- **Search**: Tavily, Exa -- **3D**: Rodin -- **Social**: Twitter/X automation -- **Audio**: TTS, voice cloning - -## Tools - -This category provides the `infsh` and `infsh_install` tools in the `inference` toolset. diff --git a/skills/inference-sh/cli/SKILL.md b/skills/inference-sh/cli/SKILL.md deleted file mode 100644 index 67e33436e..000000000 --- a/skills/inference-sh/cli/SKILL.md +++ /dev/null @@ -1,372 +0,0 @@ ---- -name: inference-sh-cli -description: "Run 150+ AI apps via inference.sh CLI (infsh) - image generation, video creation, LLMs, search, 3D, Twitter automation. Models: FLUX, Veo, Gemini, Grok, Claude, Seedance, OmniHuman, Tavily, Exa, OpenRouter. Triggers: inference.sh, infsh, ai apps, serverless ai, flux, veo, image generation, video generation" -version: 1.0.0 -author: inference.sh -license: MIT -metadata: - hermes: - tags: [AI, image-generation, video, LLM, search, inference, FLUX, Veo, Claude] - requires_tools: [infsh] ---- - -# inference.sh CLI - -Run 150+ AI apps in the cloud with a simple CLI. No GPU required. - -**One API key for everything** - Manage all AI services (FLUX, Veo, Claude, Tavily, X/Twitter, and more) with a single inference.sh account. No need to sign up for dozens of different providers. You can also bring your own API keys if you prefer. - -## Tools - -This skill is backed by the `infsh` and `infsh_install` tools: - -- **infsh**: Run any infsh command (app list, app run, etc.) -- **infsh_install**: Install the CLI if not already present - -## Quick Start - -```bash -# Install (if needed) -infsh_install - -# List available apps -infsh app list - -# Search for apps -infsh app list --search flux -infsh app list --search video - -# Run an app -infsh app run falai/flux-dev-lora --input '{"prompt": "a cat astronaut"}' --json -``` - -## Local File Uploads - -The CLI automatically uploads local files when you provide a file path instead of a URL: - -```bash -# Upscale a local image -infsh app run falai/topaz-image-upscaler --input '{"image": "/path/to/photo.jpg", "upscale_factor": 2}' --json - -# Image-to-video from local file -infsh app run falai/wan-2-5-i2v --input '{"image": "/path/to/image.png", "prompt": "make it come alive"}' --json - -# Video generation with local first frame -infsh app run bytedance/seedance-1-5-pro --input '{"prompt": "dancing figure", "image": "./first-frame.png"}' --json -``` - -## Image Generation - -```bash -# Gemini 2.5 Flash Image (Google) - fast, high quality -infsh app run google/gemini-2-5-flash-image --input '{"prompt": "futuristic city", "num_images": 1}' --json - -# Gemini 3 Pro Image Preview (Google) - latest model -infsh app run google/gemini-3-pro-image-preview --input '{"prompt": "photorealistic landscape"}' --json - -# Gemini 3.1 Flash Image Preview (Google) -infsh app run google/gemini-3-1-flash-image-preview --input '{"prompt": "artistic portrait"}' --json - -# FLUX Dev with LoRA support -infsh app run falai/flux-dev-lora --input '{"prompt": "sunset over mountains", "num_images": 1}' --json - -# FLUX 2 Klein with LoRA -infsh app run falai/flux-2-klein-lora --input '{"prompt": "portrait photo"}' --json - -# Reve - stylized generation and editing -infsh app run falai/reve --input '{"prompt": "cyberpunk city"}' --json - -# Seedream 5 Lite - high-quality 2K-3K (ByteDance) -infsh app run bytedance/seedream-5-lite --input '{"prompt": "nature scene"}' --json - -# Seedream 4.5 - 2K-4K images -infsh app run bytedance/seedream-4-5 --input '{"prompt": "detailed illustration"}' --json - -# Seedream 3.0 - cinematic quality -infsh app run bytedance/seedream-3-0-t2i --input '{"prompt": "fantasy landscape"}' --json - -# Grok Imagine - xAI image generation -infsh app run xai/grok-imagine-image --input '{"prompt": "abstract art"}' --json - -# Grok Imagine Pro - higher quality -infsh app run xai/grok-imagine-image-pro --input '{"prompt": "photorealistic portrait"}' --json - -# Qwen Image 2 Pro (Alibaba) -infsh app run alibaba/qwen-image-2-pro --input '{"prompt": "anime character"}' --json -``` - -## Video Generation - -```bash -# Veo 3.1 Fast (Google) -infsh app run google/veo-3-1-fast --input '{"prompt": "drone shot of coastline"}' --json - -# Veo 3.1 (higher quality) -infsh app run google/veo-3-1 --input '{"prompt": "cinematic scene"}' --json - -# Veo 3 Fast -infsh app run google/veo-3-fast --input '{"prompt": "nature documentary shot"}' --json - -# Veo 2 -infsh app run google/veo-2 --input '{"prompt": "slow motion water splash"}' --json - -# Grok Imagine Video - xAI -infsh app run xai/grok-imagine-video --input '{"prompt": "timelapse of clouds"}' --json - -# Seedance 1.5 Pro - ByteDance -infsh app run bytedance/seedance-1-5-pro --input '{"prompt": "dancing figure", "resolution": "1080p"}' --json - -# Seedance 1.0 Pro -infsh app run bytedance/seedance-1-0-pro --input '{"prompt": "walking through forest"}' --json - -# Seedance 1.0 Pro Fast -infsh app run bytedance/seedance-1-0-pro-fast --input '{"prompt": "quick motion"}' --json - -# Seedance 1.0 Lite - 720p lightweight -infsh app run bytedance/seedance-1-0-lite --input '{"prompt": "simple animation"}' --json - -# Wan 2.5 - text-to-video -infsh app run falai/wan-2-5 --input '{"prompt": "person walking through city"}' --json - -# Wan 2.5 Image-to-Video -infsh app run falai/wan-2-5-i2v --input '{"image": "/path/to/image.png", "prompt": "make it move naturally"}' --json - -# LTX Video -infsh app run infsh/ltx-video --input '{"prompt": "realistic scene"}' --json - -# Magi 1 -infsh app run infsh/magi-1 --input '{"prompt": "creative video"}' --json -``` - -## Avatar & Lipsync - -```bash -# OmniHuman 1.5 - multi-character audio-driven avatars -infsh app run bytedance/omnihuman-1-5 --input '{"audio": "/path/to/audio.mp3", "image": "/path/to/face.jpg"}' --json - -# OmniHuman 1.0 -infsh app run bytedance/omnihuman-1-0 --input '{"audio": "/path/to/speech.wav", "image": "/path/to/portrait.png"}' --json - -# Fabric 1.0 - image animation -infsh app run falai/fabric-1-0 --input '{"image": "/path/to/photo.jpg"}' --json - -# PixVerse Lipsync -infsh app run falai/pixverse-lipsync --input '{"audio": "/path/to/audio.mp3", "video": "/path/to/video.mp4"}' --json -``` - -## Upscaling - -```bash -# Topaz Image Upscaler - up to 4x -infsh app run falai/topaz-image-upscaler --input '{"image": "/path/to/photo.jpg", "upscale_factor": 2}' --json - -# Topaz Video Upscaler -infsh app run falai/topaz-video-upscaler --input '{"video": "/path/to/video.mp4"}' --json - -# Real-ESRGAN - image enhancement -infsh app run infsh/real-esrgan --input '{"image": "/path/to/image.jpg"}' --json - -# Thera - upscale to any size -infsh app run infsh/thera --input '{"image": "/path/to/image.jpg"}' --json -``` - -## LLMs (via OpenRouter) - -```bash -# Claude Opus 4.6 -infsh app run openrouter/claude-opus-46 --input '{"prompt": "Explain quantum computing"}' --json - -# Claude Sonnet 4.5 -infsh app run openrouter/claude-sonnet-45 --input '{"prompt": "Write a poem"}' --json - -# Claude Haiku 4.5 -infsh app run openrouter/claude-haiku-45 --input '{"prompt": "Quick question"}' --json - -# Gemini 3 Pro Preview -infsh app run openrouter/gemini-3-pro-preview --input '{"prompt": "Analyze this"}' --json - -# Kimi K2 Thinking -infsh app run openrouter/kimi-k2-thinking --input '{"prompt": "Solve this step by step"}' --json - -# GLM 4.6 -infsh app run openrouter/glm-46 --input '{"prompt": "Help me with"}' --json - -# MiniMax M2.5 -infsh app run openrouter/minimax-m-25 --input '{"prompt": "Creative writing"}' --json - -# Intellect 3 -infsh app run openrouter/intellect-3 --input '{"prompt": "Research question"}' --json -``` - -## Web Search - -```bash -# Tavily Search Assistant - comprehensive results -infsh app run tavily/search-assistant --input '{"query": "latest AI news", "include_answer": true}' --json - -# Tavily Extract - get content from URLs -infsh app run tavily/extract --input '{"urls": ["https://example.com"]}' --json - -# Exa Search - neural search -infsh app run exa/search --input '{"query": "machine learning tutorials"}' --json - -# Exa Answer - LLM-powered answers -infsh app run exa/answer --input '{"query": "what is transformers architecture"}' --json - -# Exa Extract - extract web content -infsh app run exa/extract --input '{"url": "https://example.com"}' --json -``` - -## 3D Generation - -```bash -# Rodin 3D Generator -infsh app run infsh/rodin-3d-generator --input '{"prompt": "a wooden chair"}' --json - -# HunyuanImage to 3D -infsh app run infsh/hunyuan-image-to-3d-2 --input '{"image": "/path/to/object.png"}' --json -``` - -## Text-to-Speech - -```bash -# Kokoro TTS - lightweight -infsh app run falai/kokoro-tts --input '{"text": "Hello, this is a test."}' --json - -# Dia TTS - realistic dialogue -infsh app run falai/dia-tts --input '{"text": "Two characters talking"}' --json -``` - -## Twitter/X Automation - -```bash -# Post a tweet -infsh app run x/post-tweet --input '{"text": "Hello from AI!"}' --json - -# Create post with media -infsh app run x/post-create --input '{"text": "Check this out", "media": "/path/to/image.jpg"}' --json - -# Send DM -infsh app run x/dm-send --input '{"recipient_id": "123456", "text": "Hi there!"}' --json - -# Follow user -infsh app run x/user-follow --input '{"user_id": "123456"}' --json - -# Like a post -infsh app run x/post-like --input '{"post_id": "123456789"}' --json - -# Retweet -infsh app run x/post-retweet --input '{"post_id": "123456789"}' --json - -# Get user profile -infsh app run x/user-get --input '{"username": "elonmusk"}' --json - -# Get post -infsh app run x/post-get --input '{"post_id": "123456789"}' --json - -# Delete post -infsh app run x/post-delete --input '{"post_id": "123456789"}' --json -``` - -## Utilities - -```bash -# Browser automation -infsh app run infsh/agent-browser --function open --session new --input '{"url": "https://example.com"}' --json - -# Media merger - combine videos/images -infsh app run infsh/media-merger --input '{"files": ["/path/to/video1.mp4", "/path/to/video2.mp4"]}' --json - -# Video audio extractor -infsh app run infsh/video-audio-extractor --input '{"video": "/path/to/video.mp4"}' --json - -# Video audio merger -infsh app run infsh/video-audio-merger --input '{"video": "/path/to/video.mp4", "audio": "/path/to/audio.mp3"}' --json - -# Caption videos -infsh app run infsh/caption-videos --input '{"video": "/path/to/video.mp4"}' --json - -# Stitch images -infsh app run infsh/stitch-images --input '{"images": ["/path/to/1.jpg", "/path/to/2.jpg"]}' --json - -# Python executor -infsh app run infsh/python-executor --input '{"code": "print(2+2)"}' --json - -# HTML to image -infsh app run infsh/html-to-image --input '{"html": "

Hello

"}' --json - -# NSFW detection -infsh app run infsh/falconsai-nsfw-detection --input '{"image": "/path/to/image.jpg"}' --json - -# Media analyzer -infsh app run infsh/media-analyzer --input '{"file": "/path/to/media.jpg"}' --json -``` - -## Common Patterns - -### Generate + Upscale Pipeline - -```bash -# Generate image, capture URL, then upscale -infsh app run falai/flux-dev-lora --input '{"prompt": "portrait photo"}' --json --save result.json - -# Extract URL and upscale (using jq) -IMG=$(cat result.json | jq -r '.images[0].url') -infsh app run falai/topaz-image-upscaler --input "{\"image\": \"$IMG\", \"upscale_factor\": 2}" --json -``` - -### Get App Schema - -```bash -# See what inputs an app accepts -infsh app get falai/flux-dev-lora - -# Generate sample input -infsh app sample falai/flux-dev-lora - -# Save sample to file, edit, then run -infsh app sample falai/flux-dev-lora --save input.json -# edit input.json... -infsh app run falai/flux-dev-lora --input input.json --json -``` - -### Long-running Tasks - -```bash -# Start without waiting -infsh app run google/veo-3-1 --input '{"prompt": "..."}' --no-wait - -# Check status later -infsh task get - -# Save result when done -infsh task get --save result.json -``` - -## Available Categories - -| Category | Apps | -|----------|------| -| **Image** | google/nano-banana, google/nano-banana-pro, google/nano-banana-2, falai/flux-dev-lora, bytedance/seedream-5-lite, falai/reve, xai/grok-imagine-image | -| **Video** | google/veo-*, xai/grok-imagine-video, bytedance/seedance-*, falai/wan-2-5*, infsh/ltx-video, infsh/magi-1 | -| **Avatar** | bytedance/omnihuman-*, falai/fabric-1-0, falai/pixverse-lipsync | -| **Upscale** | falai/topaz-image-upscaler, falai/topaz-video-upscaler, infsh/real-esrgan, infsh/thera | -| **LLMs** | openrouter/claude-*, openrouter/gemini-*, openrouter/kimi-*, openrouter/glm-* | -| **Search** | tavily/search-assistant, tavily/extract, exa/search, exa/answer, exa/extract | -| **3D** | infsh/rodin-3d-generator, infsh/hunyuan-image-to-3d-2 | -| **TTS** | falai/kokoro-tts, falai/dia-tts | -| **Social** | x/post-tweet, x/post-create, x/dm-send, x/user-follow, x/post-like, x/post-retweet | -| **Utils** | infsh/agent-browser, infsh/media-merger, infsh/caption-videos, infsh/stitch-images | - -## Reference Files - -- [Authentication & Setup](references/authentication.md) -- [Discovering Apps](references/app-discovery.md) -- [Running Apps](references/running-apps.md) -- [CLI Reference](references/cli-reference.md) - -## Documentation - -- [inference.sh Docs](https://inference.sh/docs) -- [CLI Setup Guide](https://inference.sh/docs/extend/cli-setup) -- [Apps Overview](https://inference.sh/docs/apps/overview) diff --git a/skills/inference-sh/cli/references/app-discovery.md b/skills/inference-sh/cli/references/app-discovery.md deleted file mode 100644 index adcac8c5d..000000000 --- a/skills/inference-sh/cli/references/app-discovery.md +++ /dev/null @@ -1,112 +0,0 @@ -# Discovering Apps - -## List All Apps - -```bash -infsh app list -``` - -## Pagination - -```bash -infsh app list --page 2 -``` - -## Filter by Category - -```bash -infsh app list --category image -infsh app list --category video -infsh app list --category audio -infsh app list --category text -infsh app list --category other -``` - -## Search - -```bash -infsh app search "flux" -infsh app search "video generation" -infsh app search "tts" -l -infsh app search "image" --category image -``` - -Or use the flag form: - -```bash -infsh app list --search "flux" -infsh app list --search "video generation" -infsh app list --search "tts" -``` - -## Featured Apps - -```bash -infsh app list --featured -``` - -## Newest First - -```bash -infsh app list --new -``` - -## Detailed View - -```bash -infsh app list -l -``` - -Shows table with app name, category, description, and featured status. - -## Save to File - -```bash -infsh app list --save apps.json -``` - -## Your Apps - -List apps you've deployed: - -```bash -infsh app my -infsh app my -l # detailed -``` - -## Get App Details - -```bash -infsh app get falai/flux-dev-lora -infsh app get falai/flux-dev-lora --json -``` - -Shows full app info including input/output schema. - -## Popular Apps by Category - -### Image Generation -- `falai/flux-dev-lora` - FLUX.2 Dev (high quality) -- `falai/flux-2-klein-lora` - FLUX.2 Klein (fastest) -- `infsh/sdxl` - Stable Diffusion XL -- `google/gemini-3-pro-image-preview` - Gemini 3 Pro -- `xai/grok-imagine-image` - Grok image generation - -### Video Generation -- `google/veo-3-1-fast` - Veo 3.1 Fast -- `google/veo-3` - Veo 3 -- `bytedance/seedance-1-5-pro` - Seedance 1.5 Pro -- `infsh/ltx-video-2` - LTX Video 2 (with audio) -- `bytedance/omnihuman-1-5` - OmniHuman avatar - -### Audio -- `infsh/dia-tts` - Conversational TTS -- `infsh/kokoro-tts` - Kokoro TTS -- `infsh/fast-whisper-large-v3` - Fast transcription -- `infsh/diffrythm` - Music generation - -## Documentation - -- [Browsing the Grid](https://inference.sh/docs/apps/browsing-grid) - Visual app browsing -- [Apps Overview](https://inference.sh/docs/apps/overview) - Understanding apps -- [Running Apps](https://inference.sh/docs/apps/running) - How to run apps diff --git a/skills/inference-sh/cli/references/authentication.md b/skills/inference-sh/cli/references/authentication.md deleted file mode 100644 index 3b6519d3d..000000000 --- a/skills/inference-sh/cli/references/authentication.md +++ /dev/null @@ -1,59 +0,0 @@ -# Authentication & Setup - -## Install the CLI - -```bash -curl -fsSL https://cli.inference.sh | sh -``` - -## Login - -```bash -infsh login -``` - -This opens a browser for authentication. After login, credentials are stored locally. - -## Check Authentication - -```bash -infsh me -``` - -Shows your user info if authenticated. - -## Environment Variable - -For CI/CD or scripts, set your API key: - -```bash -export INFSH_API_KEY=your-api-key -``` - -The environment variable overrides the config file. - -## Update CLI - -```bash -infsh update -``` - -Or reinstall: - -```bash -curl -fsSL https://cli.inference.sh | sh -``` - -## Troubleshooting - -| Error | Solution | -|-------|----------| -| "not authenticated" | Run `infsh login` | -| "command not found" | Reinstall CLI or add to PATH | -| "API key invalid" | Check `INFSH_API_KEY` or re-login | - -## Documentation - -- [CLI Setup](https://inference.sh/docs/extend/cli-setup) - Complete CLI installation guide -- [API Authentication](https://inference.sh/docs/api/authentication) - API key management -- [Secrets](https://inference.sh/docs/secrets/overview) - Managing credentials diff --git a/skills/inference-sh/cli/references/cli-reference.md b/skills/inference-sh/cli/references/cli-reference.md deleted file mode 100644 index 50825825f..000000000 --- a/skills/inference-sh/cli/references/cli-reference.md +++ /dev/null @@ -1,104 +0,0 @@ -# CLI Reference - -## Installation - -```bash -curl -fsSL https://cli.inference.sh | sh -``` - -## Global Commands - -| Command | Description | -|---------|-------------| -| `infsh help` | Show help | -| `infsh version` | Show CLI version | -| `infsh update` | Update CLI to latest | -| `infsh login` | Authenticate | -| `infsh me` | Show current user | - -## App Commands - -### Discovery - -| Command | Description | -|---------|-------------| -| `infsh app list` | List available apps | -| `infsh app list --category ` | Filter by category (image, video, audio, text, other) | -| `infsh app search ` | Search apps | -| `infsh app list --search ` | Search apps (flag form) | -| `infsh app list --featured` | Show featured apps | -| `infsh app list --new` | Sort by newest | -| `infsh app list --page ` | Pagination | -| `infsh app list -l` | Detailed table view | -| `infsh app list --save ` | Save to JSON file | -| `infsh app my` | List your deployed apps | -| `infsh app get ` | Get app details | -| `infsh app get --json` | Get app details as JSON | - -### Execution - -| Command | Description | -|---------|-------------| -| `infsh app run --input ` | Run app with input file | -| `infsh app run --input ''` | Run with inline JSON | -| `infsh app run --input --no-wait` | Run without waiting for completion | -| `infsh app sample ` | Show sample input | -| `infsh app sample --save ` | Save sample to file | - -## Task Commands - -| Command | Description | -|---------|-------------| -| `infsh task get ` | Get task status and result | -| `infsh task get --json` | Get task as JSON | -| `infsh task get --save ` | Save task result to file | - -### Development - -| Command | Description | -|---------|-------------| -| `infsh app init` | Create new app (interactive) | -| `infsh app init ` | Create new app with name | -| `infsh app test --input ` | Test app locally | -| `infsh app deploy` | Deploy app | -| `infsh app deploy --dry-run` | Validate without deploying | -| `infsh app pull ` | Pull app source | -| `infsh app pull --all` | Pull all your apps | - -## Environment Variables - -| Variable | Description | -|----------|-------------| -| `INFSH_API_KEY` | API key (overrides config) | - -## Shell Completions - -```bash -# Bash -infsh completion bash > /etc/bash_completion.d/infsh - -# Zsh -infsh completion zsh > "${fpath[1]}/_infsh" - -# Fish -infsh completion fish > ~/.config/fish/completions/infsh.fish -``` - -## App Name Format - -Apps use the format `namespace/app-name`: - -- `falai/flux-dev-lora` - fal.ai's FLUX 2 Dev -- `google/veo-3` - Google's Veo 3 -- `infsh/sdxl` - inference.sh's SDXL -- `bytedance/seedance-1-5-pro` - ByteDance's Seedance -- `xai/grok-imagine-image` - xAI's Grok - -Version pinning: `namespace/app-name@version` - -## Documentation - -- [CLI Setup](https://inference.sh/docs/extend/cli-setup) - Complete CLI installation guide -- [Running Apps](https://inference.sh/docs/apps/running) - How to run apps via CLI -- [Creating an App](https://inference.sh/docs/extend/creating-app) - Build your own apps -- [Deploying](https://inference.sh/docs/extend/deploying) - Deploy apps to the cloud diff --git a/skills/inference-sh/cli/references/running-apps.md b/skills/inference-sh/cli/references/running-apps.md deleted file mode 100644 index e930d5cfb..000000000 --- a/skills/inference-sh/cli/references/running-apps.md +++ /dev/null @@ -1,171 +0,0 @@ -# Running Apps - -## Basic Run - -```bash -infsh app run user/app-name --input input.json -``` - -## Inline JSON - -```bash -infsh app run falai/flux-dev-lora --input '{"prompt": "a sunset over mountains"}' -``` - -## Version Pinning - -```bash -infsh app run user/app-name@1.0.0 --input input.json -``` - -## Local File Uploads - -The CLI automatically uploads local files when you provide a file path instead of a URL. Any field that accepts a URL also accepts a local path: - -```bash -# Upscale a local image -infsh app run falai/topaz-image-upscaler --input '{"image": "/path/to/photo.jpg", "upscale_factor": 2}' - -# Image-to-video from local file -infsh app run falai/wan-2-5-i2v --input '{"image": "./my-image.png", "prompt": "make it move"}' - -# Avatar with local audio and image -infsh app run bytedance/omnihuman-1-5 --input '{"audio": "/path/to/speech.mp3", "image": "/path/to/face.jpg"}' - -# Post tweet with local media -infsh app run x/post-create --input '{"text": "Check this out!", "media": "./screenshot.png"}' -``` - -Supported paths: -- Absolute paths: `/home/user/images/photo.jpg` -- Relative paths: `./image.png`, `../data/video.mp4` -- Home directory: `~/Pictures/photo.jpg` - -## Generate Sample Input - -Before running, generate a sample input file: - -```bash -infsh app sample falai/flux-dev-lora -``` - -Save to file: - -```bash -infsh app sample falai/flux-dev-lora --save input.json -``` - -Then edit `input.json` and run: - -```bash -infsh app run falai/flux-dev-lora --input input.json -``` - -## Workflow Example - -### Image Generation with FLUX - -```bash -# 1. Get app details -infsh app get falai/flux-dev-lora - -# 2. Generate sample input -infsh app sample falai/flux-dev-lora --save input.json - -# 3. Edit input.json -# { -# "prompt": "a cat astronaut floating in space", -# "num_images": 1, -# "image_size": "landscape_16_9" -# } - -# 4. Run -infsh app run falai/flux-dev-lora --input input.json -``` - -### Video Generation with Veo - -```bash -# 1. Generate sample -infsh app sample google/veo-3-1-fast --save input.json - -# 2. Edit prompt -# { -# "prompt": "A drone shot flying over a forest at sunset" -# } - -# 3. Run -infsh app run google/veo-3-1-fast --input input.json -``` - -### Text-to-Speech - -```bash -# Quick inline run -infsh app run falai/kokoro-tts --input '{"text": "Hello, this is a test."}' -``` - -## Task Tracking - -When you run an app, the CLI shows the task ID: - -``` -Running falai/flux-dev-lora -Task ID: abc123def456 -``` - -For long-running tasks, you can check status anytime: - -```bash -# Check task status -infsh task get abc123def456 - -# Get result as JSON -infsh task get abc123def456 --json - -# Save result to file -infsh task get abc123def456 --save result.json -``` - -### Run Without Waiting - -For very long tasks, run in background: - -```bash -# Submit and return immediately -infsh app run google/veo-3 --input input.json --no-wait - -# Check later -infsh task get -``` - -## Output - -The CLI returns the app output directly. For file outputs (images, videos, audio), you'll receive URLs to download. - -Example output: - -```json -{ - "images": [ - { - "url": "https://cloud.inference.sh/...", - "content_type": "image/png" - } - ] -} -``` - -## Error Handling - -| Error | Cause | Solution | -|-------|-------|----------| -| "invalid input" | Schema mismatch | Check `infsh app get` for required fields | -| "app not found" | Wrong app name | Check `infsh app list --search` | -| "quota exceeded" | Out of credits | Check account balance | - -## Documentation - -- [Running Apps](https://inference.sh/docs/apps/running) - Complete running apps guide -- [Streaming Results](https://inference.sh/docs/api/sdk/streaming) - Real-time progress updates -- [Setup Parameters](https://inference.sh/docs/apps/setup-parameters) - Configuring app inputs diff --git a/tests/tools/test_infsh_tool.py b/tests/tools/test_infsh_tool.py deleted file mode 100644 index f866df1e3..000000000 --- a/tests/tools/test_infsh_tool.py +++ /dev/null @@ -1,114 +0,0 @@ -"""Tests for tools/infsh_tool.py — inference.sh CLI integration.""" - -import json -import subprocess -from unittest.mock import patch, MagicMock - -import pytest - -from tools.infsh_tool import ( - check_infsh_requirements, - infsh_tool, - infsh_install, -) - - -class TestCheckRequirements: - def test_returns_bool(self): - result = check_infsh_requirements() - assert isinstance(result, bool) - - def test_returns_true_when_infsh_on_path(self, monkeypatch): - monkeypatch.setattr("shutil.which", lambda cmd: "/usr/local/bin/infsh" if cmd == "infsh" else None) - assert check_infsh_requirements() is True - - def test_returns_false_when_missing(self, monkeypatch): - monkeypatch.setattr("shutil.which", lambda cmd: None) - assert check_infsh_requirements() is False - - -class TestInfshTool: - def test_not_installed_returns_error(self, monkeypatch): - monkeypatch.setattr("tools.infsh_tool.check_infsh_requirements", lambda: False) - result = json.loads(infsh_tool("app list")) - assert result["success"] is False - assert "not installed" in result["error"].lower() - - def test_successful_command(self, monkeypatch): - monkeypatch.setattr("tools.infsh_tool.check_infsh_requirements", lambda: True) - mock_result = MagicMock() - mock_result.returncode = 0 - mock_result.stdout = '{"apps": ["flux", "veo"]}' - mock_result.stderr = "" - - with patch("subprocess.run", return_value=mock_result) as mock_run: - result = json.loads(infsh_tool("app list --search flux")) - assert result["success"] is True - mock_run.assert_called_once() - call_cmd = mock_run.call_args[0][0] - assert "infsh app list --search flux" in call_cmd - - def test_failed_command(self, monkeypatch): - monkeypatch.setattr("tools.infsh_tool.check_infsh_requirements", lambda: True) - mock_result = MagicMock() - mock_result.returncode = 1 - mock_result.stdout = "" - mock_result.stderr = "unknown command" - - with patch("subprocess.run", return_value=mock_result): - result = json.loads(infsh_tool("badcommand")) - assert result["success"] is False - assert result["exit_code"] == 1 - - def test_timeout_handled(self, monkeypatch): - monkeypatch.setattr("tools.infsh_tool.check_infsh_requirements", lambda: True) - - with patch("subprocess.run", side_effect=subprocess.TimeoutExpired("infsh", 300)): - result = json.loads(infsh_tool("app run something", timeout=300)) - assert result["success"] is False - assert "timed out" in result["error"].lower() - - def test_json_output_parsed(self, monkeypatch): - monkeypatch.setattr("tools.infsh_tool.check_infsh_requirements", lambda: True) - mock_result = MagicMock() - mock_result.returncode = 0 - mock_result.stdout = '{"url": "https://example.com/image.png"}' - mock_result.stderr = "" - - with patch("subprocess.run", return_value=mock_result): - result = json.loads(infsh_tool("app run flux --json")) - assert result["success"] is True - assert isinstance(result["output"], dict) - assert result["output"]["url"] == "https://example.com/image.png" - - -class TestInfshInstall: - def test_already_installed(self, monkeypatch): - monkeypatch.setattr("tools.infsh_tool.check_infsh_requirements", lambda: True) - monkeypatch.setattr("tools.infsh_tool._get_infsh_path", lambda: "/usr/local/bin/infsh") - mock_result = MagicMock() - mock_result.returncode = 0 - mock_result.stdout = "infsh v1.2.3" - - with patch("subprocess.run", return_value=mock_result): - result = json.loads(infsh_install()) - assert result["success"] is True - assert result["already_installed"] is True - - -class TestToolRegistration: - def test_tools_registered(self): - from tools.registry import registry - assert "infsh" in registry._tools - assert "infsh_install" in registry._tools - - def test_infsh_in_inference_toolset(self): - from toolsets import TOOLSETS - assert "inference" in TOOLSETS - assert "infsh" in TOOLSETS["inference"]["tools"] - assert "infsh_install" in TOOLSETS["inference"]["tools"] - - def test_infsh_not_in_core_tools(self): - from toolsets import _HERMES_CORE_TOOLS - assert "infsh" not in _HERMES_CORE_TOOLS - assert "infsh_install" not in _HERMES_CORE_TOOLS diff --git a/tools/infsh_tool.py b/tools/infsh_tool.py deleted file mode 100644 index ede785dd1..000000000 --- a/tools/infsh_tool.py +++ /dev/null @@ -1,302 +0,0 @@ -#!/usr/bin/env python3 -""" -Inference.sh Tool Module - -A simple tool for running AI apps via the inference.sh CLI (infsh). -Provides two functions: - - infsh_install: Install the infsh CLI - - infsh: Run any infsh command - -This is a lightweight wrapper that gives agents direct access to 150+ AI apps -including image generation (FLUX, Reve), video (Veo, Wan), LLMs, search, and more. - -Usage: - from tools.infsh_tool import infsh_tool, infsh_install - - # Install the CLI - result = infsh_install() - - # Search for apps first (always do this!) - result = infsh_tool("app list --search flux") - - # Run an app - result = infsh_tool("app run falai/flux-dev-lora --input '{\"prompt\": \"a cat\"}' --json") -""" - -import json -import logging -import os -import shutil -import subprocess -from typing import Optional - -logger = logging.getLogger(__name__) - - -# --------------------------------------------------------------------------- -# Configuration -# --------------------------------------------------------------------------- - -DEFAULT_TIMEOUT = 300 # 5 minutes for long-running AI tasks -INSTALL_TIMEOUT = 60 - - -# --------------------------------------------------------------------------- -# Availability check -# --------------------------------------------------------------------------- - -def check_infsh_requirements() -> bool: - """Check if infsh is available in PATH.""" - return shutil.which("infsh") is not None - - -def _get_infsh_path() -> Optional[str]: - """Get the path to infsh binary.""" - return shutil.which("infsh") - - -# --------------------------------------------------------------------------- -# Install function -# --------------------------------------------------------------------------- - -def infsh_install() -> str: - """ - Install the inference.sh CLI. - - Downloads and installs the infsh binary using the official installer script. - The installer detects OS/arch, downloads the correct binary, verifies checksum, - and places it in PATH. - - Returns: - JSON string with success/error status - """ - try: - # Check if already installed - if check_infsh_requirements(): - infsh_path = _get_infsh_path() - # Get version - version_result = subprocess.run( - ["infsh", "--version"], - capture_output=True, - text=True, - timeout=10 - ) - version = version_result.stdout.strip() if version_result.returncode == 0 else "unknown" - return json.dumps({ - "success": True, - "message": f"infsh is already installed at {infsh_path}", - "version": version, - "already_installed": True - }) - - # Run the installer - result = subprocess.run( - ["sh", "-c", "curl -fsSL https://cli.inference.sh | sh"], - capture_output=True, - text=True, - timeout=INSTALL_TIMEOUT, - env={**os.environ, "NONINTERACTIVE": "1"} - ) - - if result.returncode != 0: - return json.dumps({ - "success": False, - "error": f"Installation failed: {result.stderr}", - "stdout": result.stdout - }) - - # Verify installation - if not check_infsh_requirements(): - return json.dumps({ - "success": False, - "error": "Installation completed but infsh not found in PATH. You may need to restart your shell or add ~/.local/bin to PATH.", - "stdout": result.stdout - }) - - return json.dumps({ - "success": True, - "message": "infsh installed successfully", - "stdout": result.stdout, - "next_step": "Run 'infsh login' to authenticate, or set INFSH_API_KEY environment variable" - }) - - except subprocess.TimeoutExpired: - return json.dumps({ - "success": False, - "error": f"Installation timed out after {INSTALL_TIMEOUT}s" - }) - except Exception as e: - logger.exception("infsh_install error: %s", e) - return json.dumps({ - "success": False, - "error": f"Installation error: {type(e).__name__}: {e}" - }) - - -# --------------------------------------------------------------------------- -# Main tool function -# --------------------------------------------------------------------------- - -def infsh_tool( - command: str, - timeout: Optional[int] = None, -) -> str: - """ - Execute an infsh CLI command. - - Args: - command: The infsh command to run (without the 'infsh' prefix). - Examples: "app list", "app run falai/flux-schnell --input '{}'" - timeout: Command timeout in seconds (default: 300) - - Returns: - JSON string with output, exit_code, and error fields - """ - try: - effective_timeout = timeout or DEFAULT_TIMEOUT - - # Check if infsh is installed - if not check_infsh_requirements(): - return json.dumps({ - "success": False, - "error": "infsh CLI is not installed. Use infsh_install to install it first.", - "hint": "Call the infsh_install tool to set up the CLI" - }) - - # Build the full command - full_command = f"infsh {command}" - - # Execute - result = subprocess.run( - full_command, - shell=True, - capture_output=True, - text=True, - timeout=effective_timeout, - env=os.environ - ) - - output = result.stdout - error = result.stderr - - # Try to parse JSON output if present - parsed_output = None - if output.strip(): - try: - parsed_output = json.loads(output) - except json.JSONDecodeError: - pass # Not JSON, keep as string - - response = { - "success": result.returncode == 0, - "exit_code": result.returncode, - "output": parsed_output if parsed_output is not None else output, - } - - if error: - response["stderr"] = error - - return json.dumps(response, indent=2) - - except subprocess.TimeoutExpired: - return json.dumps({ - "success": False, - "error": f"Command timed out after {effective_timeout}s", - "hint": "For long-running tasks, consider using --no-wait flag" - }) - except Exception as e: - logger.exception("infsh_tool error: %s", e) - return json.dumps({ - "success": False, - "error": f"Execution error: {type(e).__name__}: {e}" - }) - - -# --------------------------------------------------------------------------- -# Registry -# --------------------------------------------------------------------------- - -from tools.registry import registry - -INFSH_TOOL_DESCRIPTION = """Run AI apps via inference.sh CLI. Access 150+ apps for image generation, video, LLMs, search, 3D, and more. - -One API key for everything - manage all AI services (FLUX, Veo, Claude, Tavily, etc.) with a single inference.sh account. You can also bring your own API keys. - -IMPORTANT: Always use 'app list --search ' first to find the exact app ID before running. App names change frequently. - -Commands: -- app list --search : Find apps (ALWAYS DO THIS FIRST) -- app run --input '' --json: Run an app -- app get : Get app schema before running - -Verified app examples (use --search to confirm current names): -- Image: google/nano-banana, google/nano-banana-pro, google/nano-banana-2, falai/flux-dev-lora, bytedance/seedream-5-lite, falai/reve, xai/grok-imagine-image -- Video: google/veo-3-1-fast, bytedance/seedance-1-5-pro, falai/wan-2-5 -- Upscale: falai/topaz-image-upscaler -- Search: tavily/search-assistant, exa/search -- LLM: openrouter/claude-sonnet-45 - -Workflow: ALWAYS search first, then run: -1. app list --search image -2. app run falai/flux-dev-lora --input '{"prompt": "a sunset"}' --json""" - -INFSH_SCHEMA = { - "name": "infsh", - "description": INFSH_TOOL_DESCRIPTION, - "parameters": { - "type": "object", - "properties": { - "command": { - "type": "string", - "description": "The infsh command (without 'infsh' prefix). ALWAYS use 'app list --search ' first to find correct app IDs, then 'app run --input --json'" - }, - "timeout": { - "type": "integer", - "description": "Max seconds to wait (default: 300). AI tasks like video generation may take 1-2 minutes.", - "minimum": 1 - } - }, - "required": ["command"] - } -} - -INFSH_INSTALL_SCHEMA = { - "name": "infsh_install", - "description": "Install the inference.sh CLI (infsh). Downloads and installs the binary. Run this first if infsh is not available.", - "parameters": { - "type": "object", - "properties": {}, - "required": [] - } -} - - -def _handle_infsh(args, **kw): - return infsh_tool( - command=args.get("command", ""), - timeout=args.get("timeout"), - ) - - -def _handle_infsh_install(args, **kw): - return infsh_install() - - -# Register both tools under the "inference" toolset -registry.register( - name="infsh", - toolset="inference", - schema=INFSH_SCHEMA, - handler=_handle_infsh, - check_fn=check_infsh_requirements, - requires_env=[], -) - -registry.register( - name="infsh_install", - toolset="inference", - schema=INFSH_INSTALL_SCHEMA, - handler=_handle_infsh_install, - check_fn=lambda: True, # Always available - it's the installer - requires_env=[], -) diff --git a/toolsets.py b/toolsets.py index b94ea580d..1a73ff1b8 100644 --- a/toolsets.py +++ b/toolsets.py @@ -183,12 +183,6 @@ TOOLSETS = { "tools": ["execute_code"], "includes": [] }, - - "inference": { - "description": "inference.sh CLI (infsh) — run 150+ AI apps: image gen (FLUX, Reve), video (Veo, Wan), LLMs, search (Tavily, Exa), 3D, and more", - "tools": ["infsh", "infsh_install"], - "includes": [] - }, "delegation": { "description": "Spawn subagents with isolated context for complex subtasks",