Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add techysy/10router --skill 10router-ttsgit clone --depth 1 https://github.com/techysy/10routerWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/techysy/10router/10router-tts)<a href="https://agentmods.dev/skills/techysy/10router/10router-tts"><img src="https://agentmods.dev/badge/skills/techysy/10router/10router-tts/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/techysy/10router/10router-tts"><img src="https://agentmods.dev/badge/skills/techysy/10router/10router-tts.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00070 | $0.00976 |
| Opus 5 | $0.00035 | $0.00488 |
| Sonnet 5 | $0.00014 | $0.00195 |
| Haiku 4.5 | $0.00007 | $0.00098 |
Grade A, and why
10router-tts scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 9d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
curl $TENROUTER_URL/v1/models/tts | jq '.data[].id' This is a copy
89% identical to 9router-tts — 24 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.
How it starts
The opening of the file, as written. The whole thing — 81 lines — stays where its author put it; the contents beside it link to each section on GitHub.
10Router — Text-to-Speech
Requires TENROUTER_URL (and TENROUTER_KEY if auth enabled). See https://raw.githubusercontent.com/techysy/10router/main/skills/10router/SKILL.md for setup.
Discover
# 1) List models
curl $TENROUTER_URL/v1/models/tts | jq '.data[].id'
# 2) Per-model metadata (params, voicesUrl if voice-by-id)
curl "$TENROUTER_URL/v1/models/info?id=el/eleven_multilingual_v2"
# 3) List voices (elevenlabs, edge-tts, deepgram, inworld, local-device). Optional ?lang=vi
curl "$TENROUTER_URL/v1/audio/voices?provider=edge-tts&lang=vi" | jq '.data[].model'
model field in /v1/audio/speech = voice ID directly (e.g. edge-tts/vi-VN-HoaiMyNeural, el/<voice_id>, or openai/tts-1 model+default voice).
Endpoint
POST $TENROUTER_URL/v1/audio/speech
| Field | Required | Notes |
|---|---|---|
model |
yes | voice ID from /v1/models/tts |
input |
yes | text to speak |
Query ?response_format=mp3 (default, raw bytes) or ?response_format=json ({audio: base64, format}).
Examples
Save MP3:
curl -X POST "$TENROUTER_URL/v1/audio/speech" \
-H "Authorization: Bearer $TENROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"openai/tts-1","input":"Hello world"}' \
--output speech.mp3
JS (save file):
import { writeFile } from "node:fs/promises";
const r = await fetch(`${process.env.TENROUTER_URL}/v1/audio/speech`, {
method: "POST",
headers: { "Authorization": `Bearer ${process.env.TENROUTER_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ model: "el/eleven_multilingual_v2", input: "Xin chào" }),
});
await writeFile("speech.mp3", Buffer.from(await r.arrayBuffer()));
Response shape
Default → raw audio bytes (Content-Type audio/mp3).
?response_format=json:
{ "audio": "SUQzBAAAA...", "format": "mp3" }
Provider quirks (model format)
| Provider | model format |
Notes |
|---|---|---|
openai |
tts-1/alloy (model/voice) or just voice |
Default model gpt-4o-mini-tts |
elevenlabs |
<model_id>/<voice_id> or <voice_id> |
Default model eleven_flash_v2_5; list voices in Dashboard |
openrouter |
openai/gpt-4o-mini-tts/alloy |
Streamed via chat-completions audio modality |
edge-tts |
voice id e.g. vi-VN-HoaiMyNeural |
noAuth; default vi-VN-HoaiMyNeural |
google-tts |
language code e.g. en, vi |
noAuth |
local-device |
OS voice name (say -v ? / SAPI) |
noAuth; needs ffmpeg |
deepgram |
aura-asteria-en etc |
Token auth |
nvidia, inworld, cartesia, playht |
model/voice |
Provider-specific auth header |
coqui, tortoise |
speaker / voice id | Localhost noAuth |
hyperbolic |
model id | Body = {text} only |
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 9d ago First seen · 81 lines · 70 tokens per session scan A 0a0b43063130
10router-tts is a skill published in the GitHub repository techysy/10router (25 stars, last pushed today), licensed MIT. It adds 70 tokens to every session and 976 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). It is 89% identical to 9router-tts, differing in 24 lines, and is treated as a copy.
Other skills, from other repositories
keirouter-image
Generate images via KeiRouter /v1/images/generations using OpenAI DALL-E / Gemini Imagen / FLUX / MiniMax / Stability AI / Fal.ai models. Use when the user wants to create, generate, draw, or render an image, picture, or text-to-image (txt2img).
keirouter-stt
Speech-to-text via KeiRouter /v1/audio/transcriptions using OpenAI Whisper / Groq / Gemini / Deepgram / AssemblyAI models. Use when the user wants to transcribe audio, convert speech to text, or get subtitles from audio files.
keirouter-tts
Text-to-speech via KeiRouter /v1/audio/speech using OpenAI / ElevenLabs / Deepgram / Edge TTS / Google TTS / Inworld voices. Use when the user wants to convert text to speech, generate audio, voiceover, narrate, or read text aloud.
9router-image
Generate images via 9Router /v1/images/generations using OpenAI / Gemini Imagen / DALL-E / FLUX / MiniMax / SDWebUI / ComfyUI / Codex models. Use when the user wants to create, generate, draw, or render an image, picture, or text-to-image (txt2img).
9router-video
Generate videos via 9Router /v1/videos/generations using xAI Grok Imagine (grok-imagine-video). Async job flow - submit, poll requestid until done, download MP4. Use when the user wants to create, generate, or render a video, text-to-video (txt2vid), or image-to-video.
9router-tts
Text-to-speech via 9Router /v1/audio/speech using OpenAI / ElevenLabs / Deepgram / Edge TTS / Google TTS / Hyperbolic / Inworld voices. Use when the user wants to convert text to speech, generate audio, voiceover, narrate, or read text aloud.