Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
3e2b95e
Add AssemblyAI CLI (aai)
alexkroman-assembly Jun 3, 2026
5183955
Add CI, install script, auth-error handling, and cleanup
alexkroman-assembly Jun 3, 2026
1b99cd1
test: raise coverage to 96% (185 -> tests for real gaps)
alexkroman-assembly Jun 3, 2026
04cc49d
Tighten quality gates, add agent sample, bundle mic, polish UX
alexkroman-assembly Jun 3, 2026
df6d1d5
refactor: dedup stream/agent renderers and mic capture
alexkroman-assembly Jun 3, 2026
a76e2a7
fix: address code-review findings (auth detection, pipes, mic errors)
alexkroman-assembly Jun 3, 2026
e6e74b0
fix(claude): install skill at user scope and remove via skills CLI
alexkroman-assembly Jun 3, 2026
49db820
feat(stream): support --sample and file/URL sources
alexkroman-assembly Jun 3, 2026
7268e76
feat(audio): switch audio backend from PyAudio to sounddevice
alexkroman-assembly Jun 3, 2026
e6c24b2
ci: supply-chain hardening + branch coverage + property tests
alexkroman-assembly Jun 3, 2026
662d365
test: add real-API e2e tests (kokoro TTS) for stream + agent
alexkroman-assembly Jun 3, 2026
d68221d
feat(llm): add LLM Gateway transforms to transcribe/stream + `aai llm`
alexkroman-assembly Jun 3, 2026
ceb1ff0
feat(theme): add centralized Rich color theme module
alexkroman-assembly Jun 3, 2026
159abf1
feat(theme): theme the shared output console and error markup
alexkroman-assembly Jun 3, 2026
792c4df
feat: prompts split, transcripts grouping, YouTube, Rich renderer, du…
alexkroman-assembly Jun 3, 2026
227721d
feat(theme): themed base renderer console and styled line helpers
alexkroman-assembly Jun 3, 2026
b56be91
build: add uv lock for reproducible dependencies
alexkroman-assembly Jun 3, 2026
8b6a09e
feat(theme): color streaming notice and LLM line
alexkroman-assembly Jun 3, 2026
ad5a7ca
feat(theme): accent you:/agent: labels and mute lifecycle notices
alexkroman-assembly Jun 3, 2026
698802b
feat(stream): default streaming to u3-rt-pro speech model
alexkroman-assembly Jun 3, 2026
29199fb
feat(theme): color diarized speaker labels in transcribe output
alexkroman-assembly Jun 3, 2026
4163d9f
feat(theme): brand table header and status-colored cells in transcrip…
alexkroman-assembly Jun 3, 2026
8ddb828
test(theme): assert per-status color codes in transcripts list table
alexkroman-assembly Jun 3, 2026
a58fa07
feat(theme): semantic colors for setup steps, login, and samples notices
alexkroman-assembly Jun 3, 2026
0b224a2
test(theme): assert semantic status style tags in claude setup steps
alexkroman-assembly Jun 3, 2026
c4fd045
fix(stream,agent): show "Listening…" only once the mic is recording
alexkroman-assembly Jun 3, 2026
0da1951
feat(cli): order --help commands by workflow
alexkroman-assembly Jun 3, 2026
c5a8873
style: ruff format audio.py and test_microphone.py
alexkroman-assembly Jun 3, 2026
9b310db
feat(config): add config_builder for SDK option merge/coercion
alexkroman-assembly Jun 3, 2026
559db03
fix(config): satisfy ruff lint/format gates
alexkroman-assembly Jun 3, 2026
678c719
feat(config): add flag-normalization helpers + streaming build
alexkroman-assembly Jun 3, 2026
f90b6f4
refactor(client): accept prebuilt TranscriptionConfig/StreamingParame…
alexkroman-assembly Jun 3, 2026
cee8863
feat(render): add transcribe analysis section renderers
alexkroman-assembly Jun 3, 2026
ecc0532
chore(release): add PyPI publish-readiness gate to check.sh
alexkroman-assembly Jun 3, 2026
9d6bf46
feat(transcribe): expose full TranscriptionConfig via flags + escape …
alexkroman-assembly Jun 3, 2026
a972e3a
fix(transcribe): restore YouTube URL support and per-speaker rendering
alexkroman-assembly Jun 3, 2026
7facf08
fix(transcribe): advertise YouTube URLs in help; markup-safe text render
alexkroman-assembly Jun 3, 2026
4312bac
feat(stream): expose full StreamingParameters via flags + escape hatch
alexkroman-assembly Jun 3, 2026
d2c8809
test(stream): pin --format-turns/--no-format-turns tristate
alexkroman-assembly Jun 3, 2026
20be4df
docs: document full SDK option flags and the --config escape hatch
alexkroman-assembly Jun 3, 2026
c2267cc
test: exhaustive coercion property tests + analysis e2e
alexkroman-assembly Jun 3, 2026
815c4c5
refactor(config): split build_* into merge_* + construct_* helpers
alexkroman-assembly Jun 3, 2026
e5ef936
feat(code-gen): add config kwargs serializer with round-trip test
alexkroman-assembly Jun 3, 2026
51c5dde
feat(code-gen): add transcribe result-handling snippets + coverage guard
alexkroman-assembly Jun 3, 2026
a70d69f
fix(code-gen): bidirectional snippet coverage guard + clearer snippet…
alexkroman-assembly Jun 3, 2026
21be54c
feat(code-gen): render runnable transcribe scripts
alexkroman-assembly Jun 3, 2026
12fa4db
feat(transcribe): add --show-code to print equivalent SDK code
alexkroman-assembly Jun 3, 2026
8a7f0e7
test(transcribe): assert --json suppresses --show-code output
alexkroman-assembly Jun 3, 2026
32a07e7
feat(code-gen): render runnable microphone-streaming scripts
alexkroman-assembly Jun 3, 2026
97b16df
feat(doctor): add environment diagnostic command
alexkroman-assembly Jun 3, 2026
eb8ba53
docs: document aai doctor in the command table
alexkroman-assembly Jun 3, 2026
c639398
fix(code-gen): match mic sample_rate to params; drop unused SpeechMod…
alexkroman-assembly Jun 3, 2026
5b91959
feat(stream): add --show-code to print equivalent SDK code
alexkroman-assembly Jun 3, 2026
fdfe285
docs(stream): note always-microphone-idiom in --show-code call site
alexkroman-assembly Jun 3, 2026
99f6f4e
feat(code-gen): render runnable voice-agent scripts
alexkroman-assembly Jun 3, 2026
66a3b7f
polish(code-gen): clearer agent sample (deps header, names) + stronge…
alexkroman-assembly Jun 3, 2026
841639d
feat(agent): add --show-code to print equivalent SDK code
alexkroman-assembly Jun 3, 2026
ea9ec92
test: pin --show-code prints after Ctrl-C (the normal mic-session stop)
alexkroman-assembly Jun 3, 2026
773e791
test: --show-code is print-only (no run, no auth, --json ignored)
alexkroman-assembly Jun 4, 2026
2eaa733
style(tests): sort imports in test_config_builder (ruff I001)
alexkroman-assembly Jun 4, 2026
23c348d
fix(deps): work with current typer/pydantic/assemblyai versions
alexkroman-assembly Jun 4, 2026
8bf073a
fix(client): support pydantic-v1 transcript items in list_transcripts
alexkroman-assembly Jun 4, 2026
44b050d
ci(check): run ruff/mypy/pytest via uv run for a reproducible locked env
alexkroman-assembly Jun 4, 2026
16f824d
test(code-gen): exhaustive fuzz-compiles + round-trip + exec harness
alexkroman-assembly Jun 4, 2026
f0b0ba8
fix(show-code): emit LLM Gateway transform + single full-duplex agent…
alexkroman-assembly Jun 4, 2026
652fdf8
feat(transcribe): chain LLM Gateway prompts + distinct agent/you labe…
alexkroman-assembly Jun 4, 2026
1eef472
feat(transcribe): chain repeatable --llm-gateway-prompt; reflect in -…
alexkroman-assembly Jun 4, 2026
0f1813d
docs(readme): document --show-code (print-only, redirect, chaining) +…
alexkroman-assembly Jun 4, 2026
1b9bbbc
fix(show-code): generated agent uses 24 kHz duplex stream, drops audioop
alexkroman-assembly Jun 4, 2026
5d3b758
fix(deps): provide audioop on Python 3.13 via audioop-lts backport
alexkroman-assembly Jun 4, 2026
7880f1f
feat(llm): read piped stdin as prompt content
alexkroman-assembly Jun 4, 2026
f3fcecd
feat(transcribe): -o/--output field selector (text|id|status|utteranc…
alexkroman-assembly Jun 4, 2026
598b39b
feat(stdin): accept '-' audio on stdin for transcribe and stream
alexkroman-assembly Jun 4, 2026
9d850b9
feat(stream): -o text emits plain finalized turns (pipe into aai llm)
alexkroman-assembly Jun 4, 2026
5c6158e
feat(agent): -o text emits plain you:/agent: transcript lines (pipe i…
alexkroman-assembly Jun 4, 2026
43a2463
fix(stream): swallow BrokenPipe from the SDK reader thread on closed …
alexkroman-assembly Jun 4, 2026
b7d2fdb
fix(output): write errors to stderr, keeping stdout clean for pipelines
alexkroman-assembly Jun 4, 2026
1317562
refactor(samples): generate scaffolds via the live code_gen, drop sta…
alexkroman-assembly Jun 4, 2026
c5e3409
docs(readme): add Pipelines section (-o, stdin -, aai llm stdin, stre…
alexkroman-assembly Jun 4, 2026
dc276ae
feat(llm): --follow re-runs the prompt over a growing piped transcript
alexkroman-assembly Jun 4, 2026
58d6b91
docs(readme): samples create reads ASSEMBLYAI_API_KEY (no longer inje…
alexkroman-assembly Jun 4, 2026
9d15c51
feat(show-code): syntax-highlight for a human, raw text when piped
alexkroman-assembly Jun 4, 2026
f650e5f
feat(cli): unify pipe/stream output + robust follow-mode teardown
alexkroman-assembly Jun 4, 2026
0163b79
feat(transcribe): add -o srt output via SDK export_subtitles_srt
alexkroman-assembly Jun 4, 2026
70153e2
docs(readme): add YouTube → SRT → burn captions recipe
alexkroman-assembly Jun 4, 2026
f6c30c3
ci(check): install uv so check.sh runs; fix mypy + format
alexkroman-assembly Jun 4, 2026
069d9ff
ci: install ffmpeg + markdownlint so check.sh and tests run
alexkroman-assembly Jun 4, 2026
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
19 changes: 19 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
version: 2
updates:
# Python dependencies declared in pyproject.toml.
- package-ecosystem: pip
directory: "/"
schedule:
interval: weekly
groups:
python-deps:
patterns: ["*"]

# Keep the SHA-pinned GitHub Actions current.
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
groups:
actions:
patterns: ["*"]
96 changes: 96 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: CI

on:
pull_request:
branches: [main]
push:
branches: [main]

# Least privilege: CI only needs to read the repo. Actions are pinned to commit
# SHAs (a moved tag can't silently change what runs); Dependabot keeps them current.
permissions:
contents: read

jobs:
check:
name: lint + typecheck + tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with:
python-version: "3.12"
cache: pip

# PortAudio backs sounddevice; ffmpeg decodes non-WAV/URL audio (the `--sample`
# stream tests build a FileSource for the hosted sample, which needs ffmpeg).
- name: System deps (PortAudio + ffmpeg)
run: sudo apt-get update && sudo apt-get install -y libportaudio2 ffmpeg

# check.sh lints Markdown via the markdownlint CLI (a Node tool); pin to the
# version used locally. The runner ships Node, so a global npm install suffices.
- name: markdownlint CLI
run: npm install -g markdownlint-cli@0.45.0

# check.sh runs every tool through `uv run` / `uv build` for a locked,
# reproducible env, so uv must be on PATH (installed from PyPI to match the
# repo's pip-based, no-new-action posture).
- name: Install
run: python -m pip install -e ".[dev]" uv

- name: Lint, typecheck, test
run: ./scripts/check.sh

pre-commit:
name: pre-commit
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with:
python-version: "3.12"
cache: pip

# PortAudio backs sounddevice; ffmpeg decodes the `--sample` stream source.
- name: System deps (PortAudio + ffmpeg)
run: sudo apt-get update && sudo apt-get install -y libportaudio2 ffmpeg

# The local pytest hook runs `python -m pytest`, so the package must be importable.
- name: Install
run: python -m pip install -e ".[dev]"

- uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1

build:
name: build + twine check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with:
python-version: "3.12"
cache: pip

- name: Build wheel + sdist
run: |
python -m pip install build twine
python -m build

- name: Validate metadata
run: twine check dist/*

audit:
name: pip-audit (dependency CVEs)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with:
python-version: "3.12"
cache: pip

- name: Audit runtime dependencies for known CVEs
run: |
python -m pip install -e . pip-audit
# Append `--ignore-vuln <ID>` to accept an unfixable transitive advisory.
python -m pip_audit
21 changes: 21 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
.venv/
__pycache__/
*.pyc
*.egg-info/
dist/
build/
.pytest_cache/
.ruff_cache/
.mypy_cache/
.coverage
htmlcov/

# Editor/agent and local planning artifacts
.claude/
docs/

# Local scratch scripts (often contain live keys)
transcribe/

# Wrong tool for this project (hatchling + uv); never commit a poetry lock
poetry.lock
4 changes: 4 additions & 0 deletions .markdownlint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"default": true,
"MD013": false
}
34 changes: 34 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-toml
- id: check-merge-conflict
- id: check-added-large-files

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.11.13
hooks:
- id: ruff
args: [--fix]
- id: ruff-format

- repo: local
hooks:
- id: pytest
name: pytest
entry: python -m pytest -q -m "not e2e"
language: system
types: [python]
pass_filenames: false
always_run: true
- id: pytest-e2e
name: pytest-e2e (real API; skips without ASSEMBLYAI_API_KEY + kokoro)
entry: python -m pytest -q -m e2e
language: system
types: [python]
pass_filenames: false
always_run: true
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 AssemblyAI

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading
Loading