agent-cli 0.70.2__py3-none-any.whl → 0.70.3__py3-none-any.whl

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/opts.py CHANGED
@@ -26,6 +26,7 @@ LLM_PROVIDER: str = typer.Option(
26
26
  ASR_PROVIDER: str = typer.Option(
27
27
  "wyoming",
28
28
  "--asr-provider",
29
+ envvar="ASR_PROVIDER",
29
30
  help="The ASR provider to use ('wyoming', 'openai', 'gemini').",
30
31
  rich_help_panel="Provider Selection",
31
32
  )
@@ -124,12 +125,14 @@ LIST_DEVICES: bool = typer.Option(
124
125
  ASR_WYOMING_IP: str = typer.Option(
125
126
  "localhost",
126
127
  "--asr-wyoming-ip",
128
+ envvar="ASR_WYOMING_IP",
127
129
  help="Wyoming ASR server IP address.",
128
130
  rich_help_panel="Audio Input: Wyoming",
129
131
  )
130
132
  ASR_WYOMING_PORT: int = typer.Option(
131
133
  10300,
132
134
  "--asr-wyoming-port",
135
+ envvar="ASR_WYOMING_PORT",
133
136
  help="Wyoming ASR server port.",
134
137
  rich_help_panel="Audio Input: Wyoming",
135
138
  )
@@ -3,8 +3,9 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import logging
6
+ import os
6
7
  from pathlib import Path
7
- from typing import Annotated, Any
8
+ from typing import TYPE_CHECKING, Annotated, Any
8
9
 
9
10
  from fastapi import Depends, FastAPI, File, Form, HTTPException, Request, UploadFile
10
11
  from pydantic import BaseModel
@@ -26,6 +27,9 @@ from agent_cli.server.common import log_requests_middleware
26
27
  from agent_cli.services import asr
27
28
  from agent_cli.services.llm import process_and_update_clipboard
28
29
 
30
+ if TYPE_CHECKING:
31
+ from typer.models import OptionInfo
32
+
29
33
  # Configure logging
30
34
  logging.basicConfig(level=logging.INFO)
31
35
  LOGGER = logging.getLogger(__name__)
@@ -153,6 +157,13 @@ def _validate_audio_file(audio: UploadFile) -> None:
153
157
  )
154
158
 
155
159
 
160
+ def _cfg(key: str, defaults: dict[str, Any], opt: OptionInfo) -> Any:
161
+ """Get config with priority: env var > config file > option default."""
162
+ if opt.envvar and (env_val := os.environ.get(opt.envvar)):
163
+ return int(env_val) if isinstance(opt.default, int) else env_val
164
+ return defaults.get(key, opt.default)
165
+
166
+
156
167
  def _load_transcription_configs() -> tuple[
157
168
  config.ProviderSelection,
158
169
  config.WyomingASR,
@@ -163,41 +174,41 @@ def _load_transcription_configs() -> tuple[
163
174
  config.GeminiLLM,
164
175
  dict[str, Any],
165
176
  ]:
166
- """Load and create all required configuration objects."""
177
+ """Load config objects. Priority: env var > config file > default."""
167
178
  loaded_config = config.load_config()
168
179
  wildcard_config = loaded_config.get("defaults", {})
169
180
  command_config = loaded_config.get("transcribe", {})
170
181
  defaults = {**wildcard_config, **command_config}
171
182
 
172
183
  provider_cfg = config.ProviderSelection(
173
- asr_provider=defaults.get("asr_provider", opts.ASR_PROVIDER.default), # type: ignore[attr-defined]
174
- llm_provider=defaults.get("llm_provider", opts.LLM_PROVIDER.default), # type: ignore[attr-defined]
175
- tts_provider=opts.TTS_PROVIDER.default, # type: ignore[attr-defined]
184
+ asr_provider=_cfg("asr_provider", defaults, opts.ASR_PROVIDER),
185
+ llm_provider=_cfg("llm_provider", defaults, opts.LLM_PROVIDER),
186
+ tts_provider=_cfg("tts_provider", defaults, opts.TTS_PROVIDER),
176
187
  )
177
188
  wyoming_asr_cfg = config.WyomingASR(
178
- asr_wyoming_ip=defaults.get("asr_wyoming_ip", opts.ASR_WYOMING_IP.default), # type: ignore[attr-defined]
179
- asr_wyoming_port=defaults.get("asr_wyoming_port", opts.ASR_WYOMING_PORT.default), # type: ignore[attr-defined]
189
+ asr_wyoming_ip=_cfg("asr_wyoming_ip", defaults, opts.ASR_WYOMING_IP),
190
+ asr_wyoming_port=_cfg("asr_wyoming_port", defaults, opts.ASR_WYOMING_PORT),
180
191
  )
181
192
  openai_asr_cfg = config.OpenAIASR(
182
- asr_openai_model=defaults.get("asr_openai_model", opts.ASR_OPENAI_MODEL.default), # type: ignore[attr-defined]
183
- openai_api_key=defaults.get("openai_api_key", opts.OPENAI_API_KEY.default), # type: ignore[attr-defined,union-attr]
193
+ asr_openai_model=_cfg("asr_openai_model", defaults, opts.ASR_OPENAI_MODEL),
194
+ openai_api_key=_cfg("openai_api_key", defaults, opts.OPENAI_API_KEY),
184
195
  )
185
196
  gemini_asr_cfg = config.GeminiASR(
186
- asr_gemini_model=defaults.get("asr_gemini_model", opts.ASR_GEMINI_MODEL.default), # type: ignore[attr-defined]
187
- gemini_api_key=defaults.get("gemini_api_key", opts.GEMINI_API_KEY.default), # type: ignore[attr-defined,union-attr]
197
+ asr_gemini_model=_cfg("asr_gemini_model", defaults, opts.ASR_GEMINI_MODEL),
198
+ gemini_api_key=_cfg("gemini_api_key", defaults, opts.GEMINI_API_KEY),
188
199
  )
189
200
  ollama_cfg = config.Ollama(
190
- llm_ollama_model=defaults.get("llm_ollama_model", opts.LLM_OLLAMA_MODEL.default), # type: ignore[attr-defined]
191
- llm_ollama_host=defaults.get("llm_ollama_host", opts.LLM_OLLAMA_HOST.default), # type: ignore[attr-defined]
201
+ llm_ollama_model=_cfg("llm_ollama_model", defaults, opts.LLM_OLLAMA_MODEL),
202
+ llm_ollama_host=_cfg("llm_ollama_host", defaults, opts.LLM_OLLAMA_HOST),
192
203
  )
193
204
  openai_llm_cfg = config.OpenAILLM(
194
- llm_openai_model=defaults.get("llm_openai_model", opts.LLM_OPENAI_MODEL.default), # type: ignore[attr-defined]
195
- openai_api_key=defaults.get("openai_api_key", opts.OPENAI_API_KEY.default), # type: ignore[attr-defined,union-attr]
196
- openai_base_url=defaults.get("openai_base_url", opts.OPENAI_BASE_URL.default), # type: ignore[attr-defined,union-attr]
205
+ llm_openai_model=_cfg("llm_openai_model", defaults, opts.LLM_OPENAI_MODEL),
206
+ openai_api_key=_cfg("openai_api_key", defaults, opts.OPENAI_API_KEY),
207
+ openai_base_url=_cfg("openai_base_url", defaults, opts.OPENAI_BASE_URL),
197
208
  )
198
209
  gemini_llm_cfg = config.GeminiLLM(
199
- llm_gemini_model=defaults.get("llm_gemini_model", opts.LLM_GEMINI_MODEL.default), # type: ignore[attr-defined]
200
- gemini_api_key=defaults.get("gemini_api_key", opts.GEMINI_API_KEY.default), # type: ignore[attr-defined,union-attr]
210
+ llm_gemini_model=_cfg("llm_gemini_model", defaults, opts.LLM_GEMINI_MODEL),
211
+ gemini_api_key=_cfg("gemini_api_key", defaults, opts.GEMINI_API_KEY),
201
212
  )
202
213
 
203
214
  return (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.70.2
3
+ Version: 0.70.3
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>
@@ -750,6 +750,7 @@ the `[defaults]` section of your configuration file.
750
750
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
751
751
  ╭─ Provider Selection ───────────────────────────────────────────────────────────────────╮
752
752
  │ --asr-provider TEXT The ASR provider to use ('wyoming', 'openai', 'gemini'). │
753
+ │ [env var: ASR_PROVIDER] │
753
754
  │ [default: wyoming] │
754
755
  │ --llm-provider TEXT The LLM provider to use ('ollama', 'openai', 'gemini'). │
755
756
  │ [default: ollama] │
@@ -762,8 +763,10 @@ the `[defaults]` section of your configuration file.
762
763
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
763
764
  ╭─ Audio Input: Wyoming ─────────────────────────────────────────────────────────────────╮
764
765
  │ --asr-wyoming-ip TEXT Wyoming ASR server IP address. │
766
+ │ [env var: ASR_WYOMING_IP] │
765
767
  │ [default: localhost] │
766
768
  │ --asr-wyoming-port INTEGER Wyoming ASR server port. │
769
+ │ [env var: ASR_WYOMING_PORT] │
767
770
  │ [default: 10300] │
768
771
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
769
772
  ╭─ Audio Input: OpenAI-compatible ───────────────────────────────────────────────────────╮
@@ -924,6 +927,7 @@ uv tool install "agent-cli[vad]" -p 3.13
924
927
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
925
928
  ╭─ Provider Selection ───────────────────────────────────────────────────────────────────╮
926
929
  │ --asr-provider TEXT The ASR provider to use ('wyoming', 'openai', 'gemini'). │
930
+ │ [env var: ASR_PROVIDER] │
927
931
  │ [default: wyoming] │
928
932
  │ --llm-provider TEXT The LLM provider to use ('ollama', 'openai', 'gemini'). │
929
933
  │ [default: ollama] │
@@ -936,8 +940,10 @@ uv tool install "agent-cli[vad]" -p 3.13
936
940
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
937
941
  ╭─ Audio Input: Wyoming ─────────────────────────────────────────────────────────────────╮
938
942
  │ --asr-wyoming-ip TEXT Wyoming ASR server IP address. │
943
+ │ [env var: ASR_WYOMING_IP] │
939
944
  │ [default: localhost] │
940
945
  │ --asr-wyoming-port INTEGER Wyoming ASR server port. │
946
+ │ [env var: ASR_WYOMING_PORT] │
941
947
  │ [default: 10300] │
942
948
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
943
949
  ╭─ Audio Input: OpenAI-compatible ───────────────────────────────────────────────────────╮
@@ -1170,6 +1176,7 @@ uv tool install "agent-cli[vad]" -p 3.13
1170
1176
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
1171
1177
  ╭─ Provider Selection ───────────────────────────────────────────────────────────────────╮
1172
1178
  │ --asr-provider TEXT The ASR provider to use ('wyoming', 'openai', 'gemini'). │
1179
+ │ [env var: ASR_PROVIDER] │
1173
1180
  │ [default: wyoming] │
1174
1181
  │ --llm-provider TEXT The LLM provider to use ('ollama', 'openai', 'gemini'). │
1175
1182
  │ [default: ollama] │
@@ -1185,8 +1192,10 @@ uv tool install "agent-cli[vad]" -p 3.13
1185
1192
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
1186
1193
  ╭─ Audio Input: Wyoming ─────────────────────────────────────────────────────────────────╮
1187
1194
  │ --asr-wyoming-ip TEXT Wyoming ASR server IP address. │
1195
+ │ [env var: ASR_WYOMING_IP] │
1188
1196
  │ [default: localhost] │
1189
1197
  │ --asr-wyoming-port INTEGER Wyoming ASR server port. │
1198
+ │ [env var: ASR_WYOMING_PORT] │
1190
1199
  │ [default: 10300] │
1191
1200
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
1192
1201
  ╭─ Audio Input: OpenAI-compatible ───────────────────────────────────────────────────────╮
@@ -1335,6 +1344,7 @@ uv tool install "agent-cli[vad]" -p 3.13
1335
1344
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
1336
1345
  ╭─ Provider Selection ───────────────────────────────────────────────────────────────────╮
1337
1346
  │ --asr-provider TEXT The ASR provider to use ('wyoming', 'openai', 'gemini'). │
1347
+ │ [env var: ASR_PROVIDER] │
1338
1348
  │ [default: wyoming] │
1339
1349
  │ --llm-provider TEXT The LLM provider to use ('ollama', 'openai', 'gemini'). │
1340
1350
  │ [default: ollama] │
@@ -1359,8 +1369,10 @@ uv tool install "agent-cli[vad]" -p 3.13
1359
1369
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
1360
1370
  ╭─ Audio Input: Wyoming ─────────────────────────────────────────────────────────────────╮
1361
1371
  │ --asr-wyoming-ip TEXT Wyoming ASR server IP address. │
1372
+ │ [env var: ASR_WYOMING_IP] │
1362
1373
  │ [default: localhost] │
1363
1374
  │ --asr-wyoming-port INTEGER Wyoming ASR server port. │
1375
+ │ [env var: ASR_WYOMING_PORT] │
1364
1376
  │ [default: 10300] │
1365
1377
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
1366
1378
  ╭─ Audio Input: OpenAI-compatible ───────────────────────────────────────────────────────╮
@@ -1514,6 +1526,7 @@ uv tool install "agent-cli[vad]" -p 3.13
1514
1526
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
1515
1527
  ╭─ Provider Selection ───────────────────────────────────────────────────────────────────╮
1516
1528
  │ --asr-provider TEXT The ASR provider to use ('wyoming', 'openai', 'gemini'). │
1529
+ │ [env var: ASR_PROVIDER] │
1517
1530
  │ [default: wyoming] │
1518
1531
  │ --llm-provider TEXT The LLM provider to use ('ollama', 'openai', 'gemini'). │
1519
1532
  │ [default: ollama] │
@@ -1529,8 +1542,10 @@ uv tool install "agent-cli[vad]" -p 3.13
1529
1542
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
1530
1543
  ╭─ Audio Input: Wyoming ─────────────────────────────────────────────────────────────────╮
1531
1544
  │ --asr-wyoming-ip TEXT Wyoming ASR server IP address. │
1545
+ │ [env var: ASR_WYOMING_IP] │
1532
1546
  │ [default: localhost] │
1533
1547
  │ --asr-wyoming-port INTEGER Wyoming ASR server port. │
1548
+ │ [env var: ASR_WYOMING_PORT] │
1534
1549
  │ [default: 10300] │
1535
1550
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
1536
1551
  ╭─ Audio Input: OpenAI-compatible ───────────────────────────────────────────────────────╮
@@ -9,7 +9,7 @@ agent_cli/config_cmd.py,sha256=CiHk1WxtvT21QeMuklTTMCmAdNwjeYENO_w_Qbiys54,9579
9
9
  agent_cli/constants.py,sha256=-Q17N6qKIGqPDsu3FxpIKP33G0Cs0RUJlHwYNHxVxek,843
10
10
  agent_cli/docs_gen.py,sha256=j6mBHwoPcQzMdgIWi_bB2A6yOyhvmW_cntRfwUg_8p8,13374
11
11
  agent_cli/example-config.toml,sha256=xd9BXeOqdYx4xFJt58VBs2I49ESy6dF4-mWF_g8sM9o,7552
12
- agent_cli/opts.py,sha256=qMK_mLxzGAbX7C2IYuCFvOkLgaxCCMO66I9ps8AdrYo,12114
12
+ agent_cli/opts.py,sha256=Sa9sclTRhCr9ad1YcbV-qz7BTtlUmp0uwfAD1fZ3xng,12201
13
13
  agent_cli/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  agent_cli/_requirements/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  agent_cli/_requirements/audio.txt,sha256=KAOtFaFClkj2EAesWI61LZ4N-T1WQvHtvf1sNtDxVgQ,1522
@@ -162,7 +162,7 @@ agent_cli/server/model_manager.py,sha256=93l_eeZeqnPALyDIK24or61tvded9TbM8tnde0o
162
162
  agent_cli/server/model_registry.py,sha256=KrRV1XxbFYuXu5rJlHFh6PTl_2BKiWnWsaNrf-0c6wQ,6988
163
163
  agent_cli/server/streaming.py,sha256=nX_kMNQBxdzvPKUcFQWth7dDBYALRGy_j9mDunKXaJE,2191
164
164
  agent_cli/server/proxy/__init__.py,sha256=fOq5bs5B9XKfr7XbdZ825RIxheAJA0VKmKantykjTE4,83
165
- agent_cli/server/proxy/api.py,sha256=gTfa_yxfiTv_L44Ii56-cW9lQ9ih8elwoNvGJuXIQpk,13829
165
+ agent_cli/server/proxy/api.py,sha256=ZsfG7fEF15JE5cVFp2K8Ivadbdxw2q9LHGsTdi4EU2w,13650
166
166
  agent_cli/server/tts/__init__.py,sha256=o1TlYmsGeqo-LDZg86KEhLJYWzN7jtMNGS5S8HFUSkw,93
167
167
  agent_cli/server/tts/api.py,sha256=GLOJEC4yMlWjz6AjrWBdZLs368DddP27PMvgqVlVCFc,10598
168
168
  agent_cli/server/tts/model_manager.py,sha256=TlBc0Q1iitDfNi8uYXyb1CaJr8Kt62SDyFIsCyVm7DY,6116
@@ -188,8 +188,8 @@ agent_cli/services/asr.py,sha256=aRaCLVCygsJ15qyQEPECOZsdSrnlLPbyY4RwAqY0qIw,172
188
188
  agent_cli/services/llm.py,sha256=i01utl1eYWlM13gvW2eR6ErL_ndH-g0d-BSleZra_7k,7229
189
189
  agent_cli/services/tts.py,sha256=NX5Qnq7ddLI3mwm3nzhbR3zB1Os4Ip4sSVSjDZDTBcI,14855
190
190
  agent_cli/services/wake_word.py,sha256=JFJ1SA22H4yko9DXiQ1t7fcoxeALLAe3iBrLs0z8rX4,4664
191
- agent_cli-0.70.2.dist-info/METADATA,sha256=dbmxmB1vMxwjh_HSrSVHY1yQKEePFYDB5xzVCEDK2ew,156132
192
- agent_cli-0.70.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
193
- agent_cli-0.70.2.dist-info/entry_points.txt,sha256=FUv-fB2atLsPUk_RT4zqnZl1coz4_XHFwRALOKOF38s,97
194
- agent_cli-0.70.2.dist-info/licenses/LICENSE,sha256=majJU6S9kC8R8bW39NVBHyv32Dq50FL6TDxECG2WVts,1068
195
- agent_cli-0.70.2.dist-info/RECORD,,
191
+ agent_cli-0.70.3.dist-info/METADATA,sha256=ZRTUfqIxUcFdkbEMuk7-R_-z6cIZQF3y53D8q8u75u0,157557
192
+ agent_cli-0.70.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
193
+ agent_cli-0.70.3.dist-info/entry_points.txt,sha256=FUv-fB2atLsPUk_RT4zqnZl1coz4_XHFwRALOKOF38s,97
194
+ agent_cli-0.70.3.dist-info/licenses/LICENSE,sha256=majJU6S9kC8R8bW39NVBHyv32Dq50FL6TDxECG2WVts,1068
195
+ agent_cli-0.70.3.dist-info/RECORD,,