agent-cli 0.70.4__tar.gz → 0.70.5__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.70.4 → agent_cli-0.70.5}/PKG-INFO +3 -1
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_extras.json +2 -1
- agent_cli-0.70.5/agent_cli/_requirements/wyoming.txt +71 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/cli.py +1 -1
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/proxy/api.py +12 -1
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/services/__init__.py +46 -5
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docker/transcribe-proxy.Dockerfile +1 -1
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docker/tts.Dockerfile +2 -2
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docker/whisper.Dockerfile +1 -1
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/install-extras.md +2 -1
- {agent_cli-0.70.4 → agent_cli-0.70.5}/pyproject.toml +2 -1
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_api_integration.py +2 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/uv.lock +5 -1
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.claude-plugin/README.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.cursorrules +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.dockerignore +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.env.example +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/logo.svg +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/release-drafter.yml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/renovate.json +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/workflows/release.yml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.gitignore +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.jscpd.json +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.prompts/docs-review.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/.prompts/pr-review.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/CLAUDE.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/LICENSE +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/README.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/__main__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/_tools.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/transcribe_daemon.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/api.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/cli.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/config.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/constants.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/process.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/install/common.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/install/services.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/opts.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/py.typed +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/run-piper-windows.ps1 +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/run-piper.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/run-whisper-linux.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/run-whisper-macos.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/run-whisper-windows.ps1 +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/run-whisper.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/run_faster_whisper_server.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/scripts/sync_extras.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/common.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docker/docker-compose.yml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/CNAME +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/architecture/index.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/architecture/memory.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/architecture/rag.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/assistant.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/chat.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/config.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/dev.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/index.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/install-services.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/memory.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/server/index.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/speak.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/start-services.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/transcribe-daemon.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/configuration.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/getting-started.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/index.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/installation/docker.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/installation/index.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/installation/linux.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/installation/macos.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/installation/nixos.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/installation/windows.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/logo-clean.svg +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/docs/system-integration.md +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/justfile +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/shell.nix +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_transcribe_daemon.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/conftest.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/core/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/core/test_sse.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/core/test_vad.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/core/test_watch.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/dev/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/dev/test_project.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/install/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/install/test_extras.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_client.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_files.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_store.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/mocks/audio.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/mocks/llm.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/__init__.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_api.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_history.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_store.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_api.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_asr.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_cli.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_config.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_env_vars.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_json_output.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_llm.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_process_manager.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_server_tts.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_services.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_tools.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_tts.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_utils.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_wake_word.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.70.4 → agent_cli-0.70.5}/zensical.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.70.
|
|
3
|
+
Version: 0.70.5
|
|
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>
|
|
@@ -80,6 +80,8 @@ Requires-Dist: pytest-timeout; extra == 'test'
|
|
|
80
80
|
Requires-Dist: pytest>=7.0.0; extra == 'test'
|
|
81
81
|
Provides-Extra: vad
|
|
82
82
|
Requires-Dist: silero-vad>=5.1; extra == 'vad'
|
|
83
|
+
Provides-Extra: wyoming
|
|
84
|
+
Requires-Dist: wyoming>=1.5.2; extra == 'wyoming'
|
|
83
85
|
Description-Content-Type: text/markdown
|
|
84
86
|
|
|
85
87
|
# Agent CLI
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"wyoming": ["Wyoming protocol for ASR/TTS servers", ["wyoming"]],
|
|
3
|
+
"audio": ["Local audio recording/playback", ["numpy", "sounddevice", "wyoming"]],
|
|
3
4
|
"llm": ["LLM framework (pydantic-ai)", ["pydantic_ai"]],
|
|
4
5
|
"memory": ["Long-term memory proxy", ["chromadb", "yaml"]],
|
|
5
6
|
"rag": ["RAG proxy (ChromaDB, embeddings)", ["chromadb"]],
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# This file was autogenerated by uv via the following command:
|
|
2
|
+
# uv export --extra wyoming --no-dev --no-emit-project --no-hashes
|
|
3
|
+
annotated-types==0.7.0
|
|
4
|
+
# via pydantic
|
|
5
|
+
anyio==4.12.1
|
|
6
|
+
# via httpx
|
|
7
|
+
certifi==2026.1.4
|
|
8
|
+
# via
|
|
9
|
+
# httpcore
|
|
10
|
+
# httpx
|
|
11
|
+
click==8.3.1
|
|
12
|
+
# via
|
|
13
|
+
# typer
|
|
14
|
+
# typer-slim
|
|
15
|
+
colorama==0.4.6 ; sys_platform == 'win32'
|
|
16
|
+
# via click
|
|
17
|
+
dotenv==0.9.9
|
|
18
|
+
# via agent-cli
|
|
19
|
+
h11==0.16.0
|
|
20
|
+
# via httpcore
|
|
21
|
+
httpcore==1.0.9
|
|
22
|
+
# via httpx
|
|
23
|
+
httpx==0.28.1
|
|
24
|
+
# via agent-cli
|
|
25
|
+
idna==3.11
|
|
26
|
+
# via
|
|
27
|
+
# anyio
|
|
28
|
+
# httpx
|
|
29
|
+
markdown-it-py==4.0.0
|
|
30
|
+
# via rich
|
|
31
|
+
mdurl==0.1.2
|
|
32
|
+
# via markdown-it-py
|
|
33
|
+
psutil==7.2.1 ; sys_platform == 'win32'
|
|
34
|
+
# via agent-cli
|
|
35
|
+
pydantic==2.12.5
|
|
36
|
+
# via agent-cli
|
|
37
|
+
pydantic-core==2.41.5
|
|
38
|
+
# via pydantic
|
|
39
|
+
pygments==2.19.2
|
|
40
|
+
# via rich
|
|
41
|
+
pyperclip==1.11.0
|
|
42
|
+
# via agent-cli
|
|
43
|
+
python-dotenv==1.2.1
|
|
44
|
+
# via dotenv
|
|
45
|
+
rich==14.2.0
|
|
46
|
+
# via
|
|
47
|
+
# agent-cli
|
|
48
|
+
# typer
|
|
49
|
+
# typer-slim
|
|
50
|
+
setproctitle==1.3.7
|
|
51
|
+
# via agent-cli
|
|
52
|
+
shellingham==1.5.4
|
|
53
|
+
# via
|
|
54
|
+
# typer
|
|
55
|
+
# typer-slim
|
|
56
|
+
typer==0.21.1
|
|
57
|
+
# via agent-cli
|
|
58
|
+
typer-slim==0.21.1
|
|
59
|
+
# via agent-cli
|
|
60
|
+
typing-extensions==4.15.0
|
|
61
|
+
# via
|
|
62
|
+
# anyio
|
|
63
|
+
# pydantic
|
|
64
|
+
# pydantic-core
|
|
65
|
+
# typer
|
|
66
|
+
# typer-slim
|
|
67
|
+
# typing-inspection
|
|
68
|
+
typing-inspection==0.4.2
|
|
69
|
+
# via pydantic
|
|
70
|
+
wyoming==1.8.0
|
|
71
|
+
# via agent-cli
|
|
@@ -121,6 +121,7 @@ async def health_check() -> HealthResponse:
|
|
|
121
121
|
|
|
122
122
|
async def _transcribe_with_provider(
|
|
123
123
|
audio_data: bytes,
|
|
124
|
+
filename: str,
|
|
124
125
|
provider_cfg: config.ProviderSelection,
|
|
125
126
|
wyoming_asr_cfg: config.WyomingASR,
|
|
126
127
|
openai_asr_cfg: config.OpenAIASR,
|
|
@@ -128,6 +129,7 @@ async def _transcribe_with_provider(
|
|
|
128
129
|
) -> str:
|
|
129
130
|
"""Transcribe audio using the configured provider."""
|
|
130
131
|
transcriber = asr.create_recorded_audio_transcriber(provider_cfg)
|
|
132
|
+
file_suffix = Path(filename).suffix.lower() or ".wav"
|
|
131
133
|
|
|
132
134
|
if provider_cfg.asr_provider == "wyoming":
|
|
133
135
|
return await transcriber(
|
|
@@ -140,12 +142,14 @@ async def _transcribe_with_provider(
|
|
|
140
142
|
audio_data=audio_data,
|
|
141
143
|
openai_asr_cfg=openai_asr_cfg,
|
|
142
144
|
logger=LOGGER,
|
|
145
|
+
file_suffix=file_suffix,
|
|
143
146
|
)
|
|
144
147
|
if provider_cfg.asr_provider == "gemini":
|
|
145
148
|
return await transcriber(
|
|
146
149
|
audio_data=audio_data,
|
|
147
150
|
gemini_asr_cfg=gemini_asr_cfg,
|
|
148
151
|
logger=LOGGER,
|
|
152
|
+
file_suffix=file_suffix,
|
|
149
153
|
)
|
|
150
154
|
msg = f"Unsupported ASR provider: {provider_cfg.asr_provider}"
|
|
151
155
|
raise NotImplementedError(msg)
|
|
@@ -356,8 +360,14 @@ async def transcribe_audio(
|
|
|
356
360
|
defaults,
|
|
357
361
|
) = _load_transcription_configs()
|
|
358
362
|
|
|
359
|
-
#
|
|
363
|
+
# Read uploaded file
|
|
360
364
|
audio_data = await audio_file.read()
|
|
365
|
+
LOGGER.info(
|
|
366
|
+
"Received audio: filename=%s, size=%d bytes, content_type=%s",
|
|
367
|
+
audio_file.filename,
|
|
368
|
+
len(audio_data),
|
|
369
|
+
audio_file.content_type,
|
|
370
|
+
)
|
|
361
371
|
|
|
362
372
|
# Convert audio to Wyoming format if using local ASR
|
|
363
373
|
if provider_cfg.asr_provider == "wyoming":
|
|
@@ -366,6 +376,7 @@ async def transcribe_audio(
|
|
|
366
376
|
# Transcribe audio using the configured provider
|
|
367
377
|
raw_transcript = await _transcribe_with_provider(
|
|
368
378
|
audio_data,
|
|
379
|
+
audio_file.filename or "audio.wav",
|
|
369
380
|
provider_cfg,
|
|
370
381
|
wyoming_asr_cfg,
|
|
371
382
|
openai_asr_cfg,
|
|
@@ -17,6 +17,7 @@ if TYPE_CHECKING:
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
_RIFF_HEADER = b"RIFF"
|
|
20
|
+
_LOG_TRUNCATE_LENGTH = 100
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
def _is_wav_file(data: bytes) -> bool:
|
|
@@ -112,9 +113,17 @@ async def transcribe_audio_gemini(
|
|
|
112
113
|
# Determine MIME type from file suffix
|
|
113
114
|
mime_type = _GEMINI_MIME_TYPES.get(file_suffix.lower(), "audio/wav")
|
|
114
115
|
|
|
116
|
+
logger.debug(
|
|
117
|
+
"Received audio: size=%d bytes, file_suffix=%s, is_wav=%s",
|
|
118
|
+
len(audio_data),
|
|
119
|
+
file_suffix,
|
|
120
|
+
_is_wav_file(audio_data),
|
|
121
|
+
)
|
|
122
|
+
|
|
115
123
|
# If raw PCM (no recognized format header), convert to WAV
|
|
124
|
+
# Only do this if file_suffix is .wav but data doesn't have WAV header (indicating raw PCM)
|
|
116
125
|
if not _is_wav_file(audio_data) and file_suffix.lower() == ".wav":
|
|
117
|
-
logger.debug("
|
|
126
|
+
logger.debug("Wrapping raw PCM data with WAV header (16kHz, 16-bit, mono)")
|
|
118
127
|
audio_data = pcm_to_wav(
|
|
119
128
|
audio_data,
|
|
120
129
|
sample_rate=constants.AUDIO_RATE,
|
|
@@ -141,7 +150,19 @@ async def transcribe_audio_gemini(
|
|
|
141
150
|
types.Part.from_bytes(data=audio_data, mime_type=mime_type),
|
|
142
151
|
],
|
|
143
152
|
)
|
|
144
|
-
|
|
153
|
+
text = response.text.strip()
|
|
154
|
+
|
|
155
|
+
if text:
|
|
156
|
+
logger.info(
|
|
157
|
+
"Transcription result: %s",
|
|
158
|
+
text[:_LOG_TRUNCATE_LENGTH] + "..." if len(text) > _LOG_TRUNCATE_LENGTH else text,
|
|
159
|
+
)
|
|
160
|
+
else:
|
|
161
|
+
logger.warning(
|
|
162
|
+
"Empty transcription returned - audio may be silent, corrupted, or in wrong format",
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
return text
|
|
145
166
|
|
|
146
167
|
|
|
147
168
|
def _get_openai_client(api_key: str | None, base_url: str | None = None) -> AsyncOpenAI:
|
|
@@ -197,9 +218,17 @@ async def transcribe_audio_openai(
|
|
|
197
218
|
base_url=openai_asr_cfg.openai_base_url,
|
|
198
219
|
)
|
|
199
220
|
|
|
221
|
+
logger.debug(
|
|
222
|
+
"Received audio: size=%d bytes, file_suffix=%s, is_wav=%s",
|
|
223
|
+
len(audio_data),
|
|
224
|
+
file_suffix,
|
|
225
|
+
_is_wav_file(audio_data),
|
|
226
|
+
)
|
|
227
|
+
|
|
200
228
|
# Convert raw PCM to WAV if needed (custom endpoints like faster-whisper require proper format)
|
|
229
|
+
# Only do this if file_suffix is .wav but data doesn't have WAV header (indicating raw PCM)
|
|
201
230
|
if not _is_wav_file(audio_data) and file_suffix.lower() == ".wav":
|
|
202
|
-
logger.debug("
|
|
231
|
+
logger.debug("Wrapping raw PCM data with WAV header (16kHz, 16-bit, mono)")
|
|
203
232
|
audio_data = pcm_to_wav(
|
|
204
233
|
audio_data,
|
|
205
234
|
sample_rate=constants.AUDIO_RATE,
|
|
@@ -211,7 +240,7 @@ async def transcribe_audio_openai(
|
|
|
211
240
|
# Use the correct file extension so OpenAI knows the format
|
|
212
241
|
audio_file.name = f"audio{file_suffix}"
|
|
213
242
|
|
|
214
|
-
logger.debug("
|
|
243
|
+
logger.debug("Sending to OpenAI with filename: %s", audio_file.name)
|
|
215
244
|
|
|
216
245
|
transcription_params: dict[str, object] = {
|
|
217
246
|
"model": openai_asr_cfg.asr_openai_model,
|
|
@@ -225,7 +254,19 @@ async def transcribe_audio_openai(
|
|
|
225
254
|
logger.debug("Using OpenAI ASR with prompt")
|
|
226
255
|
|
|
227
256
|
response = await client.audio.transcriptions.create(**transcription_params)
|
|
228
|
-
|
|
257
|
+
text = response.text
|
|
258
|
+
|
|
259
|
+
if text:
|
|
260
|
+
logger.info(
|
|
261
|
+
"Transcription result: %s",
|
|
262
|
+
text[:_LOG_TRUNCATE_LENGTH] + "..." if len(text) > _LOG_TRUNCATE_LENGTH else text,
|
|
263
|
+
)
|
|
264
|
+
else:
|
|
265
|
+
logger.warning(
|
|
266
|
+
"Empty transcription returned - audio may be silent, corrupted, or in wrong format",
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
return text
|
|
229
270
|
|
|
230
271
|
|
|
231
272
|
async def synthesize_speech_openai(
|
|
@@ -38,7 +38,7 @@ COPY pyproject.toml uv.lock README.md ./
|
|
|
38
38
|
COPY .git ./.git
|
|
39
39
|
COPY agent_cli ./agent_cli
|
|
40
40
|
COPY scripts ./scripts
|
|
41
|
-
RUN uv sync --frozen --no-dev --no-editable --extra server --extra
|
|
41
|
+
RUN uv sync --frozen --no-dev --no-editable --extra server --extra wyoming --extra llm
|
|
42
42
|
|
|
43
43
|
# =============================================================================
|
|
44
44
|
# Runtime stage - minimal image
|
|
@@ -26,7 +26,7 @@ COPY pyproject.toml uv.lock README.md ./
|
|
|
26
26
|
COPY .git ./.git
|
|
27
27
|
COPY agent_cli ./agent_cli
|
|
28
28
|
COPY scripts ./scripts
|
|
29
|
-
RUN uv sync --frozen --no-dev --no-editable --extra server --extra kokoro --extra
|
|
29
|
+
RUN uv sync --frozen --no-dev --no-editable --extra server --extra kokoro --extra wyoming && \
|
|
30
30
|
/app/.venv/bin/python -m spacy download en_core_web_sm
|
|
31
31
|
|
|
32
32
|
# =============================================================================
|
|
@@ -46,7 +46,7 @@ COPY pyproject.toml uv.lock README.md ./
|
|
|
46
46
|
COPY .git ./.git
|
|
47
47
|
COPY agent_cli ./agent_cli
|
|
48
48
|
COPY scripts ./scripts
|
|
49
|
-
RUN uv sync --frozen --no-dev --no-editable --extra server --extra piper --extra
|
|
49
|
+
RUN uv sync --frozen --no-dev --no-editable --extra server --extra piper --extra wyoming
|
|
50
50
|
|
|
51
51
|
# =============================================================================
|
|
52
52
|
# CUDA target: GPU-accelerated with Kokoro TTS
|
|
@@ -26,7 +26,7 @@ COPY pyproject.toml uv.lock README.md ./
|
|
|
26
26
|
COPY .git ./.git
|
|
27
27
|
COPY agent_cli ./agent_cli
|
|
28
28
|
COPY scripts ./scripts
|
|
29
|
-
RUN uv sync --frozen --no-dev --no-editable --extra server --extra faster-whisper --extra
|
|
29
|
+
RUN uv sync --frozen --no-dev --no-editable --extra server --extra faster-whisper --extra wyoming
|
|
30
30
|
|
|
31
31
|
# =============================================================================
|
|
32
32
|
# CUDA target: GPU-accelerated with faster-whisper
|
|
@@ -31,7 +31,8 @@ Available extras:
|
|
|
31
31
|
<!-- ⚠️ This content is auto-generated by `markdown-code-runner`. -->
|
|
32
32
|
| Extra | Description |
|
|
33
33
|
|-------|-------------|
|
|
34
|
-
| `
|
|
34
|
+
| `wyoming` | Wyoming protocol for ASR/TTS servers |
|
|
35
|
+
| `audio` | Local audio recording/playback |
|
|
35
36
|
| `llm` | LLM framework (pydantic-ai) |
|
|
36
37
|
| `memory` | Long-term memory proxy |
|
|
37
38
|
| `rag` | RAG proxy (ChromaDB, embeddings) |
|
|
@@ -31,7 +31,8 @@ Homepage = "https://github.com/basnijholt/agent-cli"
|
|
|
31
31
|
|
|
32
32
|
[project.optional-dependencies]
|
|
33
33
|
# Provider extras (previously base dependencies, now optional)
|
|
34
|
-
|
|
34
|
+
wyoming = ["wyoming>=1.5.2"] # Wyoming protocol only (for servers)
|
|
35
|
+
audio = ["numpy", "sounddevice>=0.4.6", "agent-cli[wyoming]"] # Local audio recording
|
|
35
36
|
llm = ["pydantic-ai-slim[openai,google,duckduckgo,vertexai]>=0.1.1"]
|
|
36
37
|
|
|
37
38
|
# Feature extras
|
|
@@ -52,6 +52,7 @@ async def test_full_transcription_workflow() -> None:
|
|
|
52
52
|
# Create mock upload file
|
|
53
53
|
class MockUploadFile:
|
|
54
54
|
filename = "test.wav"
|
|
55
|
+
content_type = "audio/wav"
|
|
55
56
|
|
|
56
57
|
async def read(self) -> bytes:
|
|
57
58
|
return audio_data
|
|
@@ -215,6 +216,7 @@ async def test_concurrent_requests() -> None:
|
|
|
215
216
|
class MockUploadFile:
|
|
216
217
|
def __init__(self, idx: int) -> None:
|
|
217
218
|
self.filename = f"test{idx}.wav"
|
|
219
|
+
self.content_type = "audio/wav"
|
|
218
220
|
self.idx = idx
|
|
219
221
|
|
|
220
222
|
async def read(self) -> bytes:
|
|
@@ -113,6 +113,9 @@ test = [
|
|
|
113
113
|
vad = [
|
|
114
114
|
{ name = "silero-vad" },
|
|
115
115
|
]
|
|
116
|
+
wyoming = [
|
|
117
|
+
{ name = "wyoming" },
|
|
118
|
+
]
|
|
116
119
|
|
|
117
120
|
[package.dev-dependencies]
|
|
118
121
|
dev = [
|
|
@@ -194,9 +197,10 @@ requires-dist = [
|
|
|
194
197
|
{ name = "watchfiles", marker = "extra == 'memory'", specifier = ">=0.21.0" },
|
|
195
198
|
{ name = "watchfiles", marker = "extra == 'rag'", specifier = ">=0.21.0" },
|
|
196
199
|
{ name = "wyoming", marker = "extra == 'audio'", specifier = ">=1.5.2" },
|
|
200
|
+
{ name = "wyoming", marker = "extra == 'wyoming'", specifier = ">=1.5.2" },
|
|
197
201
|
{ name = "zensical", marker = "extra == 'dev'" },
|
|
198
202
|
]
|
|
199
|
-
provides-extras = ["audio", "dev", "faster-whisper", "kokoro", "llm", "memory", "mlx-whisper", "piper", "rag", "server", "speed", "test", "vad"]
|
|
203
|
+
provides-extras = ["audio", "dev", "faster-whisper", "kokoro", "llm", "memory", "mlx-whisper", "piper", "rag", "server", "speed", "test", "vad", "wyoming"]
|
|
200
204
|
|
|
201
205
|
[package.metadata.requires-dev]
|
|
202
206
|
dev = [
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|