Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ Guidance for AI coding assistants working in this repository.
| `scripts/post_fern.sh` | Restores `py.typed` markers after regen | YES |
| `fern/` | Fern config (`fern.config.json`, `generators.yml`) for in-repo self-generation | YES |
| `src/onepin/.fernignore` | Paths Fern preserves on regen (`_cli/`, `_version_gate.py`, `py.typed`) | YES |
| `.github/workflows/regen.yml` | Self-generates the SDK from the OnePin API spec | YES |
| `.github/workflows/regen.yml` | Self-generates the SDK from the Onepin API spec | YES |
| `tests/` | Project tests (`unit/`, `cli/`, `build/`) | YES |
| `src/onepin/tests/` | SDK-bundled tests | NOT COLLECTED — `testpaths = ["tests"]` |
| `src/onepin/_cli/_skill/` | Bundled cross-tool agent skill (`SKILL.md` + `reference.md`), shipped as wheel data | YES |
| `pyproject.toml`, `Makefile`, `RUNBOOK.md`, `README.md` | Project docs/config | YES |

## SDK regeneration boundary

Files under `src/onepin/` (excluding `_cli/`) are generated by [Fern](https://buildwithfern.com/) from the OnePin API OpenAPI spec, which carries the SDK shaping (`x-fern-*` + `servers`). **Do not patch them locally** — the next regen will overwrite your changes.
Files under `src/onepin/` (excluding `_cli/`) are generated by [Fern](https://buildwithfern.com/) from the Onepin API OpenAPI spec, which carries the SDK shaping (`x-fern-*` + `servers`). **Do not patch them locally** — the next regen will overwrite your changes.

**If you need to change generated behavior, change the upstream OpenAPI spec.** Generation runs *in this repo*: `.github/workflows/regen.yml` fetches the shaped spec and runs `fern generate --local` (config in `fern/`), then opens a regen PR.

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Contributing to onepin

Thanks for your interest in improving the OnePin Python SDK + CLI.
Thanks for your interest in improving the Onepin Python SDK + CLI.

## What lives here

Expand Down
40 changes: 38 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,16 @@
[![CI](https://github.com/podonos/onepin-python/actions/workflows/ci.yml/badge.svg)](https://github.com/podonos/onepin-python/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

## What Onepin does

TTS turns text into speech. Onepin runs the production around it: plan the line, pick the model, generate, score, retry, ship.

- **Orchestrate** voice workflows as graphs — sources, generators, validators, destinations — from Python or the CLI.
- **Validate** every line. Word accuracy and naturalness are scored against your thresholds, with automatic retries on a miss.
- **Reach 100+ TTS models** through one definition: ElevenLabs, Cartesia, Google, Naver, and more, with no per-vendor rewrite.
- **Ship publish-ready voice.** Pull a full-run export or a single node's output straight from a run.
- **Drive it from your agent.** The bundled Agent Skill runs Onepin from Claude Code, Cursor, Codex, Gemini, and Copilot.

## Installation

```bash
Expand Down Expand Up @@ -115,9 +125,9 @@ generated from the live command tree (the same source as `onepin schema`) and ke

### skill

- `onepin skill install` — Install the OnePin agent skill (Claude Code, Cursor, Codex, Gemini, Copilot).
- `onepin skill install` — Install the Onepin agent skill (Claude Code, Cursor, Codex, Gemini, Copilot).
- `onepin skill path` — Show where the skill is or would be installed.
- `onepin skill uninstall` — Remove the installed OnePin agent skill.
- `onepin skill uninstall` — Remove the installed Onepin agent skill.

### templates

Expand Down Expand Up @@ -494,6 +504,32 @@ except ApiError as e:
- `examples/` — runnable SDK snippets
- `scripts/post_fern.sh` — restores `py.typed` markers after Fern overwrites `src/onepin/`

## FAQ

### What is Onepin?

Onepin is a voice workflow platform: the agent layer for AI voice. It plans each line, picks a TTS model, generates the audio, validates it for accuracy and naturalness, retries on a miss, and ships the result. This package is the official Python SDK and `onepin` CLI for that platform.

### How many TTS models does Onepin support?

Over 100, across providers including ElevenLabs, Cartesia, Google, and Naver. You target them through one workflow definition, so switching a model is a field change, not a rewrite.

### Does Onepin support ElevenLabs and Cartesia?

Yes. Both are first-class providers, alongside Google, Naver, and others. List what's available with `onepin voices list --provider elevenlabs` (swap in any provider).

### How is Onepin different from calling a TTS API directly?

A TTS API returns whatever it generates. Onepin gates the result. You set accuracy and naturalness thresholds, the pipeline scores each line and retries the ones that miss, and only lines that clear the bar ship — across 100+ models behind one interface instead of a separate integration per vendor.

### Do I need a Onepin account?

Yes. Mint an API key at [app.onepin.ai/settings/api-keys](https://app.onepin.ai/settings/api-keys), then run `onepin login`. See [Authentication](#authentication).

### Can my AI coding agent run Onepin?

Yes. `onepin skill install` adds an [Agent Skill](https://agentskills.io) that drives the CLI from Claude Code, Cursor, Codex, Gemini CLI, and GitHub Copilot. See [Use from your AI coding tool](#use-from-your-ai-coding-tool).

## License

MIT — see [LICENSE](LICENSE).
Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Out of scope:
- The upstream OpenAPI spec and Fern generator configuration (reported separately)
- Issues that require an already-compromised local environment (e.g., an attacker
with shell access to the user's machine)
- Denial-of-service against the OnePin API itself (report to the API team directly)
- Denial-of-service against the Onepin API itself (report to the API team directly)

## Disclosure

Expand Down
2 changes: 1 addition & 1 deletion SUPPORT.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Support

Need help with the OnePin Python SDK or CLI?
Need help with the Onepin Python SDK or CLI?

- 📖 **Docs:** https://docs.onepin.ai
- 💬 **Questions & bugs:** open an [issue](https://github.com/podonos/onepin-python/issues) using the bug-report or feature-request template
Expand Down
2 changes: 1 addition & 1 deletion examples/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Examples

Runnable snippets for the OnePin Python SDK. Each reads your API key from the
Runnable snippets for the Onepin Python SDK. Each reads your API key from the
`ONEPIN_API_KEY` environment variable.

```sh
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ build-backend = "hatchling.build"
[project]
name = "onepin"
dynamic = ["version"]
description = "Onepin Python SDK + CLI — orchestrate, validate & ship production-ready voice (TTS) audio across 100+ models"
description = "Onepin Python SDK + CLI — orchestrate, validate & ship production-ready voice audio across 100+ TTS models"
readme = "README.md"
keywords = [
"onepin", "tts", "text-to-speech", "speech-synthesis", "voice",
Expand Down
8 changes: 4 additions & 4 deletions src/onepin/_cli/commands/_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,13 @@ def register(app: typer.Typer) -> None:

app.command(name="schema", help="Emit the machine-readable JSON manifest of all commands.")(_manifest.schema)

skill_app = typer.Typer(help="Manage the OnePin agent skill for AI coding tools.", no_args_is_help=True)
skill_app = typer.Typer(help="Manage the Onepin agent skill for AI coding tools.", no_args_is_help=True)
skill_app.command(
name="install", help="Install the OnePin agent skill (Claude Code, Cursor, Codex, Gemini, Copilot)."
name="install", help="Install the Onepin agent skill (Claude Code, Cursor, Codex, Gemini, Copilot)."
)(skill.install)
skill_app.command(name="path", help="Show where the skill is or would be installed.")(skill.path)
skill_app.command(name="uninstall", help="Remove the installed OnePin agent skill.")(skill.uninstall)
app.add_typer(skill_app, name="skill", help="Manage the OnePin agent skill for AI coding tools.")
skill_app.command(name="uninstall", help="Remove the installed Onepin agent skill.")(skill.uninstall)
app.add_typer(skill_app, name="skill", help="Manage the Onepin agent skill for AI coding tools.")

# health (live/ready): hand-written so it can surface SDK/API/recommended/required versions.
health_app = typer.Typer(help=_GROUP_HELP["health"], no_args_is_help=True)
Expand Down
4 changes: 2 additions & 2 deletions src/onepin/_cli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

app = typer.Typer(
name="onepin",
help="OnePin Python SDK CLI.",
help="Onepin Python SDK CLI.",
invoke_without_command=True,
no_args_is_help=True,
rich_markup_mode="markdown",
Expand Down Expand Up @@ -89,7 +89,7 @@ def _main(
verbose: bool = typer.Option(False, "-v", "--verbose", help="Log HTTP requests/responses to stderr."),
debug: bool = typer.Option(False, "--debug", help="Enable verbose logging (implies --verbose)."),
) -> None:
"""OnePin CLI -- control workflows, voices, templates, and uploads from your terminal."""
"""Onepin CLI -- control workflows, voices, templates, and uploads from your terminal."""
_state.root_options = {
"api_key": api_key,
"api_key_source": ctx.get_parameter_source("api_key"),
Expand Down
Loading