agent-cli 0.104.0__tar.gz → 0.105.0__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.0}/.github/workflows/docker.yml +87 -1
- {agent_cli-0.104.0 → agent_cli-0.105.0}/PKG-INFO +1 -1
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/cli.py +12 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/base.py +1 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/transformers.py +32 -1
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/model_manager.py +2 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/docker-compose.yml +2 -2
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/server/transcribe-proxy.md +9 -5
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/server/whisper.md +3 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/docker.md +1 -1
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/appcast.xml +19 -16
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_api_integration.py +38 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_whisper.py +3 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_transformers_backend.py +67 -2
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.cursorrules +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.dockerignore +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.env.example +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/logo.svg +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/release-drafter.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/renovate.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/normalize_appcast.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/release.yml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.gitignore +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.jscpd.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.prompts/docs-review.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/.prompts/pr-review.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/CLAUDE.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/LICENSE +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/__main__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_extras.json +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_overrides/nemo-whisper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/nemo-whisper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_tools.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/config.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/constants.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/process.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/cmux.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/services.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/opts.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/py.typed +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/proxy/diarization.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/nemo.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/diarization.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/CNAME +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/architecture/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/architecture/memory.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/architecture/rag.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/assistant.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/chat.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/config.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/daemon.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/dev.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/install-services.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/memory.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/server/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/speak.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/speakers.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/start-services.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/configuration.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/getting-started.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/index.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/linux.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/macos-app.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/macos.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/nixos.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/windows.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/logo-clean.svg +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/system-integration.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/justfile +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Package.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/pyproject.toml +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/reddit.md +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/shell.nix +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/conftest.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_audio.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_audio_levels.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_sse.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_vad.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_watch.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_project.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/install/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/install/test_extras.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_client.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_files.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_store.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/mocks/audio.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/mocks/llm.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/__init__.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_history.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_store.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_alignment.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_api.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_asr.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_cli.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_config.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_daemon.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_diarization.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_env_vars.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_json_output.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_llm.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_macos_app.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_nemo_backend.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_normalize_appcast.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_process_manager.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_proxy_diarization.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_tts.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_tts_wyoming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_whisper_wyoming.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_services.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_tools.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_tts.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_wake_word.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/uv.lock +0 -0
- {agent_cli-0.104.0 → agent_cli-0.105.0}/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.0
|
|
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]
|
|
@@ -47,6 +47,10 @@ _MODEL_MAP: dict[str, str] = {
|
|
|
47
47
|
_REMOTE_CODE_MODEL_PREFIXES = ("CohereLabs/cohere-transcribe",)
|
|
48
48
|
|
|
49
49
|
|
|
50
|
+
class TranscriptionTruncatedError(RuntimeError):
|
|
51
|
+
"""Raised when an autoregressive ASR model exhausts its output budget."""
|
|
52
|
+
|
|
53
|
+
|
|
50
54
|
def _resolve_model_name(model_name: str) -> str:
|
|
51
55
|
"""Resolve a model name to a HuggingFace repo."""
|
|
52
56
|
if "/" in model_name:
|
|
@@ -220,6 +224,22 @@ def _move_inputs_to_device(inputs: Any) -> Any:
|
|
|
220
224
|
return {k: v.to(_state.device) if hasattr(v, "to") else v for k, v in inputs.items()}
|
|
221
225
|
|
|
222
226
|
|
|
227
|
+
def _qwen_generation_was_truncated(generated_ids: Any, max_new_tokens: int) -> bool:
|
|
228
|
+
"""Return whether Qwen exhausted its token budget without emitting EOS."""
|
|
229
|
+
if generated_ids.shape[1] < max_new_tokens:
|
|
230
|
+
return False
|
|
231
|
+
|
|
232
|
+
generation_config = getattr(_state.model, "generation_config", None)
|
|
233
|
+
eos_token_ids = getattr(generation_config, "eos_token_id", None)
|
|
234
|
+
if eos_token_ids is None:
|
|
235
|
+
return True
|
|
236
|
+
if isinstance(eos_token_ids, int):
|
|
237
|
+
eos_token_ids = [eos_token_ids]
|
|
238
|
+
|
|
239
|
+
last_token_id = generated_ids[:, -1:].tolist()[0][0]
|
|
240
|
+
return last_token_id not in eos_token_ids
|
|
241
|
+
|
|
242
|
+
|
|
223
243
|
def _transcribe_cohere_asr(
|
|
224
244
|
*,
|
|
225
245
|
audio_array: Any,
|
|
@@ -276,6 +296,7 @@ def _transcribe_qwen3_asr(
|
|
|
276
296
|
task: str,
|
|
277
297
|
initial_prompt: str | None,
|
|
278
298
|
duration: float,
|
|
299
|
+
max_new_tokens: int,
|
|
279
300
|
) -> dict[str, Any]:
|
|
280
301
|
"""Transcribe with Qwen3-ASR's native transformers interface."""
|
|
281
302
|
if task != "transcribe":
|
|
@@ -294,11 +315,19 @@ def _transcribe_qwen3_asr(
|
|
|
294
315
|
with torch.inference_mode():
|
|
295
316
|
output_ids = _state.model.generate(
|
|
296
317
|
**inputs,
|
|
297
|
-
max_new_tokens=
|
|
318
|
+
max_new_tokens=max_new_tokens,
|
|
298
319
|
do_sample=False,
|
|
299
320
|
)
|
|
300
321
|
|
|
301
322
|
generated_ids = output_ids[:, inputs["input_ids"].shape[1] :]
|
|
323
|
+
if _qwen_generation_was_truncated(generated_ids, max_new_tokens):
|
|
324
|
+
msg = (
|
|
325
|
+
"Qwen3-ASR transcription reached "
|
|
326
|
+
f"max_new_tokens={max_new_tokens} before completion. "
|
|
327
|
+
"Restart the server with a higher --max-new-tokens value "
|
|
328
|
+
"or split the audio into shorter chunks."
|
|
329
|
+
)
|
|
330
|
+
raise TranscriptionTruncatedError(msg)
|
|
302
331
|
parsed = _state.processor.decode(generated_ids, return_format="parsed")[0]
|
|
303
332
|
language = parsed["language"] or effective_language or "unknown"
|
|
304
333
|
|
|
@@ -416,6 +445,7 @@ def _transcribe_in_subprocess(kwargs: dict[str, Any]) -> dict[str, Any]:
|
|
|
416
445
|
task=task,
|
|
417
446
|
initial_prompt=kwargs.get("initial_prompt"),
|
|
418
447
|
duration=_read_wav_duration(wav_path),
|
|
448
|
+
max_new_tokens=kwargs.get("max_new_tokens", 4096),
|
|
419
449
|
)
|
|
420
450
|
|
|
421
451
|
audio_array, sample_rate, duration = _read_wav_audio(wav_path)
|
|
@@ -548,6 +578,7 @@ class TransformersWhisperBackend:
|
|
|
548
578
|
"default_language": self._config.default_language,
|
|
549
579
|
"task": task,
|
|
550
580
|
"initial_prompt": initial_prompt,
|
|
581
|
+
"max_new_tokens": self._config.max_new_tokens,
|
|
551
582
|
}
|
|
552
583
|
|
|
553
584
|
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):
|
|
@@ -130,6 +130,7 @@ agent-cli server whisper \
|
|
|
130
130
|
| `--cache-dir` | - | Custom directory for downloaded models (default: HuggingFace cache) |
|
|
131
131
|
| `--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
132
|
| `--trust-remote-code` | `false` | Allow Hugging Face model repositories to execute custom Python code. Known supported remote-code ASR models are trusted automatically. |
|
|
133
|
+
| `--max-new-tokens` | `4096` | Maximum output tokens for autoregressive transformers ASR models. Increase for unusually long audio |
|
|
133
134
|
| `--ttl` | `300` | Seconds of inactivity before unloading model from memory. Set to 0 to keep loaded indefinitely |
|
|
134
135
|
| `--preload` | `false` | Load model(s) immediately at startup instead of on first request. Useful for reducing first-request latency |
|
|
135
136
|
| `--host` | `0.0.0.0` | Network interface to bind. Use `0.0.0.0` for all interfaces |
|
|
@@ -311,6 +312,8 @@ agent-cli server whisper \
|
|
|
311
312
|
|
|
312
313
|
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
314
|
|
|
315
|
+
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.
|
|
316
|
+
|
|
314
317
|
To install it as the standard `whisper` background daemon:
|
|
315
318
|
|
|
316
319
|
```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,25 @@
|
|
|
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.104.0</title>
|
|
9
|
+
<pubDate>Mon, 07 Sep 2026 21:38:19 +0000</pubDate>
|
|
10
|
+
<link>https://github.com/basnijholt/agent-cli</link>
|
|
11
|
+
<sparkle:version>203</sparkle:version>
|
|
12
|
+
<sparkle:shortVersionString>0.104.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
|
+
* Add speaker diarization API and Docker image (#639) @basnijholt
|
|
18
|
+
* Fix Docker image publishing and runtime extras (#638) @basnijholt
|
|
19
|
+
* ⬆️ Update actions/deploy-pages action to v5.0.1 (#637) [@renovate[bot]](https://github.com/apps/renovate)
|
|
20
|
+
* ⬆️ Update docker/setup-buildx-action action to v4.3.0 (#635) [@renovate[bot]](https://github.com/apps/renovate)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
]]></description>
|
|
24
|
+
<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=="/>
|
|
25
|
+
</item>
|
|
7
26
|
<item>
|
|
8
27
|
<title>0.103.0</title>
|
|
9
28
|
<pubDate>Tue, 01 Sep 2026 19:34:50 +0000</pubDate>
|
|
@@ -189,21 +208,5 @@
|
|
|
189
208
|
]]></description>
|
|
190
209
|
<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
210
|
</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
211
|
</channel>
|
|
209
212
|
</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."""
|
|
@@ -245,7 +245,10 @@ def test_transcribe_qwen3_asr_returns_parsed_transcription(
|
|
|
245
245
|
return [{"language": "English", "transcription": "Agent CLI"}]
|
|
246
246
|
|
|
247
247
|
class Model:
|
|
248
|
-
|
|
248
|
+
generation_config = SimpleNamespace(eos_token_id=[42, 99])
|
|
249
|
+
|
|
250
|
+
def generate(self, **inputs: Tensor | int | bool) -> Tensor:
|
|
251
|
+
assert inputs["max_new_tokens"] == 2
|
|
249
252
|
return Tensor([[1, 2, 3, 41, 42]])
|
|
250
253
|
|
|
251
254
|
monkeypatch.setitem(
|
|
@@ -271,6 +274,7 @@ def test_transcribe_qwen3_asr_returns_parsed_transcription(
|
|
|
271
274
|
task="transcribe",
|
|
272
275
|
initial_prompt="Vocabulary: Agent CLI",
|
|
273
276
|
duration=1.5,
|
|
277
|
+
max_new_tokens=2,
|
|
274
278
|
)
|
|
275
279
|
|
|
276
280
|
assert result == {
|
|
@@ -283,6 +287,61 @@ def test_transcribe_qwen3_asr_returns_parsed_transcription(
|
|
|
283
287
|
}
|
|
284
288
|
|
|
285
289
|
|
|
290
|
+
def test_transcribe_qwen3_asr_rejects_truncated_generation(
|
|
291
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
292
|
+
) -> None:
|
|
293
|
+
"""Qwen3-ASR must not return partial text when generation exhausts its limit."""
|
|
294
|
+
|
|
295
|
+
class Tensor:
|
|
296
|
+
def __init__(self, values: list[list[int]]) -> None:
|
|
297
|
+
self.values = values
|
|
298
|
+
self.shape = (len(values), len(values[0]))
|
|
299
|
+
|
|
300
|
+
def to(self, *_args: object, **_kwargs: object) -> Tensor:
|
|
301
|
+
return self
|
|
302
|
+
|
|
303
|
+
def __getitem__(self, key: tuple[slice, slice]) -> Tensor:
|
|
304
|
+
rows, columns = key
|
|
305
|
+
return Tensor([row[columns] for row in self.values[rows]])
|
|
306
|
+
|
|
307
|
+
def tolist(self) -> list[list[int]]:
|
|
308
|
+
return self.values
|
|
309
|
+
|
|
310
|
+
class Processor:
|
|
311
|
+
def apply_transcription_request(self, **_kwargs: object) -> dict[str, Tensor]:
|
|
312
|
+
return {"input_ids": Tensor([[1, 2, 3]])}
|
|
313
|
+
|
|
314
|
+
def decode(self, *_args: object, **_kwargs: object) -> list[dict[str, str]]:
|
|
315
|
+
raise AssertionError
|
|
316
|
+
|
|
317
|
+
class Model:
|
|
318
|
+
def generate(self, **_kwargs: object) -> Tensor:
|
|
319
|
+
return Tensor([[1, 2, 3, 41, 42]])
|
|
320
|
+
|
|
321
|
+
monkeypatch.setitem(sys.modules, "torch", SimpleNamespace(inference_mode=nullcontext))
|
|
322
|
+
monkeypatch.setattr(
|
|
323
|
+
backend,
|
|
324
|
+
"_state",
|
|
325
|
+
backend._SubprocessState(
|
|
326
|
+
model=Model(),
|
|
327
|
+
processor=Processor(),
|
|
328
|
+
dtype="float32",
|
|
329
|
+
device="cpu",
|
|
330
|
+
is_qwen3_asr=True,
|
|
331
|
+
),
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
with pytest.raises(backend.TranscriptionTruncatedError, match="max_new_tokens=2"):
|
|
335
|
+
backend._transcribe_qwen3_asr(
|
|
336
|
+
audio_array=object(),
|
|
337
|
+
effective_language=None,
|
|
338
|
+
task="transcribe",
|
|
339
|
+
initial_prompt=None,
|
|
340
|
+
duration=180.0,
|
|
341
|
+
max_new_tokens=2,
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
|
|
286
345
|
def test_transcribe_qwen3_asr_rejects_translation(
|
|
287
346
|
monkeypatch: pytest.MonkeyPatch,
|
|
288
347
|
) -> None:
|
|
@@ -310,6 +369,7 @@ def test_transcribe_qwen3_asr_rejects_translation(
|
|
|
310
369
|
task="translate",
|
|
311
370
|
initial_prompt=None,
|
|
312
371
|
duration=1.0,
|
|
372
|
+
max_new_tokens=4096,
|
|
313
373
|
)
|
|
314
374
|
|
|
315
375
|
|
|
@@ -353,7 +413,11 @@ def test_transcribe_dispatches_qwen3_asr_to_native_adapter(
|
|
|
353
413
|
)
|
|
354
414
|
|
|
355
415
|
def transcribe_qwen3_asr(**kwargs: object) -> dict[str, object]:
|
|
356
|
-
if
|
|
416
|
+
if (
|
|
417
|
+
kwargs["audio_array"] is not qwen_audio
|
|
418
|
+
or kwargs["duration"] != 0.5
|
|
419
|
+
or kwargs["max_new_tokens"] != 2048
|
|
420
|
+
):
|
|
357
421
|
return {**expected, "text": "wrong Qwen input"}
|
|
358
422
|
return expected
|
|
359
423
|
|
|
@@ -364,6 +428,7 @@ def test_transcribe_dispatches_qwen3_asr_to_native_adapter(
|
|
|
364
428
|
"wav_path": str(wav_path),
|
|
365
429
|
"task": "transcribe",
|
|
366
430
|
"initial_prompt": "Agent CLI",
|
|
431
|
+
"max_new_tokens": 2048,
|
|
367
432
|
},
|
|
368
433
|
)
|
|
369
434
|
|
|
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
|