agent-cli 0.67.1__tar.gz → 0.68.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.67.1 → agent_cli-0.68.0}/PKG-INFO +11 -4
- {agent_cli-0.67.1 → agent_cli-0.68.0}/README.md +8 -1
- agent_cli-0.68.0/agent_cli/_requirements/mlx-whisper.txt +215 -0
- agent_cli-0.68.0/agent_cli/core/deps.py +191 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/utils.py +2 -2
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/extras.py +38 -20
- {agent_cli-0.67.1 → agent_cli-0.68.0}/pyproject.toml +2 -2
- agent_cli-0.68.0/tests/test_requires_extras.py +285 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/uv.lock +16 -72
- agent_cli-0.67.1/agent_cli/_requirements/mlx-whisper.txt +0 -256
- agent_cli-0.67.1/agent_cli/core/deps.py +0 -139
- agent_cli-0.67.1/tests/test_requires_extras.py +0 -62
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/README.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.cursorrules +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.env.example +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/logo.svg +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/release-drafter.yml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/renovate.json +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/release.yml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.gitignore +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.jscpd.json +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.prompts/docs-review.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/.prompts/pr-review.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/CLAUDE.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/LICENSE +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/__main__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_extras.json +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_tools.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/transcribe_daemon.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/api.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/cli.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/config.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/constants.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/process.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/common.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/services.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/opts.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/py.typed +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-piper-windows.ps1 +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-piper.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-whisper-linux.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-whisper-macos.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-whisper-windows.ps1 +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-whisper.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run_faster_whisper_server.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/sync_extras.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/common.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docker/docker-compose.yml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docker/transcription-proxy.Dockerfile +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/CNAME +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/architecture/index.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/architecture/memory.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/architecture/rag.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/assistant.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/chat.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/config.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/dev.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/index.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/install-services.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/memory.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/server/index.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/server/transcription-proxy.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/speak.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/start-services.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/transcribe-daemon.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/configuration.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/getting-started.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/index.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/docker.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/index.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/linux.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/macos.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/nixos.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/windows.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/logo-clean.svg +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/system-integration.md +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/justfile +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/shell.nix +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe_daemon.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/conftest.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_sse.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_vad.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_watch.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_project.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/install/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/install/test_extras.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_client.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_files.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_store.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/mocks/audio.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/mocks/llm.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/__init__.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_api.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_history.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_store.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_api.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_api_integration.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_asr.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_cli.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_config.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_env_vars.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_json_output.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_llm.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_process_manager.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_server_tts.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_services.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_tools.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_tts.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_utils.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_wake_word.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.67.1 → agent_cli-0.68.0}/zensical.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.68.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>
|
|
@@ -52,8 +52,8 @@ Requires-Dist: pyyaml>=6.0.0; extra == 'memory'
|
|
|
52
52
|
Requires-Dist: transformers>=4.30.0; extra == 'memory'
|
|
53
53
|
Requires-Dist: watchfiles>=0.21.0; extra == 'memory'
|
|
54
54
|
Provides-Extra: mlx-whisper
|
|
55
|
-
Requires-Dist: fastapi[standard]; extra == 'mlx-whisper'
|
|
56
|
-
Requires-Dist: mlx-whisper>=0.4.0; extra == 'mlx-whisper'
|
|
55
|
+
Requires-Dist: fastapi[standard]; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
|
|
56
|
+
Requires-Dist: mlx-whisper>=0.4.0; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
|
|
57
57
|
Provides-Extra: piper
|
|
58
58
|
Requires-Dist: fastapi[standard]; extra == 'piper'
|
|
59
59
|
Requires-Dist: piper-tts>=1.2.0; extra == 'piper'
|
|
@@ -459,7 +459,14 @@ All necessary scripts are bundled with the package, so you can run these command
|
|
|
459
459
|
|
|
460
460
|
#### Installing Optional Extras
|
|
461
461
|
|
|
462
|
-
Some features require additional Python dependencies.
|
|
462
|
+
Some features require additional Python dependencies. By default, **agent-cli will auto-install missing extras** when you run a command that needs them. To disable this, set `AGENT_CLI_NO_AUTO_INSTALL=1` or add to your config file:
|
|
463
|
+
|
|
464
|
+
```toml
|
|
465
|
+
[settings]
|
|
466
|
+
auto_install_extras = false
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
You can also manually install extras with `install-extras`:
|
|
463
470
|
|
|
464
471
|
```bash
|
|
465
472
|
# List available extras
|
|
@@ -377,7 +377,14 @@ All necessary scripts are bundled with the package, so you can run these command
|
|
|
377
377
|
|
|
378
378
|
#### Installing Optional Extras
|
|
379
379
|
|
|
380
|
-
Some features require additional Python dependencies.
|
|
380
|
+
Some features require additional Python dependencies. By default, **agent-cli will auto-install missing extras** when you run a command that needs them. To disable this, set `AGENT_CLI_NO_AUTO_INSTALL=1` or add to your config file:
|
|
381
|
+
|
|
382
|
+
```toml
|
|
383
|
+
[settings]
|
|
384
|
+
auto_install_extras = false
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
You can also manually install extras with `install-extras`:
|
|
381
388
|
|
|
382
389
|
```bash
|
|
383
390
|
# List available extras
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# This file was autogenerated by uv via the following command:
|
|
2
|
+
# uv export --extra mlx-whisper --no-dev --no-emit-project --no-hashes
|
|
3
|
+
annotated-doc==0.0.4 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
4
|
+
# via fastapi
|
|
5
|
+
annotated-types==0.7.0
|
|
6
|
+
# via pydantic
|
|
7
|
+
anyio==4.12.1
|
|
8
|
+
# via
|
|
9
|
+
# httpx
|
|
10
|
+
# starlette
|
|
11
|
+
# watchfiles
|
|
12
|
+
certifi==2026.1.4
|
|
13
|
+
# via
|
|
14
|
+
# httpcore
|
|
15
|
+
# httpx
|
|
16
|
+
# requests
|
|
17
|
+
# sentry-sdk
|
|
18
|
+
charset-normalizer==3.4.4 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
19
|
+
# via requests
|
|
20
|
+
click==8.3.1
|
|
21
|
+
# via
|
|
22
|
+
# rich-toolkit
|
|
23
|
+
# typer
|
|
24
|
+
# uvicorn
|
|
25
|
+
colorama==0.4.6 ; sys_platform == 'win32'
|
|
26
|
+
# via
|
|
27
|
+
# click
|
|
28
|
+
# tqdm
|
|
29
|
+
# uvicorn
|
|
30
|
+
dnspython==2.8.0
|
|
31
|
+
# via email-validator
|
|
32
|
+
dotenv==0.9.9
|
|
33
|
+
# via agent-cli
|
|
34
|
+
email-validator==2.3.0
|
|
35
|
+
# via
|
|
36
|
+
# fastapi
|
|
37
|
+
# pydantic
|
|
38
|
+
fastapi==0.128.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
39
|
+
# via agent-cli
|
|
40
|
+
fastapi-cli==0.0.20 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
41
|
+
# via fastapi
|
|
42
|
+
fastapi-cloud-cli==0.10.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
43
|
+
# via fastapi-cli
|
|
44
|
+
fastar==0.8.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
45
|
+
# via fastapi-cloud-cli
|
|
46
|
+
filelock==3.20.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
47
|
+
# via
|
|
48
|
+
# huggingface-hub
|
|
49
|
+
# torch
|
|
50
|
+
fsspec==2026.1.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
51
|
+
# via
|
|
52
|
+
# huggingface-hub
|
|
53
|
+
# torch
|
|
54
|
+
h11==0.16.0
|
|
55
|
+
# via
|
|
56
|
+
# httpcore
|
|
57
|
+
# uvicorn
|
|
58
|
+
hf-xet==1.2.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
59
|
+
# via huggingface-hub
|
|
60
|
+
httpcore==1.0.9
|
|
61
|
+
# via httpx
|
|
62
|
+
httptools==0.7.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
63
|
+
# via uvicorn
|
|
64
|
+
httpx==0.28.1
|
|
65
|
+
# via
|
|
66
|
+
# agent-cli
|
|
67
|
+
# fastapi
|
|
68
|
+
# fastapi-cloud-cli
|
|
69
|
+
huggingface-hub==0.36.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
70
|
+
# via mlx-whisper
|
|
71
|
+
idna==3.11
|
|
72
|
+
# via
|
|
73
|
+
# anyio
|
|
74
|
+
# email-validator
|
|
75
|
+
# httpx
|
|
76
|
+
# requests
|
|
77
|
+
jinja2==3.1.6 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
78
|
+
# via
|
|
79
|
+
# fastapi
|
|
80
|
+
# torch
|
|
81
|
+
llvmlite==0.46.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
82
|
+
# via numba
|
|
83
|
+
markdown-it-py==4.0.0
|
|
84
|
+
# via rich
|
|
85
|
+
markupsafe==3.0.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
86
|
+
# via jinja2
|
|
87
|
+
mdurl==0.1.2
|
|
88
|
+
# via markdown-it-py
|
|
89
|
+
mlx==0.30.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
90
|
+
# via mlx-whisper
|
|
91
|
+
mlx-metal==0.30.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
92
|
+
# via mlx
|
|
93
|
+
mlx-whisper==0.4.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
94
|
+
# via agent-cli
|
|
95
|
+
more-itertools==10.8.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
96
|
+
# via mlx-whisper
|
|
97
|
+
mpmath==1.3.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
98
|
+
# via sympy
|
|
99
|
+
networkx==3.6.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
100
|
+
# via torch
|
|
101
|
+
numba==0.63.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
102
|
+
# via mlx-whisper
|
|
103
|
+
numpy==2.3.5 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
104
|
+
# via
|
|
105
|
+
# mlx-whisper
|
|
106
|
+
# numba
|
|
107
|
+
# scipy
|
|
108
|
+
packaging==25.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
109
|
+
# via huggingface-hub
|
|
110
|
+
psutil==7.2.1 ; sys_platform == 'win32'
|
|
111
|
+
# via agent-cli
|
|
112
|
+
pydantic==2.12.5
|
|
113
|
+
# via
|
|
114
|
+
# agent-cli
|
|
115
|
+
# fastapi
|
|
116
|
+
# fastapi-cloud-cli
|
|
117
|
+
# pydantic-extra-types
|
|
118
|
+
# pydantic-settings
|
|
119
|
+
pydantic-core==2.41.5
|
|
120
|
+
# via pydantic
|
|
121
|
+
pydantic-extra-types==2.11.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
122
|
+
# via fastapi
|
|
123
|
+
pydantic-settings==2.12.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
124
|
+
# via fastapi
|
|
125
|
+
pygments==2.19.2
|
|
126
|
+
# via rich
|
|
127
|
+
pyperclip==1.11.0
|
|
128
|
+
# via agent-cli
|
|
129
|
+
python-dotenv==1.2.1
|
|
130
|
+
# via
|
|
131
|
+
# dotenv
|
|
132
|
+
# pydantic-settings
|
|
133
|
+
# uvicorn
|
|
134
|
+
python-multipart==0.0.21 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
135
|
+
# via fastapi
|
|
136
|
+
pyyaml==6.0.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
137
|
+
# via
|
|
138
|
+
# huggingface-hub
|
|
139
|
+
# uvicorn
|
|
140
|
+
regex==2026.1.15 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
141
|
+
# via tiktoken
|
|
142
|
+
requests==2.32.5 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
143
|
+
# via
|
|
144
|
+
# huggingface-hub
|
|
145
|
+
# tiktoken
|
|
146
|
+
rich==14.2.0
|
|
147
|
+
# via
|
|
148
|
+
# agent-cli
|
|
149
|
+
# rich-toolkit
|
|
150
|
+
# typer
|
|
151
|
+
rich-toolkit==0.17.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
152
|
+
# via
|
|
153
|
+
# fastapi-cli
|
|
154
|
+
# fastapi-cloud-cli
|
|
155
|
+
rignore==0.7.6 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
156
|
+
# via fastapi-cloud-cli
|
|
157
|
+
scipy==1.17.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
158
|
+
# via mlx-whisper
|
|
159
|
+
sentry-sdk==2.49.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
160
|
+
# via fastapi-cloud-cli
|
|
161
|
+
setproctitle==1.3.7
|
|
162
|
+
# via agent-cli
|
|
163
|
+
setuptools==80.9.0 ; python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
164
|
+
# via torch
|
|
165
|
+
shellingham==1.5.4
|
|
166
|
+
# via typer
|
|
167
|
+
starlette==0.50.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
168
|
+
# via fastapi
|
|
169
|
+
sympy==1.14.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
170
|
+
# via torch
|
|
171
|
+
tiktoken==0.12.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
172
|
+
# via mlx-whisper
|
|
173
|
+
torch==2.9.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
174
|
+
# via mlx-whisper
|
|
175
|
+
tqdm==4.67.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
176
|
+
# via
|
|
177
|
+
# huggingface-hub
|
|
178
|
+
# mlx-whisper
|
|
179
|
+
typer==0.21.1
|
|
180
|
+
# via
|
|
181
|
+
# agent-cli
|
|
182
|
+
# fastapi-cli
|
|
183
|
+
# fastapi-cloud-cli
|
|
184
|
+
typing-extensions==4.15.0
|
|
185
|
+
# via
|
|
186
|
+
# anyio
|
|
187
|
+
# fastapi
|
|
188
|
+
# huggingface-hub
|
|
189
|
+
# pydantic
|
|
190
|
+
# pydantic-core
|
|
191
|
+
# pydantic-extra-types
|
|
192
|
+
# rich-toolkit
|
|
193
|
+
# starlette
|
|
194
|
+
# torch
|
|
195
|
+
# typer
|
|
196
|
+
# typing-inspection
|
|
197
|
+
typing-inspection==0.4.2
|
|
198
|
+
# via
|
|
199
|
+
# pydantic
|
|
200
|
+
# pydantic-settings
|
|
201
|
+
urllib3==2.3.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
202
|
+
# via
|
|
203
|
+
# requests
|
|
204
|
+
# sentry-sdk
|
|
205
|
+
uvicorn==0.40.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
206
|
+
# via
|
|
207
|
+
# fastapi
|
|
208
|
+
# fastapi-cli
|
|
209
|
+
# fastapi-cloud-cli
|
|
210
|
+
uvloop==0.22.1 ; platform_machine == 'arm64' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'
|
|
211
|
+
# via uvicorn
|
|
212
|
+
watchfiles==1.1.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
213
|
+
# via uvicorn
|
|
214
|
+
websockets==15.0.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
215
|
+
# via uvicorn
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"""Helpers for optional dependency checks."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import functools
|
|
6
|
+
import json
|
|
7
|
+
import os
|
|
8
|
+
from importlib.util import find_spec
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import TYPE_CHECKING, TypeVar
|
|
11
|
+
|
|
12
|
+
import typer
|
|
13
|
+
|
|
14
|
+
from agent_cli.config import load_config
|
|
15
|
+
from agent_cli.core.utils import console, print_error_message
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from collections.abc import Callable
|
|
19
|
+
|
|
20
|
+
F = TypeVar("F", bound="Callable[..., object]")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _get_auto_install_setting() -> bool:
|
|
24
|
+
"""Check if auto-install is enabled (default: True)."""
|
|
25
|
+
if os.environ.get("AGENT_CLI_NO_AUTO_INSTALL", "").lower() in ("1", "true", "yes"):
|
|
26
|
+
return False
|
|
27
|
+
return load_config().get("settings", {}).get("auto_install_extras", True)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Load extras from JSON file
|
|
31
|
+
_EXTRAS_FILE = Path(__file__).parent.parent / "_extras.json"
|
|
32
|
+
EXTRAS: dict[str, tuple[str, list[str]]] = {
|
|
33
|
+
k: (v[0], v[1]) for k, v in json.loads(_EXTRAS_FILE.read_text()).items()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _check_package_installed(pkg: str) -> bool:
|
|
38
|
+
"""Check if a single package is installed."""
|
|
39
|
+
top_module = pkg.split(".")[0]
|
|
40
|
+
try:
|
|
41
|
+
return find_spec(top_module) is not None
|
|
42
|
+
except (ValueError, ModuleNotFoundError):
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def check_extra_installed(extra: str) -> bool:
|
|
47
|
+
"""Check if packages for an extra are installed using find_spec (no actual import).
|
|
48
|
+
|
|
49
|
+
Supports `|` syntax for alternatives: "piper|kokoro" means ANY of these extras.
|
|
50
|
+
For regular extras, ALL packages must be installed.
|
|
51
|
+
"""
|
|
52
|
+
# Handle "extra1|extra2" syntax - any of these extras is sufficient
|
|
53
|
+
if "|" in extra:
|
|
54
|
+
return any(check_extra_installed(e) for e in extra.split("|"))
|
|
55
|
+
|
|
56
|
+
if extra not in EXTRAS:
|
|
57
|
+
return False # Unknown extra, trigger install attempt to surface error
|
|
58
|
+
_, packages = EXTRAS[extra]
|
|
59
|
+
|
|
60
|
+
# All packages must be installed
|
|
61
|
+
return all(_check_package_installed(pkg) for pkg in packages)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _format_extra_item(extra: str) -> str:
|
|
65
|
+
"""Format a single extra as a list item with description."""
|
|
66
|
+
desc, _ = EXTRAS.get(extra, ("", []))
|
|
67
|
+
if desc:
|
|
68
|
+
return f" - '{extra}' ({desc})"
|
|
69
|
+
return f" - '{extra}'"
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _format_install_commands(extras: list[str]) -> list[str]:
|
|
73
|
+
"""Format install commands for one or more extras."""
|
|
74
|
+
combined = ",".join(extras)
|
|
75
|
+
extras_args = " ".join(extras)
|
|
76
|
+
return [
|
|
77
|
+
"Install with:",
|
|
78
|
+
f' [bold cyan]uv tool install -p 3.13 "agent-cli\\[{combined}]"[/bold cyan]',
|
|
79
|
+
" # or",
|
|
80
|
+
f" [bold cyan]agent-cli install-extras {extras_args}[/bold cyan]",
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def get_install_hint(extra: str) -> str:
|
|
85
|
+
"""Get install command hint for a single extra.
|
|
86
|
+
|
|
87
|
+
Supports `|` syntax for alternatives: "piper|kokoro" shows both options.
|
|
88
|
+
"""
|
|
89
|
+
# Handle "extra1|extra2" syntax - show all options
|
|
90
|
+
if "|" in extra:
|
|
91
|
+
alternatives = extra.split("|")
|
|
92
|
+
lines = ["This command requires one of:"]
|
|
93
|
+
lines.extend(_format_extra_item(alt) for alt in alternatives)
|
|
94
|
+
lines.append("")
|
|
95
|
+
lines.append("Install one with:")
|
|
96
|
+
lines.extend(
|
|
97
|
+
f' [bold cyan]uv tool install -p 3.13 "agent-cli\\[{alt}]"[/bold cyan]'
|
|
98
|
+
for alt in alternatives
|
|
99
|
+
)
|
|
100
|
+
lines.append(" # or")
|
|
101
|
+
lines.extend(
|
|
102
|
+
f" [bold cyan]agent-cli install-extras {alt}[/bold cyan]" for alt in alternatives
|
|
103
|
+
)
|
|
104
|
+
return "\n".join(lines)
|
|
105
|
+
|
|
106
|
+
desc, _ = EXTRAS.get(extra, ("", []))
|
|
107
|
+
header = f"This command requires the '{extra}' extra"
|
|
108
|
+
if desc:
|
|
109
|
+
header += f" ({desc})"
|
|
110
|
+
header += "."
|
|
111
|
+
|
|
112
|
+
lines = [header, ""]
|
|
113
|
+
lines.extend(_format_install_commands([extra]))
|
|
114
|
+
return "\n".join(lines)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def get_combined_install_hint(extras: list[str]) -> str:
|
|
118
|
+
"""Get a combined install hint for multiple missing extras."""
|
|
119
|
+
if len(extras) == 1:
|
|
120
|
+
return get_install_hint(extras[0])
|
|
121
|
+
|
|
122
|
+
lines = ["This command requires the following extras:"]
|
|
123
|
+
lines.extend(_format_extra_item(extra) for extra in extras)
|
|
124
|
+
lines.append("")
|
|
125
|
+
lines.extend(_format_install_commands(extras))
|
|
126
|
+
return "\n".join(lines)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _try_auto_install(missing: list[str]) -> bool:
|
|
130
|
+
"""Attempt to auto-install missing extras. Returns True if successful."""
|
|
131
|
+
from agent_cli.install.extras import install_extras_programmatic # noqa: PLC0415
|
|
132
|
+
|
|
133
|
+
# Flatten alternatives (e.g., "piper|kokoro" -> just pick the first one)
|
|
134
|
+
extras_to_install = []
|
|
135
|
+
for extra in missing:
|
|
136
|
+
if "|" in extra:
|
|
137
|
+
# For alternatives, install the first option
|
|
138
|
+
extras_to_install.append(extra.split("|")[0])
|
|
139
|
+
else:
|
|
140
|
+
extras_to_install.append(extra)
|
|
141
|
+
|
|
142
|
+
console.print(
|
|
143
|
+
f"[yellow]Auto-installing missing extras: {', '.join(extras_to_install)}[/]",
|
|
144
|
+
)
|
|
145
|
+
return install_extras_programmatic(extras_to_install)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _check_and_install_extras(extras: tuple[str, ...]) -> list[str]:
|
|
149
|
+
"""Check for missing extras and attempt auto-install. Returns list of still-missing."""
|
|
150
|
+
missing = [e for e in extras if not check_extra_installed(e)]
|
|
151
|
+
if not missing:
|
|
152
|
+
return []
|
|
153
|
+
|
|
154
|
+
if not _get_auto_install_setting():
|
|
155
|
+
print_error_message(get_combined_install_hint(missing))
|
|
156
|
+
return missing
|
|
157
|
+
|
|
158
|
+
if not _try_auto_install(missing):
|
|
159
|
+
print_error_message("Auto-install failed.\n" + get_combined_install_hint(missing))
|
|
160
|
+
return missing
|
|
161
|
+
|
|
162
|
+
console.print("[green]Installation complete![/]")
|
|
163
|
+
still_missing = [e for e in extras if not check_extra_installed(e)]
|
|
164
|
+
if still_missing:
|
|
165
|
+
print_error_message(
|
|
166
|
+
"Auto-install completed but some dependencies are still missing.\n"
|
|
167
|
+
+ get_combined_install_hint(still_missing),
|
|
168
|
+
)
|
|
169
|
+
return still_missing
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def requires_extras(*extras: str) -> Callable[[F], F]:
|
|
173
|
+
"""Decorator to declare required extras for a command.
|
|
174
|
+
|
|
175
|
+
Auto-installs missing extras by default. Disable via AGENT_CLI_NO_AUTO_INSTALL=1
|
|
176
|
+
or config [settings] auto_install_extras = false.
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
def decorator(func: F) -> F:
|
|
180
|
+
func._required_extras = extras # type: ignore[attr-defined]
|
|
181
|
+
|
|
182
|
+
@functools.wraps(func)
|
|
183
|
+
def wrapper(*args: object, **kwargs: object) -> object:
|
|
184
|
+
if _check_and_install_extras(extras):
|
|
185
|
+
raise typer.Exit(1)
|
|
186
|
+
return func(*args, **kwargs)
|
|
187
|
+
|
|
188
|
+
wrapper._required_extras = extras # type: ignore[attr-defined]
|
|
189
|
+
return wrapper # type: ignore[return-value]
|
|
190
|
+
|
|
191
|
+
return decorator
|
|
@@ -211,8 +211,8 @@ def print_output_panel(
|
|
|
211
211
|
|
|
212
212
|
|
|
213
213
|
def print_error_message(message: str, suggestion: str | None = None) -> None:
|
|
214
|
-
"""Prints an error message in a panel."""
|
|
215
|
-
error_text = Text(message)
|
|
214
|
+
"""Prints an error message in a panel with rich markup support."""
|
|
215
|
+
error_text = Text.from_markup(message)
|
|
216
216
|
if suggestion:
|
|
217
217
|
error_text.append("\n\n")
|
|
218
218
|
error_text.append(suggestion)
|
|
@@ -86,6 +86,38 @@ def _install_cmd() -> list[str]:
|
|
|
86
86
|
return cmd
|
|
87
87
|
|
|
88
88
|
|
|
89
|
+
def _install_extras_impl(extras: list[str], *, quiet: bool = False) -> bool:
|
|
90
|
+
"""Install extras. Returns True on success, False on failure."""
|
|
91
|
+
if _is_uv_tool_install():
|
|
92
|
+
current_extras = _get_current_uv_tool_extras()
|
|
93
|
+
new_extras = sorted(set(current_extras) | set(extras))
|
|
94
|
+
return _install_via_uv_tool(new_extras)
|
|
95
|
+
|
|
96
|
+
cmd = _install_cmd()
|
|
97
|
+
for extra in extras:
|
|
98
|
+
req_file = _requirements_path(extra)
|
|
99
|
+
if not quiet:
|
|
100
|
+
console.print(f"Installing [cyan]{extra}[/]...")
|
|
101
|
+
result = subprocess.run(
|
|
102
|
+
[*cmd, "-r", str(req_file)],
|
|
103
|
+
check=False,
|
|
104
|
+
capture_output=quiet,
|
|
105
|
+
)
|
|
106
|
+
if result.returncode != 0:
|
|
107
|
+
return False
|
|
108
|
+
return True
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def install_extras_programmatic(extras: list[str], *, quiet: bool = False) -> bool:
|
|
112
|
+
"""Install extras programmatically (for auto-install feature)."""
|
|
113
|
+
available = _available_extras()
|
|
114
|
+
valid = [e for e in extras if e in available]
|
|
115
|
+
invalid = [e for e in extras if e not in available]
|
|
116
|
+
if invalid:
|
|
117
|
+
console.print(f"[yellow]Unknown extras (skipped): {', '.join(invalid)}[/]")
|
|
118
|
+
return bool(valid) and _install_extras_impl(valid, quiet=quiet)
|
|
119
|
+
|
|
120
|
+
|
|
89
121
|
@app.command("install-extras", rich_help_panel="Installation")
|
|
90
122
|
def install_extras(
|
|
91
123
|
extras: Annotated[list[str] | None, typer.Argument(help="Extras to install")] = None,
|
|
@@ -128,25 +160,11 @@ def install_extras(
|
|
|
128
160
|
print_error_message(f"Unknown extras: {invalid}. Use --list to see available.")
|
|
129
161
|
raise typer.Exit(1)
|
|
130
162
|
|
|
131
|
-
|
|
163
|
+
if not _install_extras_impl(extras):
|
|
164
|
+
print_error_message("Failed to install extras")
|
|
165
|
+
raise typer.Exit(1)
|
|
166
|
+
|
|
132
167
|
if _is_uv_tool_install():
|
|
133
|
-
current_extras = _get_current_uv_tool_extras()
|
|
134
|
-
new_extras = sorted(set(current_extras) | set(extras))
|
|
135
|
-
if not _install_via_uv_tool(new_extras):
|
|
136
|
-
print_error_message("Failed to reinstall via uv tool")
|
|
137
|
-
raise typer.Exit(1)
|
|
138
168
|
console.print("[green]Done! Extras will persist across uv tool upgrade.[/]")
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
# Standard pip/uv pip install for non-tool environments
|
|
142
|
-
cmd = _install_cmd()
|
|
143
|
-
|
|
144
|
-
for extra in extras:
|
|
145
|
-
req_file = _requirements_path(extra)
|
|
146
|
-
console.print(f"Installing [cyan]{extra}[/]...")
|
|
147
|
-
result = subprocess.run([*cmd, "-r", str(req_file)], check=False)
|
|
148
|
-
if result.returncode != 0:
|
|
149
|
-
print_error_message(f"Failed to install '{extra}'")
|
|
150
|
-
raise typer.Exit(1)
|
|
151
|
-
|
|
152
|
-
console.print("[green]Done![/]")
|
|
169
|
+
else:
|
|
170
|
+
console.print("[green]Done![/]")
|
|
@@ -65,8 +65,8 @@ faster-whisper = [
|
|
|
65
65
|
"faster-whisper>=1.0.0",
|
|
66
66
|
]
|
|
67
67
|
mlx-whisper = [
|
|
68
|
-
"fastapi[standard]",
|
|
69
|
-
"mlx-whisper>=0.4.0",
|
|
68
|
+
"fastapi[standard]; sys_platform == 'darwin' and platform_machine == 'arm64'",
|
|
69
|
+
"mlx-whisper>=0.4.0; sys_platform == 'darwin' and platform_machine == 'arm64'",
|
|
70
70
|
]
|
|
71
71
|
piper = [
|
|
72
72
|
"fastapi[standard]",
|