diff --git a/AGENTS.md b/AGENTS.md index d34085b..747dc71 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,7 +18,7 @@ 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 | @@ -26,7 +26,7 @@ Guidance for AI coding assistants working in this repository. ## 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. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e1e2f8a..a2e374d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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 diff --git a/README.md b/README.md index 1e06be7..6e2ac9c 100644 --- a/README.md +++ b/README.md @@ -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 @@ -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 @@ -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). diff --git a/SECURITY.md b/SECURITY.md index 67b71c6..6adf1ed 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -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 diff --git a/SUPPORT.md b/SUPPORT.md index 6d3d375..f685f52 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -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 diff --git a/examples/README.md b/examples/README.md index 201517f..0b53361 100644 --- a/examples/README.md +++ b/examples/README.md @@ -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 diff --git a/pyproject.toml b/pyproject.toml index 92105c9..bb8a5de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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", diff --git a/src/onepin/_cli/commands/_registry.py b/src/onepin/_cli/commands/_registry.py index 3f69b8f..81472e6 100644 --- a/src/onepin/_cli/commands/_registry.py +++ b/src/onepin/_cli/commands/_registry.py @@ -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) diff --git a/src/onepin/_cli/main.py b/src/onepin/_cli/main.py index 7599204..59f08e1 100644 --- a/src/onepin/_cli/main.py +++ b/src/onepin/_cli/main.py @@ -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", @@ -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"),