agent-cli 0.104.0__tar.gz → 0.105.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/workflows/docker.yml +87 -1
- {agent_cli-0.104.0 → agent_cli-0.105.1}/PKG-INFO +1 -1
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/cli.py +12 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/backends/base.py +1 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/backends/transformers.py +73 -3
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/model_manager.py +2 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docker/docker-compose.yml +2 -2
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/server/transcribe-proxy.md +9 -5
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/server/whisper.md +4 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/installation/docker.md +1 -1
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/appcast.xml +35 -31
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_api_integration.py +38 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_server_whisper.py +3 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_transformers_backend.py +169 -2
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.claude-plugin/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.cursorrules +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.dockerignore +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.env.example +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/logo.svg +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/release-drafter.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/renovate.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/scripts/normalize_appcast.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/workflows/release.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.gitignore +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.jscpd.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.prompts/docs-review.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/.prompts/pr-review.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/CLAUDE.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/LICENSE +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/__main__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_extras.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_overrides/nemo-whisper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/nemo-whisper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/_tools.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/config.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/constants.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/process.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/cmux.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/install/common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/install/services.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/opts.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/py.typed +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/proxy/diarization.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/backends/nemo.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docker/diarization.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/CNAME +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/architecture/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/architecture/memory.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/architecture/rag.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/assistant.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/chat.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/config.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/daemon.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/dev.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/install-services.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/memory.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/server/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/speak.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/speakers.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/start-services.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/configuration.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/getting-started.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/installation/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/installation/linux.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/installation/macos-app.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/installation/macos.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/installation/nixos.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/installation/windows.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/logo-clean.svg +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/docs/system-integration.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/justfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Package.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/pyproject.toml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/reddit.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/shell.nix +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/conftest.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/core/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/core/test_audio.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/core/test_audio_levels.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/core/test_sse.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/core/test_vad.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/core/test_watch.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_project.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/install/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/install/test_extras.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_client.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_files.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_store.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/mocks/audio.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/mocks/llm.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_history.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_store.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_alignment.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_asr.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_config.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_daemon.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_diarization.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_env_vars.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_json_output.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_llm.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_macos_app.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_nemo_backend.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_normalize_appcast.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_process_manager.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_proxy_diarization.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_server_tts.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_server_tts_wyoming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_server_whisper_wyoming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_services.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_tools.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_tts.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_wake_word.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/uv.lock +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.1}/zensical.toml +0 -0
|
@@ -90,7 +90,7 @@ jobs:
|
|
|
90
90
|
cache-from: type=gha
|
|
91
91
|
cache-to: type=gha,mode=max
|
|
92
92
|
|
|
93
|
-
# Single-target images (
|
|
93
|
+
# Single-target images (proxies and diarization)
|
|
94
94
|
build-single-target:
|
|
95
95
|
runs-on: ubuntu-latest
|
|
96
96
|
permissions:
|
|
@@ -106,8 +106,16 @@ jobs:
|
|
|
106
106
|
dockerfile: docker/rag-proxy.Dockerfile
|
|
107
107
|
- image: memory-proxy
|
|
108
108
|
dockerfile: docker/memory-proxy.Dockerfile
|
|
109
|
+
- image: diarization
|
|
110
|
+
dockerfile: docker/diarization.Dockerfile
|
|
109
111
|
|
|
110
112
|
steps:
|
|
113
|
+
- name: Free disk space
|
|
114
|
+
run: |
|
|
115
|
+
sudo rm -rf /usr/share/dotnet
|
|
116
|
+
sudo rm -rf /usr/local/lib/android
|
|
117
|
+
df -h
|
|
118
|
+
|
|
111
119
|
- name: Checkout repository
|
|
112
120
|
uses: actions/checkout@v7.0.1
|
|
113
121
|
with:
|
|
@@ -153,3 +161,81 @@ jobs:
|
|
|
153
161
|
labels: ${{ steps.meta.outputs.labels }}
|
|
154
162
|
cache-from: type=gha
|
|
155
163
|
cache-to: type=gha,mode=max
|
|
164
|
+
|
|
165
|
+
smoke-diarization:
|
|
166
|
+
needs: build-single-target
|
|
167
|
+
runs-on: ubuntu-latest
|
|
168
|
+
timeout-minutes: 15
|
|
169
|
+
permissions:
|
|
170
|
+
contents: read
|
|
171
|
+
packages: read
|
|
172
|
+
|
|
173
|
+
steps:
|
|
174
|
+
- name: Free disk space
|
|
175
|
+
run: |
|
|
176
|
+
sudo rm -rf /usr/share/dotnet
|
|
177
|
+
sudo rm -rf /usr/local/lib/android
|
|
178
|
+
df -h
|
|
179
|
+
|
|
180
|
+
- name: Log in to Container Registry
|
|
181
|
+
uses: docker/login-action@v4.5.1
|
|
182
|
+
with:
|
|
183
|
+
registry: ${{ env.REGISTRY }}
|
|
184
|
+
username: ${{ github.actor }}
|
|
185
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
186
|
+
|
|
187
|
+
- name: Resolve image reference
|
|
188
|
+
id: image
|
|
189
|
+
run: |
|
|
190
|
+
tag="sha-${GITHUB_SHA::7}"
|
|
191
|
+
echo "ref=${REGISTRY}/${GITHUB_REPOSITORY}-diarization:${tag}" >> "$GITHUB_OUTPUT"
|
|
192
|
+
|
|
193
|
+
- name: Pull published image
|
|
194
|
+
run: docker pull "${{ steps.image.outputs.ref }}"
|
|
195
|
+
|
|
196
|
+
- name: Verify package version
|
|
197
|
+
env:
|
|
198
|
+
IMAGE_REF: ${{ steps.image.outputs.ref }}
|
|
199
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
200
|
+
run: |
|
|
201
|
+
actual_version=$(
|
|
202
|
+
docker run --rm --entrypoint /app/.venv/bin/python "$IMAGE_REF" \
|
|
203
|
+
-c 'import importlib.metadata; print(importlib.metadata.version("agent-cli"))'
|
|
204
|
+
)
|
|
205
|
+
if [[ "$GITHUB_EVENT_NAME" == "release" ]]; then
|
|
206
|
+
expected_version="${RELEASE_TAG#v}"
|
|
207
|
+
if [[ "${actual_version%%+*}" != "$expected_version" ]]; then
|
|
208
|
+
echo "Expected agent-cli $expected_version, got $actual_version" >&2
|
|
209
|
+
exit 1
|
|
210
|
+
fi
|
|
211
|
+
fi
|
|
212
|
+
echo "Verified agent-cli $actual_version"
|
|
213
|
+
|
|
214
|
+
- name: Verify health and API routes
|
|
215
|
+
env:
|
|
216
|
+
IMAGE_REF: ${{ steps.image.outputs.ref }}
|
|
217
|
+
run: |
|
|
218
|
+
container_id=$(docker run --detach --publish 61337:61337 "$IMAGE_REF")
|
|
219
|
+
trap 'docker rm --force "$container_id" >/dev/null 2>&1 || true' EXIT
|
|
220
|
+
|
|
221
|
+
ready=false
|
|
222
|
+
for _ in {1..30}; do
|
|
223
|
+
if curl --fail --silent --connect-timeout 1 --max-time 2 \
|
|
224
|
+
http://localhost:61337/health | jq --exit-status '.status == "healthy"' >/dev/null; then
|
|
225
|
+
ready=true
|
|
226
|
+
break
|
|
227
|
+
fi
|
|
228
|
+
sleep 2
|
|
229
|
+
done
|
|
230
|
+
if [[ "$ready" != "true" ]]; then
|
|
231
|
+
docker logs "$container_id"
|
|
232
|
+
exit 1
|
|
233
|
+
fi
|
|
234
|
+
|
|
235
|
+
if ! curl --fail --silent --show-error --connect-timeout 1 --max-time 2 \
|
|
236
|
+
http://localhost:61337/openapi.json | jq --exit-status \
|
|
237
|
+
'.paths["/health"].get and .paths["/transcribe"].post and .paths["/diarize"].post' \
|
|
238
|
+
>/dev/null; then
|
|
239
|
+
docker logs "$container_id"
|
|
240
|
+
exit 1
|
|
241
|
+
fi
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.105.1
|
|
4
4
|
Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
|
|
5
5
|
Project-URL: Homepage, https://github.com/basnijholt/agent-cli
|
|
6
6
|
Author-email: Bas Nijholt <bas@nijho.lt>
|
|
@@ -403,6 +403,17 @@ def whisper_cmd( # noqa: C901, PLR0912, PLR0915
|
|
|
403
403
|
),
|
|
404
404
|
),
|
|
405
405
|
] = False,
|
|
406
|
+
max_new_tokens: Annotated[
|
|
407
|
+
int,
|
|
408
|
+
typer.Option(
|
|
409
|
+
"--max-new-tokens",
|
|
410
|
+
min=1,
|
|
411
|
+
help=(
|
|
412
|
+
"Maximum output tokens for autoregressive transformers ASR models. "
|
|
413
|
+
"Increase for unusually long audio"
|
|
414
|
+
),
|
|
415
|
+
),
|
|
416
|
+
] = 4096,
|
|
406
417
|
ttl: Annotated[
|
|
407
418
|
int,
|
|
408
419
|
typer.Option(
|
|
@@ -602,6 +613,7 @@ def whisper_cmd( # noqa: C901, PLR0912, PLR0915
|
|
|
602
613
|
compute_type=compute_type,
|
|
603
614
|
default_language=default_language,
|
|
604
615
|
trust_remote_code=trust_remote_code,
|
|
616
|
+
max_new_tokens=max_new_tokens,
|
|
605
617
|
ttl_seconds=ttl,
|
|
606
618
|
cache_dir=cache_dir,
|
|
607
619
|
backend_type=resolved_backend, # type: ignore[arg-type]
|
|
@@ -6,6 +6,7 @@ import asyncio
|
|
|
6
6
|
import logging
|
|
7
7
|
import tempfile
|
|
8
8
|
import time
|
|
9
|
+
import traceback
|
|
9
10
|
import wave
|
|
10
11
|
from concurrent.futures import ProcessPoolExecutor
|
|
11
12
|
from dataclasses import dataclass
|
|
@@ -47,6 +48,10 @@ _MODEL_MAP: dict[str, str] = {
|
|
|
47
48
|
_REMOTE_CODE_MODEL_PREFIXES = ("CohereLabs/cohere-transcribe",)
|
|
48
49
|
|
|
49
50
|
|
|
51
|
+
class TranscriptionTruncatedError(RuntimeError):
|
|
52
|
+
"""Raised when an autoregressive ASR model exhausts its output budget."""
|
|
53
|
+
|
|
54
|
+
|
|
50
55
|
def _resolve_model_name(model_name: str) -> str:
|
|
51
56
|
"""Resolve a model name to a HuggingFace repo."""
|
|
52
57
|
if "/" in model_name:
|
|
@@ -220,6 +225,22 @@ def _move_inputs_to_device(inputs: Any) -> Any:
|
|
|
220
225
|
return {k: v.to(_state.device) if hasattr(v, "to") else v for k, v in inputs.items()}
|
|
221
226
|
|
|
222
227
|
|
|
228
|
+
def _qwen_generation_was_truncated(generated_ids: Any, max_new_tokens: int) -> bool:
|
|
229
|
+
"""Return whether Qwen exhausted its token budget without emitting EOS."""
|
|
230
|
+
if generated_ids.shape[1] < max_new_tokens:
|
|
231
|
+
return False
|
|
232
|
+
|
|
233
|
+
generation_config = getattr(_state.model, "generation_config", None)
|
|
234
|
+
eos_token_ids = getattr(generation_config, "eos_token_id", None)
|
|
235
|
+
if eos_token_ids is None:
|
|
236
|
+
return True
|
|
237
|
+
if isinstance(eos_token_ids, int):
|
|
238
|
+
eos_token_ids = [eos_token_ids]
|
|
239
|
+
|
|
240
|
+
last_token_id = generated_ids[:, -1:].tolist()[0][0]
|
|
241
|
+
return last_token_id not in eos_token_ids
|
|
242
|
+
|
|
243
|
+
|
|
223
244
|
def _transcribe_cohere_asr(
|
|
224
245
|
*,
|
|
225
246
|
audio_array: Any,
|
|
@@ -276,6 +297,7 @@ def _transcribe_qwen3_asr(
|
|
|
276
297
|
task: str,
|
|
277
298
|
initial_prompt: str | None,
|
|
278
299
|
duration: float,
|
|
300
|
+
max_new_tokens: int,
|
|
279
301
|
) -> dict[str, Any]:
|
|
280
302
|
"""Transcribe with Qwen3-ASR's native transformers interface."""
|
|
281
303
|
if task != "transcribe":
|
|
@@ -294,11 +316,19 @@ def _transcribe_qwen3_asr(
|
|
|
294
316
|
with torch.inference_mode():
|
|
295
317
|
output_ids = _state.model.generate(
|
|
296
318
|
**inputs,
|
|
297
|
-
max_new_tokens=
|
|
319
|
+
max_new_tokens=max_new_tokens,
|
|
298
320
|
do_sample=False,
|
|
299
321
|
)
|
|
300
322
|
|
|
301
323
|
generated_ids = output_ids[:, inputs["input_ids"].shape[1] :]
|
|
324
|
+
if _qwen_generation_was_truncated(generated_ids, max_new_tokens):
|
|
325
|
+
msg = (
|
|
326
|
+
"Qwen3-ASR transcription reached "
|
|
327
|
+
f"max_new_tokens={max_new_tokens} before completion. "
|
|
328
|
+
"Restart the server with a higher --max-new-tokens value "
|
|
329
|
+
"or split the audio into shorter chunks."
|
|
330
|
+
)
|
|
331
|
+
raise TranscriptionTruncatedError(msg)
|
|
302
332
|
parsed = _state.processor.decode(generated_ids, return_format="parsed")[0]
|
|
303
333
|
language = parsed["language"] or effective_language or "unknown"
|
|
304
334
|
|
|
@@ -399,8 +429,8 @@ def _transcribe_with_generate(
|
|
|
399
429
|
)
|
|
400
430
|
|
|
401
431
|
|
|
402
|
-
def
|
|
403
|
-
"""
|
|
432
|
+
def _transcribe_with_loaded_model(kwargs: dict[str, Any]) -> dict[str, Any]:
|
|
433
|
+
"""Dispatch transcription using the model retained in this worker."""
|
|
404
434
|
if _state.model is None or _state.processor is None:
|
|
405
435
|
msg = "Model not loaded in subprocess. Call _load_model_in_subprocess first."
|
|
406
436
|
raise RuntimeError(msg)
|
|
@@ -416,6 +446,7 @@ def _transcribe_in_subprocess(kwargs: dict[str, Any]) -> dict[str, Any]:
|
|
|
416
446
|
task=task,
|
|
417
447
|
initial_prompt=kwargs.get("initial_prompt"),
|
|
418
448
|
duration=_read_wav_duration(wav_path),
|
|
449
|
+
max_new_tokens=kwargs.get("max_new_tokens", 4096),
|
|
419
450
|
)
|
|
420
451
|
|
|
421
452
|
audio_array, sample_rate, duration = _read_wav_audio(wav_path)
|
|
@@ -449,6 +480,44 @@ def _transcribe_in_subprocess(kwargs: dict[str, Any]) -> dict[str, Any]:
|
|
|
449
480
|
)
|
|
450
481
|
|
|
451
482
|
|
|
483
|
+
def _clear_exception_frames(exc: BaseException) -> None:
|
|
484
|
+
"""Release helper locals retained by an exception and its chained failures."""
|
|
485
|
+
pending = [exc]
|
|
486
|
+
seen: set[int] = set()
|
|
487
|
+
while pending:
|
|
488
|
+
current = pending.pop()
|
|
489
|
+
if id(current) in seen:
|
|
490
|
+
continue
|
|
491
|
+
seen.add(id(current))
|
|
492
|
+
traceback.clear_frames(current.__traceback__)
|
|
493
|
+
pending.extend(
|
|
494
|
+
error for error in (current.__cause__, current.__context__) if error is not None
|
|
495
|
+
)
|
|
496
|
+
if isinstance(current, BaseExceptionGroup):
|
|
497
|
+
pending.extend(current.exceptions)
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
def _transcribe_in_subprocess(kwargs: dict[str, Any]) -> dict[str, Any]:
|
|
501
|
+
"""Transcribe and return unused CUDA memory while keeping model weights loaded."""
|
|
502
|
+
if not _state.device or not _state.device.startswith("cuda"):
|
|
503
|
+
return _transcribe_with_loaded_model(kwargs)
|
|
504
|
+
|
|
505
|
+
import torch # noqa: PLC0415
|
|
506
|
+
|
|
507
|
+
try:
|
|
508
|
+
return _transcribe_with_loaded_model(kwargs)
|
|
509
|
+
except BaseException as exc:
|
|
510
|
+
# Failed helper frames otherwise keep temporary tensors live until the
|
|
511
|
+
# executor serializes the exception, which happens after our finally.
|
|
512
|
+
# Clear locals without losing the traceback's function names and lines.
|
|
513
|
+
_clear_exception_frames(exc)
|
|
514
|
+
raise
|
|
515
|
+
finally:
|
|
516
|
+
# Helper frames have returned, so their temporary tensors are now free.
|
|
517
|
+
# Only unused allocator blocks are released; model weights stay resident.
|
|
518
|
+
torch.cuda.empty_cache()
|
|
519
|
+
|
|
520
|
+
|
|
452
521
|
class TransformersWhisperBackend:
|
|
453
522
|
"""ASR backend using HuggingFace transformers.
|
|
454
523
|
|
|
@@ -548,6 +617,7 @@ class TransformersWhisperBackend:
|
|
|
548
617
|
"default_language": self._config.default_language,
|
|
549
618
|
"task": task,
|
|
550
619
|
"initial_prompt": initial_prompt,
|
|
620
|
+
"max_new_tokens": self._config.max_new_tokens,
|
|
551
621
|
}
|
|
552
622
|
|
|
553
623
|
try:
|
|
@@ -30,6 +30,7 @@ class WhisperModelConfig(ModelConfig):
|
|
|
30
30
|
backend_type: BackendType = "auto"
|
|
31
31
|
default_language: str | None = None
|
|
32
32
|
trust_remote_code: bool = False
|
|
33
|
+
max_new_tokens: int = 4096
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
class WhisperModelManager:
|
|
@@ -50,6 +51,7 @@ class WhisperModelManager:
|
|
|
50
51
|
cache_dir=config.cache_dir,
|
|
51
52
|
default_language=config.default_language,
|
|
52
53
|
trust_remote_code=config.trust_remote_code,
|
|
54
|
+
max_new_tokens=config.max_new_tokens,
|
|
53
55
|
),
|
|
54
56
|
backend_type=config.backend_type,
|
|
55
57
|
)
|
|
@@ -240,10 +240,10 @@ services:
|
|
|
240
240
|
restart: unless-stopped
|
|
241
241
|
|
|
242
242
|
# Optional transcription proxy with local diarization. Start explicitly with:
|
|
243
|
-
# docker compose -f docker/docker-compose.yml up
|
|
243
|
+
# docker compose -f docker/docker-compose.yml up diarization
|
|
244
244
|
# Shares port 61337 with transcribe-proxy; run one of them at a time.
|
|
245
245
|
diarization:
|
|
246
|
-
image: agent-cli-diarization
|
|
246
|
+
image: ghcr.io/basnijholt/agent-cli-diarization:latest
|
|
247
247
|
build:
|
|
248
248
|
context: ..
|
|
249
249
|
dockerfile: docker/diarization.Dockerfile
|
|
@@ -211,15 +211,13 @@ docker compose -f docker/docker-compose.yml --profile cpu up transcribe-proxy
|
|
|
211
211
|
|
|
212
212
|
### Docker with diarization
|
|
213
213
|
|
|
214
|
-
|
|
214
|
+
Run the published image, which includes pyannote, PyTorch, and FFmpeg:
|
|
215
215
|
|
|
216
216
|
```bash
|
|
217
|
-
docker build -f docker/diarization.Dockerfile -t agent-cli-diarization .
|
|
218
|
-
|
|
219
217
|
docker run --rm -p 61337:61337 \
|
|
220
218
|
-e HF_TOKEN \
|
|
221
219
|
-v agent-cli-diarization-cache:/home/transcribe/.cache \
|
|
222
|
-
agent-cli-diarization
|
|
220
|
+
ghcr.io/basnijholt/agent-cli-diarization:latest
|
|
223
221
|
```
|
|
224
222
|
|
|
225
223
|
This runs `/diarize` on CPU. For NVIDIA GPU inference, add `--gpus all -e DIARIZATION_DEVICE=cuda` to `docker run`. For `/transcribe`, also provide your ASR environment variables, for example `-e ASR_PROVIDER=openai -e ASR_OPENAI_BASE_URL=http://your-whisper-host:10301/v1 -e OPENAI_API_KEY=dummy`.
|
|
@@ -228,11 +226,17 @@ The optional Compose service can run beside the existing Whisper server:
|
|
|
228
226
|
|
|
229
227
|
```bash
|
|
230
228
|
# HF_TOKEN must be exported in the shell or set in docker/.env.
|
|
231
|
-
docker compose -f docker/docker-compose.yml --profile cpu up
|
|
229
|
+
docker compose -f docker/docker-compose.yml --profile cpu up whisper-cpu diarization
|
|
232
230
|
```
|
|
233
231
|
|
|
234
232
|
Use `diarization` in place of `transcribe-proxy`, since both default to port 61337. Set `DIARIZATION_PORT` to use a different host port. The model cache persists in `agent-cli-diarization-cache`. GPU instructions are included beside the service in the Compose file.
|
|
235
233
|
|
|
234
|
+
To build from source instead, add `--build` to the Compose command or run:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
docker build -f docker/diarization.Dockerfile -t agent-cli-diarization .
|
|
238
|
+
```
|
|
239
|
+
|
|
236
240
|
### Environment Variables
|
|
237
241
|
|
|
238
242
|
Configure the proxy using environment variables (priority: env var > config file > default):
|
|
@@ -55,6 +55,7 @@ Run a local ASR server with automatic backend selection based on your platform:
|
|
|
55
55
|
- **OpenAI-compatible API** at `/v1/audio/transcriptions` - drop-in replacement for OpenAI's Whisper API
|
|
56
56
|
- **Wyoming protocol** for [Home Assistant](https://www.home-assistant.io/) voice integration (Wyoming is the standard protocol for local voice services)
|
|
57
57
|
- **TTL-based memory management** - models unload after idle period, freeing RAM/VRAM
|
|
58
|
+
- **CUDA cache cleanup** - the transformers backend releases unused GPU cache after each transcription while keeping model weights loaded
|
|
58
59
|
- **Multiple models** - run different model sizes with independent TTLs
|
|
59
60
|
- **Background preloading** - downloads start at startup without blocking; use `--preload` to wait
|
|
60
61
|
- **Multi-platform support** - automatically uses the optimal backend for your hardware (`auto` switches to `nemo` for Parakeet models)
|
|
@@ -130,6 +131,7 @@ agent-cli server whisper \
|
|
|
130
131
|
| `--cache-dir` | - | Custom directory for downloaded models (default: HuggingFace cache) |
|
|
131
132
|
| `--default-language` | - | Fallback language code for requests that omit `language`. Required for models that do not support language auto-detection (for example Cohere Transcribe). |
|
|
132
133
|
| `--trust-remote-code` | `false` | Allow Hugging Face model repositories to execute custom Python code. Known supported remote-code ASR models are trusted automatically. |
|
|
134
|
+
| `--max-new-tokens` | `4096` | Maximum output tokens for autoregressive transformers ASR models. Increase for unusually long audio |
|
|
133
135
|
| `--ttl` | `300` | Seconds of inactivity before unloading model from memory. Set to 0 to keep loaded indefinitely |
|
|
134
136
|
| `--preload` | `false` | Load model(s) immediately at startup instead of on first request. Useful for reducing first-request latency |
|
|
135
137
|
| `--host` | `0.0.0.0` | Network interface to bind. Use `0.0.0.0` for all interfaces |
|
|
@@ -311,6 +313,8 @@ agent-cli server whisper \
|
|
|
311
313
|
|
|
312
314
|
Qwen3-ASR supports transcription, automatic language detection, and context or hotwords through the OpenAI-compatible `prompt` field. Translation and timestamped subtitle output are not currently supported.
|
|
313
315
|
|
|
316
|
+
The default output budget is 4096 tokens, which accommodates long recordings. For unusually long or dense speech, increase it with `--max-new-tokens`. If Qwen3-ASR exhausts the configured budget, the request fails with a clear error instead of returning a silently truncated transcript.
|
|
317
|
+
|
|
314
318
|
To install it as the standard `whisper` background daemon:
|
|
315
319
|
|
|
316
320
|
```bash
|
|
@@ -59,7 +59,7 @@ The Docker setup provides:
|
|
|
59
59
|
| ----------------------- | --------------------------------- | ----------- | ------------------------------ |
|
|
60
60
|
| **whisper** | agent-cli-whisper (custom) | 10300/10301 | Speech-to-text (Faster Whisper)|
|
|
61
61
|
| **tts** | agent-cli-tts (custom) | 10200/10201 | Text-to-speech (Kokoro/Piper) |
|
|
62
|
-
| **diarization** | agent-cli-diarization
|
|
62
|
+
| **diarization** | agent-cli-diarization | 61337 | Speaker timing and labeled transcripts (optional) |
|
|
63
63
|
| **transcribe-proxy** | agent-cli-transcribe-proxy | 61337 | ASR proxy for iOS/external apps|
|
|
64
64
|
| **rag-proxy** | agent-cli-rag-proxy | 8000 | Document-aware chat (RAG) |
|
|
65
65
|
| **memory-proxy** | agent-cli-memory-proxy | 8100 | Long-term memory chat |
|
|
@@ -4,6 +4,41 @@
|
|
|
4
4
|
<title>Agent CLI Updates</title>
|
|
5
5
|
<link>https://github.com/basnijholt/agent-cli</link>
|
|
6
6
|
<description>Signed Agent CLI macOS app updates.</description>
|
|
7
|
+
<item>
|
|
8
|
+
<title>0.105.0</title>
|
|
9
|
+
<pubDate>Tue, 08 Sep 2026 10:29:52 +0000</pubDate>
|
|
10
|
+
<link>https://github.com/basnijholt/agent-cli</link>
|
|
11
|
+
<sparkle:version>204</sparkle:version>
|
|
12
|
+
<sparkle:shortVersionString>0.105.0</sparkle:shortVersionString>
|
|
13
|
+
<sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
|
|
14
|
+
<sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
|
|
15
|
+
<description sparkle:format="markdown"><![CDATA[## What’s Changed
|
|
16
|
+
|
|
17
|
+
* Prevent Qwen long-audio truncation (#641) @basnijholt
|
|
18
|
+
* Publish diarization Docker image (#640) @basnijholt
|
|
19
|
+
|
|
20
|
+
]]></description>
|
|
21
|
+
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.105.0/AgentCLI.zip" length="18454913" type="application/octet-stream" sparkle:edSignature="Z3253GuNAV6GC2V4Qib0Bm7m8bSdlWHPiXeHIZNa06qAJaY+qRXzrSPRyT8iZW5GnkZOJHciIbqvkkoJ9/DoCw=="/>
|
|
22
|
+
</item>
|
|
23
|
+
<item>
|
|
24
|
+
<title>0.104.0</title>
|
|
25
|
+
<pubDate>Mon, 07 Sep 2026 21:38:19 +0000</pubDate>
|
|
26
|
+
<link>https://github.com/basnijholt/agent-cli</link>
|
|
27
|
+
<sparkle:version>203</sparkle:version>
|
|
28
|
+
<sparkle:shortVersionString>0.104.0</sparkle:shortVersionString>
|
|
29
|
+
<sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
|
|
30
|
+
<sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
|
|
31
|
+
<description sparkle:format="markdown"><![CDATA[## What’s Changed
|
|
32
|
+
|
|
33
|
+
* Add speaker diarization API and Docker image (#639) @basnijholt
|
|
34
|
+
* Fix Docker image publishing and runtime extras (#638) @basnijholt
|
|
35
|
+
* ⬆️ Update actions/deploy-pages action to v5.0.1 (#637) [@renovate[bot]](https://github.com/apps/renovate)
|
|
36
|
+
* ⬆️ Update docker/setup-buildx-action action to v4.3.0 (#635) [@renovate[bot]](https://github.com/apps/renovate)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
]]></description>
|
|
40
|
+
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.104.0/AgentCLI.zip" length="18454336" type="application/octet-stream" sparkle:edSignature="p7BVeR6YS/LBGO61o0xR8GE9beHf+4uaz0c28HrHX4oyWjVZSBgwI6jIjR2Mn23HNLS65CfECbp2NSJoIc+ABw=="/>
|
|
41
|
+
</item>
|
|
7
42
|
<item>
|
|
8
43
|
<title>0.103.0</title>
|
|
9
44
|
<pubDate>Tue, 01 Sep 2026 19:34:50 +0000</pubDate>
|
|
@@ -174,36 +209,5 @@
|
|
|
174
209
|
]]></description>
|
|
175
210
|
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.100.0/AgentCLI.zip" length="22908645" type="application/octet-stream" sparkle:edSignature="2xn/3yQOqyqwCQ5871EAgFra/D/z6UrDl1B+ZxUh7PnOxJpL4Oe44UzQgjFB+LJXzqrY6Kmqvu9GBmk+3aZ1Ag=="/>
|
|
176
211
|
</item>
|
|
177
|
-
<item>
|
|
178
|
-
<title>0.99.0</title>
|
|
179
|
-
<pubDate>Fri, 05 Jun 2026 22:57:28 +0000</pubDate>
|
|
180
|
-
<link>https://github.com/basnijholt/agent-cli</link>
|
|
181
|
-
<sparkle:version>194</sparkle:version>
|
|
182
|
-
<sparkle:shortVersionString>0.99.0</sparkle:shortVersionString>
|
|
183
|
-
<sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
|
|
184
|
-
<sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
|
|
185
|
-
<description sparkle:format="markdown"><![CDATA[## What’s Changed
|
|
186
|
-
|
|
187
|
-
* Add live transcription preview (#571) @basnijholt
|
|
188
|
-
|
|
189
|
-
]]></description>
|
|
190
|
-
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.99.0/AgentCLI.zip" length="22924494" type="application/octet-stream" sparkle:edSignature="COI8nqDd0cBtOO9jw/QRmsucsxE0SPiSgNF/o+s/nv3FCjSXy0C+gZX/bIFtCYyz/DYkff+IaHaLzhw8Z5aEBQ=="/>
|
|
191
|
-
</item>
|
|
192
|
-
<item>
|
|
193
|
-
<title>0.98.5</title>
|
|
194
|
-
<pubDate>Fri, 05 Jun 2026 20:33:00 +0000</pubDate>
|
|
195
|
-
<link>https://github.com/basnijholt/agent-cli</link>
|
|
196
|
-
<sparkle:version>193</sparkle:version>
|
|
197
|
-
<sparkle:shortVersionString>0.98.5</sparkle:shortVersionString>
|
|
198
|
-
<sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
|
|
199
|
-
<sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
|
|
200
|
-
<description sparkle:format="markdown"><![CDATA[## What’s Changed
|
|
201
|
-
|
|
202
|
-
* Fix macOS F1 shortcut recorder crash (#584) @basnijholt
|
|
203
|
-
* Retry Fn hotkeys after Accessibility approval (#583) @basnijholt
|
|
204
|
-
|
|
205
|
-
]]></description>
|
|
206
|
-
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.98.5/AgentCLI.zip" length="22904207" type="application/octet-stream" sparkle:edSignature="ZUCHwTaFNGvFW3w/cq1Wf5OzB0e/1mjUQjCksmNaDJy9muTY1r5dRcDuIk15hp7iB4ELNAUUDqqa+PMi/tyiAA=="/>
|
|
207
|
-
</item>
|
|
208
212
|
</channel>
|
|
209
213
|
</rss>
|
|
@@ -129,9 +129,47 @@ def test_server_whisper_command_in_cli() -> None:
|
|
|
129
129
|
assert "--model" in clean_output
|
|
130
130
|
assert "--ttl" in clean_output
|
|
131
131
|
assert "--wyoming-port" in clean_output
|
|
132
|
+
assert "--max-new-tokens" in clean_output
|
|
132
133
|
assert "nemo" in clean_output
|
|
133
134
|
|
|
134
135
|
|
|
136
|
+
@patch("uvicorn.run")
|
|
137
|
+
def test_server_whisper_propagates_max_new_tokens(mock_uvicorn_run: MagicMock) -> None:
|
|
138
|
+
"""Whisper server should propagate the generation limit to model config."""
|
|
139
|
+
runner = CliRunner()
|
|
140
|
+
registry = MagicMock()
|
|
141
|
+
registry.default_model = "Qwen/Qwen3-ASR-1.7B-hf"
|
|
142
|
+
|
|
143
|
+
with (
|
|
144
|
+
patch("agent_cli.core.deps._check_and_install_extras", return_value=[]),
|
|
145
|
+
patch("agent_cli.server.cli._check_whisper_deps"),
|
|
146
|
+
patch("agent_cli.server.cli._check_transformers_audio_model_deps"),
|
|
147
|
+
patch(
|
|
148
|
+
"agent_cli.server.whisper.model_registry.create_whisper_registry",
|
|
149
|
+
return_value=registry,
|
|
150
|
+
),
|
|
151
|
+
):
|
|
152
|
+
result = runner.invoke(
|
|
153
|
+
cli_app,
|
|
154
|
+
[
|
|
155
|
+
"server",
|
|
156
|
+
"whisper",
|
|
157
|
+
"--model",
|
|
158
|
+
"Qwen/Qwen3-ASR-1.7B-hf",
|
|
159
|
+
"--backend",
|
|
160
|
+
"transformers",
|
|
161
|
+
"--no-wyoming",
|
|
162
|
+
"--max-new-tokens",
|
|
163
|
+
"2048",
|
|
164
|
+
],
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
assert result.exit_code == 0
|
|
168
|
+
registered_config = registry.register.call_args.args[0]
|
|
169
|
+
assert registered_config.max_new_tokens == 2048
|
|
170
|
+
mock_uvicorn_run.assert_called_once()
|
|
171
|
+
|
|
172
|
+
|
|
135
173
|
@patch("uvicorn.run")
|
|
136
174
|
def test_server_whisper_accepts_asr_wyoming_port_alias(mock_uvicorn_run: MagicMock) -> None:
|
|
137
175
|
"""Whisper server should accept the client-style ASR Wyoming port alias."""
|
|
@@ -52,6 +52,7 @@ class TestModelConfig:
|
|
|
52
52
|
assert config.backend_type == "auto"
|
|
53
53
|
assert config.default_language is None
|
|
54
54
|
assert config.trust_remote_code is False
|
|
55
|
+
assert config.max_new_tokens == 4096
|
|
55
56
|
|
|
56
57
|
def test_custom_values(self) -> None:
|
|
57
58
|
"""Test custom configuration values."""
|
|
@@ -64,6 +65,7 @@ class TestModelConfig:
|
|
|
64
65
|
cpu_threads=8,
|
|
65
66
|
default_language="en",
|
|
66
67
|
trust_remote_code=True,
|
|
68
|
+
max_new_tokens=2048,
|
|
67
69
|
)
|
|
68
70
|
assert config.model_name == "small"
|
|
69
71
|
assert config.device == "cuda:0"
|
|
@@ -73,6 +75,7 @@ class TestModelConfig:
|
|
|
73
75
|
assert config.cpu_threads == 8
|
|
74
76
|
assert config.default_language == "en"
|
|
75
77
|
assert config.trust_remote_code is True
|
|
78
|
+
assert config.max_new_tokens == 2048
|
|
76
79
|
|
|
77
80
|
def test_zero_ttl_disables_auto_unload(self) -> None:
|
|
78
81
|
"""TTL 0 should be accepted as keep-loaded mode."""
|