llms-py 2.0.20__py3-none-any.whl → 3.0.10__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.
Files changed (190) hide show
  1. llms/__init__.py +3 -1
  2. llms/db.py +359 -0
  3. llms/{ui/Analytics.mjs → extensions/analytics/ui/index.mjs} +254 -327
  4. llms/extensions/app/README.md +20 -0
  5. llms/extensions/app/__init__.py +589 -0
  6. llms/extensions/app/db.py +536 -0
  7. llms/{ui → extensions/app/ui}/Recents.mjs +99 -73
  8. llms/{ui/Sidebar.mjs → extensions/app/ui/index.mjs} +139 -68
  9. llms/extensions/app/ui/threadStore.mjs +433 -0
  10. llms/extensions/core_tools/CALCULATOR.md +32 -0
  11. llms/extensions/core_tools/__init__.py +637 -0
  12. llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +201 -0
  13. llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +185 -0
  14. llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +101 -0
  15. llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +160 -0
  16. llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +66 -0
  17. llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +27 -0
  18. llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +72 -0
  19. llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +119 -0
  20. llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +98 -0
  21. llms/extensions/core_tools/ui/codemirror/codemirror.css +344 -0
  22. llms/extensions/core_tools/ui/codemirror/codemirror.js +9884 -0
  23. llms/extensions/core_tools/ui/codemirror/doc/docs.css +225 -0
  24. llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  25. llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +942 -0
  26. llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +118 -0
  27. llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +962 -0
  28. llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +62 -0
  29. llms/extensions/core_tools/ui/codemirror/mode/python/python.js +402 -0
  30. llms/extensions/core_tools/ui/codemirror/theme/dracula.css +40 -0
  31. llms/extensions/core_tools/ui/codemirror/theme/mocha.css +135 -0
  32. llms/extensions/core_tools/ui/index.mjs +650 -0
  33. llms/extensions/gallery/README.md +61 -0
  34. llms/extensions/gallery/__init__.py +63 -0
  35. llms/extensions/gallery/db.py +243 -0
  36. llms/extensions/gallery/ui/index.mjs +482 -0
  37. llms/extensions/katex/README.md +39 -0
  38. llms/extensions/katex/__init__.py +6 -0
  39. llms/extensions/katex/ui/README.md +125 -0
  40. llms/extensions/katex/ui/contrib/auto-render.js +338 -0
  41. llms/extensions/katex/ui/contrib/auto-render.min.js +1 -0
  42. llms/extensions/katex/ui/contrib/auto-render.mjs +244 -0
  43. llms/extensions/katex/ui/contrib/copy-tex.js +127 -0
  44. llms/extensions/katex/ui/contrib/copy-tex.min.js +1 -0
  45. llms/extensions/katex/ui/contrib/copy-tex.mjs +105 -0
  46. llms/extensions/katex/ui/contrib/mathtex-script-type.js +109 -0
  47. llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +1 -0
  48. llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +24 -0
  49. llms/extensions/katex/ui/contrib/mhchem.js +3213 -0
  50. llms/extensions/katex/ui/contrib/mhchem.min.js +1 -0
  51. llms/extensions/katex/ui/contrib/mhchem.mjs +3109 -0
  52. llms/extensions/katex/ui/contrib/render-a11y-string.js +887 -0
  53. llms/extensions/katex/ui/contrib/render-a11y-string.min.js +1 -0
  54. llms/extensions/katex/ui/contrib/render-a11y-string.mjs +800 -0
  55. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  56. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  57. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  58. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  59. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  60. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  61. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  62. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  63. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  64. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  65. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  66. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  67. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  68. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  69. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  70. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  71. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  72. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  73. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  74. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  75. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  76. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  77. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  78. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  79. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  80. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  81. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  82. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  83. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  84. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  85. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  86. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  87. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  88. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  89. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  90. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  91. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  92. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  93. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  94. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  95. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  96. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  97. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  98. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  99. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  100. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  101. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  102. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  103. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  104. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  105. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  106. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  107. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  108. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  109. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  110. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  111. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  112. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  113. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  114. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  115. llms/extensions/katex/ui/index.mjs +92 -0
  116. llms/extensions/katex/ui/katex-swap.css +1230 -0
  117. llms/extensions/katex/ui/katex-swap.min.css +1 -0
  118. llms/extensions/katex/ui/katex.css +1230 -0
  119. llms/extensions/katex/ui/katex.js +19080 -0
  120. llms/extensions/katex/ui/katex.min.css +1 -0
  121. llms/extensions/katex/ui/katex.min.js +1 -0
  122. llms/extensions/katex/ui/katex.min.mjs +1 -0
  123. llms/extensions/katex/ui/katex.mjs +18547 -0
  124. llms/extensions/providers/__init__.py +22 -0
  125. llms/extensions/providers/anthropic.py +233 -0
  126. llms/extensions/providers/cerebras.py +37 -0
  127. llms/extensions/providers/chutes.py +153 -0
  128. llms/extensions/providers/google.py +481 -0
  129. llms/extensions/providers/nvidia.py +103 -0
  130. llms/extensions/providers/openai.py +154 -0
  131. llms/extensions/providers/openrouter.py +74 -0
  132. llms/extensions/providers/zai.py +182 -0
  133. llms/extensions/system_prompts/README.md +22 -0
  134. llms/extensions/system_prompts/__init__.py +45 -0
  135. llms/extensions/system_prompts/ui/index.mjs +280 -0
  136. llms/extensions/system_prompts/ui/prompts.json +1067 -0
  137. llms/extensions/tools/__init__.py +144 -0
  138. llms/extensions/tools/ui/index.mjs +706 -0
  139. llms/index.html +36 -62
  140. llms/llms.json +180 -879
  141. llms/main.py +3640 -899
  142. llms/providers-extra.json +394 -0
  143. llms/providers.json +1 -0
  144. llms/ui/App.mjs +176 -8
  145. llms/ui/ai.mjs +156 -20
  146. llms/ui/app.css +3161 -244
  147. llms/ui/ctx.mjs +412 -0
  148. llms/ui/index.mjs +131 -0
  149. llms/ui/lib/chart.js +14 -0
  150. llms/ui/lib/charts.mjs +16 -0
  151. llms/ui/lib/color.js +14 -0
  152. llms/ui/lib/highlight.min.mjs +1243 -0
  153. llms/ui/lib/idb.min.mjs +8 -0
  154. llms/ui/lib/marked.min.mjs +8 -0
  155. llms/ui/lib/servicestack-client.mjs +1 -0
  156. llms/ui/lib/servicestack-vue.mjs +37 -0
  157. llms/ui/lib/vue-router.min.mjs +6 -0
  158. llms/ui/lib/vue.min.mjs +13 -0
  159. llms/ui/lib/vue.mjs +18530 -0
  160. llms/ui/markdown.mjs +25 -14
  161. llms/ui/modules/chat/ChatBody.mjs +976 -0
  162. llms/ui/{SettingsDialog.mjs → modules/chat/SettingsDialog.mjs} +74 -74
  163. llms/ui/modules/chat/index.mjs +991 -0
  164. llms/ui/modules/icons.mjs +46 -0
  165. llms/ui/modules/layout.mjs +271 -0
  166. llms/ui/modules/model-selector.mjs +811 -0
  167. llms/ui/tailwind.input.css +550 -78
  168. llms/ui/typography.css +54 -36
  169. llms/ui/utils.mjs +197 -92
  170. llms_py-3.0.10.dist-info/METADATA +49 -0
  171. llms_py-3.0.10.dist-info/RECORD +177 -0
  172. {llms_py-2.0.20.dist-info → llms_py-3.0.10.dist-info}/licenses/LICENSE +1 -2
  173. llms/ui/Avatar.mjs +0 -28
  174. llms/ui/Brand.mjs +0 -34
  175. llms/ui/ChatPrompt.mjs +0 -443
  176. llms/ui/Main.mjs +0 -740
  177. llms/ui/ModelSelector.mjs +0 -60
  178. llms/ui/ProviderIcon.mjs +0 -29
  179. llms/ui/ProviderStatus.mjs +0 -105
  180. llms/ui/SignIn.mjs +0 -64
  181. llms/ui/SystemPromptEditor.mjs +0 -31
  182. llms/ui/SystemPromptSelector.mjs +0 -36
  183. llms/ui/Welcome.mjs +0 -8
  184. llms/ui/threadStore.mjs +0 -524
  185. llms/ui.json +0 -1069
  186. llms_py-2.0.20.dist-info/METADATA +0 -931
  187. llms_py-2.0.20.dist-info/RECORD +0 -36
  188. {llms_py-2.0.20.dist-info → llms_py-3.0.10.dist-info}/WHEEL +0 -0
  189. {llms_py-2.0.20.dist-info → llms_py-3.0.10.dist-info}/entry_points.txt +0 -0
  190. {llms_py-2.0.20.dist-info → llms_py-3.0.10.dist-info}/top_level.txt +0 -0
@@ -1,931 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: llms-py
3
- Version: 2.0.20
4
- Summary: A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers
5
- Home-page: https://github.com/ServiceStack/llms
6
- Author: ServiceStack
7
- Author-email: ServiceStack <team@servicestack.net>
8
- Maintainer-email: ServiceStack <team@servicestack.net>
9
- License-Expression: BSD-3-Clause
10
- Project-URL: Homepage, https://github.com/ServiceStack/llms
11
- Project-URL: Documentation, https://github.com/ServiceStack/llms#readme
12
- Project-URL: Repository, https://github.com/ServiceStack/llms
13
- Project-URL: Bug Reports, https://github.com/ServiceStack/llms/issues
14
- Keywords: llm,ai,openai,anthropic,google,gemini,groq,mistral,ollama,cli,server,chat,completion
15
- Classifier: Development Status :: 5 - Production/Stable
16
- Classifier: Intended Audience :: Developers
17
- Classifier: Intended Audience :: System Administrators
18
- Classifier: Operating System :: OS Independent
19
- Classifier: Programming Language :: Python :: 3
20
- Classifier: Programming Language :: Python :: 3.7
21
- Classifier: Programming Language :: Python :: 3.8
22
- Classifier: Programming Language :: Python :: 3.9
23
- Classifier: Programming Language :: Python :: 3.10
24
- Classifier: Programming Language :: Python :: 3.11
25
- Classifier: Programming Language :: Python :: 3.12
26
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
27
- Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
28
- Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
29
- Classifier: Topic :: System :: Systems Administration
30
- Classifier: Topic :: Utilities
31
- Classifier: Environment :: Console
32
- Requires-Python: >=3.7
33
- Description-Content-Type: text/markdown
34
- License-File: LICENSE
35
- Requires-Dist: aiohttp
36
- Dynamic: author
37
- Dynamic: home-page
38
- Dynamic: license-file
39
- Dynamic: requires-python
40
-
41
- # llms.py
42
-
43
- Lightweight CLI, API and ChatGPT-like alternative to Open WebUI for accessing multiple LLMs, entirely offline, with all data kept private in browser storage.
44
-
45
- Configure additional providers and models in [llms.json](llms/llms.json)
46
- - Mix and match local models with models from different API providers
47
- - Requests automatically routed to available providers that supports the requested model (in defined order)
48
- - Define free/cheapest/local providers first to save on costs
49
- - Any failures are automatically retried on the next available provider
50
-
51
- ## Features
52
-
53
- - **Lightweight**: Single [llms.py](llms.py) Python file with single `aiohttp` dependency
54
- - **Multi-Provider Support**: OpenRouter, Ollama, Anthropic, Google, OpenAI, Grok, Groq, Qwen, Z.ai, Mistral
55
- - **OpenAI-Compatible API**: Works with any client that supports OpenAI's chat completion API
56
- - **Built-in Analytics**: Built-in analytics UI to visualize costs, requests, and token usage
57
- - **Configuration Management**: Easy provider enable/disable and configuration management
58
- - **CLI Interface**: Simple command-line interface for quick interactions
59
- - **Server Mode**: Run an OpenAI-compatible HTTP server at `http://localhost:{PORT}/v1/chat/completions`
60
- - **Image Support**: Process images through vision-capable models
61
- - **Audio Support**: Process audio through audio-capable models
62
- - **Custom Chat Templates**: Configurable chat completion request templates for different modalities
63
- - **Auto-Discovery**: Automatically discover available Ollama models
64
- - **Unified Models**: Define custom model names that map to different provider-specific names
65
- - **Multi-Model Support**: Support for over 160+ different LLMs
66
-
67
- ## llms.py UI
68
-
69
- Access all your local all remote LLMs with a single ChatGPT-like UI:
70
-
71
- [![](https://servicestack.net/img/posts/llms-py-ui/bg.webp)](https://servicestack.net/posts/llms-py-ui)
72
-
73
- **Monthly Costs Analysis**
74
-
75
- [![](https://servicestack.net/img/posts/llms-py-ui/analytics-costs.webp)](https://servicestack.net/posts/llms-py-ui)
76
-
77
- **Monthly Activity Log**
78
-
79
- [![](https://servicestack.net/img/posts/llms-py-ui/analytics-activity.webp)](https://servicestack.net/posts/llms-py-ui)
80
-
81
- [More Features and Screenshots](https://servicestack.net/posts/llms-py-ui).
82
-
83
- ## Installation
84
-
85
- ```bash
86
- pip install llms-py
87
- ```
88
-
89
- ## Quick Start
90
-
91
- ### 1. Set API Keys
92
-
93
- Set environment variables for the providers you want to use:
94
-
95
- ```bash
96
- export OPENROUTER_API_KEY="..."
97
- ```
98
-
99
- | Provider | Variable | Description | Example |
100
- |-----------------|---------------------------|---------------------|---------|
101
- | openrouter_free | `OPENROUTER_API_KEY` | OpenRouter FREE models API key | `sk-or-...` |
102
- | groq | `GROQ_API_KEY` | Groq API key | `gsk_...` |
103
- | google_free | `GOOGLE_FREE_API_KEY` | Google FREE API key | `AIza...` |
104
- | codestral | `CODESTRAL_API_KEY` | Codestral API key | `...` |
105
- | ollama | N/A | No API key required | |
106
- | openrouter | `OPENROUTER_API_KEY` | OpenRouter API key | `sk-or-...` |
107
- | google | `GOOGLE_API_KEY` | Google API key | `AIza...` |
108
- | anthropic | `ANTHROPIC_API_KEY` | Anthropic API key | `sk-ant-...` |
109
- | openai | `OPENAI_API_KEY` | OpenAI API key | `sk-...` |
110
- | grok | `GROK_API_KEY` | Grok (X.AI) API key | `xai-...` |
111
- | qwen | `DASHSCOPE_API_KEY` | Qwen (Alibaba) API key | `sk-...` |
112
- | z.ai | `ZAI_API_KEY` | Z.ai API key | `sk-...` |
113
- | mistral | `MISTRAL_API_KEY` | Mistral API key | `...` |
114
-
115
- ### 2. Enable Providers
116
-
117
- Enable the providers you want to use:
118
-
119
- ```bash
120
- # Enable providers with free models and free tiers
121
- llms --enable openrouter_free google_free groq
122
-
123
- # Enable paid providers
124
- llms --enable openrouter anthropic google openai mistral grok qwen
125
- ```
126
-
127
- ### 3. Run UI
128
-
129
- Start the UI and an OpenAI compatible API on port **8000**:
130
-
131
- ```bash
132
- llms --serve 8000
133
- ```
134
-
135
- Launches the UI at `http://localhost:8000` and an OpenAI Endpoint at `http://localhost:8000/v1/chat/completions`.
136
-
137
- ### 4. Use llms.py CLI
138
-
139
- ```bash
140
- llms "What is the capital of France?"
141
- ```
142
-
143
- ## Configuration
144
-
145
- The configuration file [llms.json](llms/llms.json) is saved to `~/.llms/llms.json` and defines available providers, models, and default settings. Key sections:
146
-
147
- ### Defaults
148
- - `headers`: Common HTTP headers for all requests
149
- - `text`: Default chat completion request template for text prompts
150
-
151
- ### Providers
152
-
153
- Each provider configuration includes:
154
- - `enabled`: Whether the provider is active
155
- - `type`: Provider class (OpenAiProvider, GoogleProvider, etc.)
156
- - `api_key`: API key (supports environment variables with `$VAR_NAME`)
157
- - `base_url`: API endpoint URL
158
- - `models`: Model name mappings (local name → provider name)
159
-
160
-
161
- ## Command Line Usage
162
-
163
- ### Basic Chat
164
-
165
- ```bash
166
- # Simple question
167
- llms "Explain quantum computing"
168
-
169
- # With specific model
170
- llms -m gemini-2.5-pro "Write a Python function to sort a list"
171
- llms -m grok-4 "Explain this code with humor"
172
- llms -m qwen3-max "Translate this to Chinese"
173
-
174
- # With system prompt
175
- llms -s "You are a helpful coding assistant" "How do I reverse a string in Python?"
176
-
177
- # With image (vision models)
178
- llms --image image.jpg "What's in this image?"
179
- llms --image https://example.com/photo.png "Describe this photo"
180
-
181
- # Display full JSON Response
182
- llms "Explain quantum computing" --raw
183
- ```
184
-
185
- ### Using a Chat Template
186
-
187
- By default llms uses the `defaults/text` chat completion request defined in [llms.json](llms/llms.json).
188
-
189
- You can instead use a custom chat completion request with `--chat`, e.g:
190
-
191
- ```bash
192
- # Load chat completion request from JSON file
193
- llms --chat request.json
194
-
195
- # Override user message
196
- llms --chat request.json "New user message"
197
-
198
- # Override model
199
- llms -m kimi-k2 --chat request.json
200
- ```
201
-
202
- Example `request.json`:
203
-
204
- ```json
205
- {
206
- "model": "kimi-k2",
207
- "messages": [
208
- {"role": "system", "content": "You are a helpful assistant."},
209
- {"role": "user", "content": ""}
210
- ],
211
- "temperature": 0.7,
212
- "max_tokens": 150
213
- }
214
- ```
215
-
216
- ### Image Requests
217
-
218
- Send images to vision-capable models using the `--image` option:
219
-
220
- ```bash
221
- # Use defaults/image Chat Template (Describe the key features of the input image)
222
- llms --image ./screenshot.png
223
-
224
- # Local image file
225
- llms --image ./screenshot.png "What's in this image?"
226
-
227
- # Remote image URL
228
- llms --image https://example.org/photo.jpg "Describe this photo"
229
-
230
- # Data URI
231
- llms --image "data:image/png;base64,$(base64 -w 0 image.png)" "Describe this image"
232
-
233
- # With a specific vision model
234
- llms -m gemini-2.5-flash --image chart.png "Analyze this chart"
235
- llms -m qwen2.5vl --image document.jpg "Extract text from this document"
236
-
237
- # Combined with system prompt
238
- llms -s "You are a data analyst" --image graph.png "What trends do you see?"
239
-
240
- # With custom chat template
241
- llms --chat image-request.json --image photo.jpg
242
- ```
243
-
244
- Example of `image-request.json`:
245
-
246
- ```json
247
- {
248
- "model": "qwen2.5vl",
249
- "messages": [
250
- {
251
- "role": "user",
252
- "content": [
253
- {
254
- "type": "image_url",
255
- "image_url": {
256
- "url": ""
257
- }
258
- },
259
- {
260
- "type": "text",
261
- "text": "Caption this image"
262
- }
263
- ]
264
- }
265
- ]
266
- }
267
- ```
268
-
269
- **Supported image formats**: PNG, WEBP, JPG, JPEG, GIF, BMP, TIFF, ICO
270
-
271
- **Image sources**:
272
- - **Local files**: Absolute paths (`/path/to/image.jpg`) or relative paths (`./image.png`, `../image.jpg`)
273
- - **Remote URLs**: HTTP/HTTPS URLs are automatically downloaded
274
- - **Data URIs**: Base64-encoded images (`data:image/png;base64,...`)
275
-
276
- Images are automatically processed and converted to base64 data URIs before being sent to the model.
277
-
278
- ### Vision-Capable Models
279
-
280
- Popular models that support image analysis:
281
- - **OpenAI**: GPT-4o, GPT-4o-mini, GPT-4.1
282
- - **Anthropic**: Claude Sonnet 4.0, Claude Opus 4.1
283
- - **Google**: Gemini 2.5 Pro, Gemini Flash
284
- - **Qwen**: Qwen2.5-VL, Qwen3-VL, QVQ-max
285
- - **Ollama**: qwen2.5vl, llava
286
-
287
- Images are automatically downloaded and converted to base64 data URIs.
288
-
289
- ### Audio Requests
290
-
291
- Send audio files to audio-capable models using the `--audio` option:
292
-
293
- ```bash
294
- # Use defaults/audio Chat Template (Transcribe the audio)
295
- llms --audio ./recording.mp3
296
-
297
- # Local audio file
298
- llms --audio ./meeting.wav "Summarize this meeting recording"
299
-
300
- # Remote audio URL
301
- llms --audio https://example.org/podcast.mp3 "What are the key points discussed?"
302
-
303
- # With a specific audio model
304
- llms -m gpt-4o-audio-preview --audio interview.mp3 "Extract the main topics"
305
- llms -m gemini-2.5-flash --audio interview.mp3 "Extract the main topics"
306
-
307
- # Combined with system prompt
308
- llms -s "You're a transcription specialist" --audio talk.mp3 "Provide a detailed transcript"
309
-
310
- # With custom chat template
311
- llms --chat audio-request.json --audio speech.wav
312
- ```
313
-
314
- Example of `audio-request.json`:
315
-
316
- ```json
317
- {
318
- "model": "gpt-4o-audio-preview",
319
- "messages": [
320
- {
321
- "role": "user",
322
- "content": [
323
- {
324
- "type": "input_audio",
325
- "input_audio": {
326
- "data": "",
327
- "format": "mp3"
328
- }
329
- },
330
- {
331
- "type": "text",
332
- "text": "Please transcribe this audio"
333
- }
334
- ]
335
- }
336
- ]
337
- }
338
- ```
339
-
340
- **Supported audio formats**: MP3, WAV
341
-
342
- **Audio sources**:
343
- - **Local files**: Absolute paths (`/path/to/audio.mp3`) or relative paths (`./audio.wav`, `../recording.m4a`)
344
- - **Remote URLs**: HTTP/HTTPS URLs are automatically downloaded
345
- - **Base64 Data**: Base64-encoded audio
346
-
347
- Audio files are automatically processed and converted to base64 data before being sent to the model.
348
-
349
- ### Audio-Capable Models
350
-
351
- Popular models that support audio processing:
352
- - **OpenAI**: gpt-4o-audio-preview
353
- - **Google**: gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite
354
-
355
- Audio files are automatically downloaded and converted to base64 data URIs with appropriate format detection.
356
-
357
- ### File Requests
358
-
359
- Send documents (e.g. PDFs) to file-capable models using the `--file` option:
360
-
361
- ```bash
362
- # Use defaults/file Chat Template (Summarize the document)
363
- llms --file ./docs/handbook.pdf
364
-
365
- # Local PDF file
366
- llms --file ./docs/policy.pdf "Summarize the key changes"
367
-
368
- # Remote PDF URL
369
- llms --file https://example.org/whitepaper.pdf "What are the main findings?"
370
-
371
- # With specific file-capable models
372
- llms -m gpt-5 --file ./policy.pdf "Summarize the key changes"
373
- llms -m gemini-flash-latest --file ./report.pdf "Extract action items"
374
- llms -m qwen2.5vl --file ./manual.pdf "List key sections and their purpose"
375
-
376
- # Combined with system prompt
377
- llms -s "You're a compliance analyst" --file ./policy.pdf "Identify compliance risks"
378
-
379
- # With custom chat template
380
- llms --chat file-request.json --file ./docs/handbook.pdf
381
- ```
382
-
383
- Example of `file-request.json`:
384
-
385
- ```json
386
- {
387
- "model": "gpt-5",
388
- "messages": [
389
- {
390
- "role": "user",
391
- "content": [
392
- {
393
- "type": "file",
394
- "file": {
395
- "filename": "",
396
- "file_data": ""
397
- }
398
- },
399
- {
400
- "type": "text",
401
- "text": "Please summarize this document"
402
- }
403
- ]
404
- }
405
- ]
406
- }
407
- ```
408
-
409
- **Supported file formats**: PDF
410
-
411
- Other document types may work depending on the model/provider.
412
-
413
- **File sources**:
414
- - **Local files**: Absolute paths (`/path/to/file.pdf`) or relative paths (`./file.pdf`, `../file.pdf`)
415
- - **Remote URLs**: HTTP/HTTPS URLs are automatically downloaded
416
- - **Base64/Data URIs**: Inline `data:application/pdf;base64,...` is supported
417
-
418
- Files are automatically downloaded (for URLs) and converted to base64 data URIs before being sent to the model.
419
-
420
- ### File-Capable Models
421
-
422
- Popular multi-modal models that support file (PDF) inputs:
423
- - OpenAI: gpt-5, gpt-5-mini, gpt-4o, gpt-4o-mini
424
- - Google: gemini-flash-latest, gemini-2.5-flash-lite
425
- - Grok: grok-4-fast (OpenRouter)
426
- - Qwen: qwen2.5vl, qwen3-max, qwen3-vl:235b, qwen3-coder, qwen3-coder-flash (OpenRouter)
427
- - Others: kimi-k2, glm-4.5-air, deepseek-v3.1:671b, llama4:400b, llama3.3:70b, mai-ds-r1, nemotron-nano:9b
428
-
429
- ## Server Mode
430
-
431
- Run as an OpenAI-compatible HTTP server:
432
-
433
- ```bash
434
- # Start server on port 8000
435
- llms --serve 8000
436
- ```
437
-
438
- The server exposes a single endpoint:
439
- - `POST /v1/chat/completions` - OpenAI-compatible chat completions
440
-
441
- Example client usage:
442
-
443
- ```bash
444
- curl -X POST http://localhost:8000/v1/chat/completions \
445
- -H "Content-Type: application/json" \
446
- -d '{
447
- "model": "kimi-k2",
448
- "messages": [
449
- {"role": "user", "content": "Hello!"}
450
- ]
451
- }'
452
- ```
453
-
454
- ### Configuration Management
455
-
456
- ```bash
457
- # List enabled providers and models
458
- llms --list
459
- llms ls
460
-
461
- # List specific providers
462
- llms ls ollama
463
- llms ls google anthropic
464
-
465
- # Enable providers
466
- llms --enable openrouter
467
- llms --enable anthropic google_free groq
468
-
469
- # Disable providers
470
- llms --disable ollama
471
- llms --disable openai anthropic
472
-
473
- # Set default model
474
- llms --default grok-4
475
- ```
476
-
477
- ### Update
478
-
479
- ```bash
480
- pip install llms-py --upgrade
481
- ```
482
-
483
- ### Advanced Options
484
-
485
- ```bash
486
- # Use custom config file
487
- llms --config /path/to/config.json "Hello"
488
-
489
- # Get raw JSON response
490
- llms --raw "What is 2+2?"
491
-
492
- # Enable verbose logging
493
- llms --verbose "Tell me a joke"
494
-
495
- # Custom log prefix
496
- llms --verbose --logprefix "[DEBUG] " "Hello world"
497
-
498
- # Set default model (updates config file)
499
- llms --default grok-4
500
-
501
- # Update llms.py to latest version
502
- llms --update
503
-
504
- # Pass custom parameters to chat request (URL-encoded)
505
- llms --args "temperature=0.7&seed=111" "What is 2+2?"
506
-
507
- # Multiple parameters with different types
508
- llms --args "temperature=0.5&max_completion_tokens=50" "Tell me a joke"
509
-
510
- # URL-encoded special characters (stop sequences)
511
- llms --args "stop=Two,Words" "Count to 5"
512
-
513
- # Combine with other options
514
- llms --system "You are helpful" --args "temperature=0.3" --raw "Hello"
515
- ```
516
-
517
- #### Custom Parameters with `--args`
518
-
519
- The `--args` option allows you to pass URL-encoded parameters to customize the chat request sent to LLM providers:
520
-
521
- **Parameter Types:**
522
- - **Floats**: `temperature=0.7`, `frequency_penalty=0.2`
523
- - **Integers**: `max_completion_tokens=100`
524
- - **Booleans**: `store=true`, `verbose=false`, `logprobs=true`
525
- - **Strings**: `stop=one`
526
- - **Lists**: `stop=two,words`
527
-
528
- **Common Parameters:**
529
- - `temperature`: Controls randomness (0.0 to 2.0)
530
- - `max_completion_tokens`: Maximum tokens in response
531
- - `seed`: For reproducible outputs
532
- - `top_p`: Nucleus sampling parameter
533
- - `stop`: Stop sequences (URL-encode special chars)
534
- - `store`: Whether or not to store the output
535
- - `frequency_penalty`: Penalize new tokens based on frequency
536
- - `presence_penalty`: Penalize new tokens based on presence
537
- - `logprobs`: Include log probabilities in response
538
- - `parallel_tool_calls`: Enable parallel tool calls
539
- - `prompt_cache_key`: Cache key for prompt
540
- - `reasoning_effort`: Reasoning effort (low, medium, high, *minimal, *none, *default)
541
- - `safety_identifier`: A string that uniquely identifies each user
542
- - `seed`: For reproducible outputs
543
- - `service_tier`: Service tier (free, standard, premium, *default)
544
- - `top_logprobs`: Number of top logprobs to return
545
- - `top_p`: Nucleus sampling parameter
546
- - `verbosity`: Verbosity level (0, 1, 2, 3, *default)
547
- - `enable_thinking`: Enable thinking mode (Qwen)
548
- - `stream`: Enable streaming responses
549
-
550
- ### Default Model Configuration
551
-
552
- The `--default MODEL` option allows you to set the default model used for all chat completions. This updates the `defaults.text.model` field in your configuration file:
553
-
554
- ```bash
555
- # Set default model to gpt-oss
556
- llms --default gpt-oss:120b
557
-
558
- # Set default model to Claude Sonnet
559
- llms --default claude-sonnet-4-0
560
-
561
- # The model must be available in your enabled providers
562
- llms --default gemini-2.5-pro
563
- ```
564
-
565
- When you set a default model:
566
- - The configuration file (`~/.llms/llms.json`) is automatically updated
567
- - The specified model becomes the default for all future chat requests
568
- - The model must exist in your currently enabled providers
569
- - You can still override the default using `-m MODEL` for individual requests
570
-
571
- ### Updating llms.py
572
-
573
- The `--update` option downloads and installs the latest version of `llms.py` from the GitHub repository:
574
-
575
- ```bash
576
- # Update to latest version
577
- llms --update
578
- ```
579
-
580
- This command:
581
- - Downloads the latest `llms.py` from `github.com/ServiceStack/llms/blob/main/llms/main.py`
582
- - Overwrites your current `llms.py` file with the latest version
583
- - Preserves your existing configuration file (`llms.json`)
584
- - Requires an internet connection to download the update
585
-
586
- ### Beautiful rendered Markdown
587
-
588
- Pipe Markdown output to [glow](https://github.com/charmbracelet/glow) to beautifully render it in the terminal:
589
-
590
- ```bash
591
- llms "Explain quantum computing" | glow
592
- ```
593
-
594
- ## Supported Providers
595
-
596
- Any OpenAI-compatible providers and their models can be added by configuring them in [llms.json](./llms.json). By default only AI Providers with free tiers are enabled which will only be "available" if their API Key is set.
597
-
598
- You can list the available providers, their models and which are enabled or disabled with:
599
-
600
- ```bash
601
- llms ls
602
- ```
603
-
604
- They can be enabled/disabled in your `llms.json` file or with:
605
-
606
- ```bash
607
- llms --enable <provider>
608
- llms --disable <provider>
609
- ```
610
-
611
- For a provider to be available, they also require their API Key configured in either your Environment Variables
612
- or directly in your `llms.json`.
613
-
614
- ### Environment Variables
615
-
616
- | Provider | Variable | Description | Example |
617
- |-----------------|---------------------------|---------------------|---------|
618
- | openrouter_free | `OPENROUTER_API_KEY` | OpenRouter FREE models API key | `sk-or-...` |
619
- | groq | `GROQ_API_KEY` | Groq API key | `gsk_...` |
620
- | google_free | `GOOGLE_FREE_API_KEY` | Google FREE API key | `AIza...` |
621
- | codestral | `CODESTRAL_API_KEY` | Codestral API key | `...` |
622
- | ollama | N/A | No API key required | |
623
- | openrouter | `OPENROUTER_API_KEY` | OpenRouter API key | `sk-or-...` |
624
- | google | `GOOGLE_API_KEY` | Google API key | `AIza...` |
625
- | anthropic | `ANTHROPIC_API_KEY` | Anthropic API key | `sk-ant-...` |
626
- | openai | `OPENAI_API_KEY` | OpenAI API key | `sk-...` |
627
- | grok | `GROK_API_KEY` | Grok (X.AI) API key | `xai-...` |
628
- | qwen | `DASHSCOPE_API_KEY` | Qwen (Alibaba) API key | `sk-...` |
629
- | z.ai | `ZAI_API_KEY` | Z.ai API key | `sk-...` |
630
- | mistral | `MISTRAL_API_KEY` | Mistral API key | `...` |
631
-
632
- ### OpenAI
633
- - **Type**: `OpenAiProvider`
634
- - **Models**: GPT-5, GPT-5 Codex, GPT-4o, GPT-4o-mini, o3, etc.
635
- - **Features**: Text, images, function calling
636
-
637
- ```bash
638
- export OPENAI_API_KEY="your-key"
639
- llms --enable openai
640
- ```
641
-
642
- ### Anthropic (Claude)
643
- - **Type**: `OpenAiProvider`
644
- - **Models**: Claude Opus 4.1, Sonnet 4.0, Haiku 3.5, etc.
645
- - **Features**: Text, images, large context windows
646
-
647
- ```bash
648
- export ANTHROPIC_API_KEY="your-key"
649
- llms --enable anthropic
650
- ```
651
-
652
- ### Google Gemini
653
- - **Type**: `GoogleProvider`
654
- - **Models**: Gemini 2.5 Pro, Flash, Flash-Lite
655
- - **Features**: Text, images, safety settings
656
-
657
- ```bash
658
- export GOOGLE_API_KEY="your-key"
659
- llms --enable google_free
660
- ```
661
-
662
- ### OpenRouter
663
- - **Type**: `OpenAiProvider`
664
- - **Models**: 100+ models from various providers
665
- - **Features**: Access to latest models, free tier available
666
-
667
- ```bash
668
- export OPENROUTER_API_KEY="your-key"
669
- llms --enable openrouter
670
- ```
671
-
672
- ### Grok (X.AI)
673
- - **Type**: `OpenAiProvider`
674
- - **Models**: Grok-4, Grok-3, Grok-3-mini, Grok-code-fast-1, etc.
675
- - **Features**: Real-time information, humor, uncensored responses
676
-
677
- ```bash
678
- export GROK_API_KEY="your-key"
679
- llms --enable grok
680
- ```
681
-
682
- ### Groq
683
- - **Type**: `OpenAiProvider`
684
- - **Models**: Llama 3.3, Gemma 2, Kimi K2, etc.
685
- - **Features**: Fast inference, competitive pricing
686
-
687
- ```bash
688
- export GROQ_API_KEY="your-key"
689
- llms --enable groq
690
- ```
691
-
692
- ### Ollama (Local)
693
- - **Type**: `OllamaProvider`
694
- - **Models**: Auto-discovered from local Ollama installation
695
- - **Features**: Local inference, privacy, no API costs
696
-
697
- ```bash
698
- # Ollama must be running locally
699
- llms --enable ollama
700
- ```
701
-
702
- ### Qwen (Alibaba Cloud)
703
- - **Type**: `OpenAiProvider`
704
- - **Models**: Qwen3-max, Qwen-max, Qwen-plus, Qwen2.5-VL, QwQ-plus, etc.
705
- - **Features**: Multilingual, vision models, coding, reasoning, audio processing
706
-
707
- ```bash
708
- export DASHSCOPE_API_KEY="your-key"
709
- llms --enable qwen
710
- ```
711
-
712
- ### Z.ai
713
- - **Type**: `OpenAiProvider`
714
- - **Models**: GLM-4.6, GLM-4.5, GLM-4.5-air, GLM-4.5-x, GLM-4.5-airx, GLM-4.5-flash, GLM-4:32b
715
- - **Features**: Advanced language models with strong reasoning capabilities
716
-
717
- ```bash
718
- export ZAI_API_KEY="your-key"
719
- llms --enable z.ai
720
- ```
721
-
722
- ### Mistral
723
- - **Type**: `OpenAiProvider`
724
- - **Models**: Mistral Large, Codestral, Pixtral, etc.
725
- - **Features**: Code generation, multilingual
726
-
727
- ```bash
728
- export MISTRAL_API_KEY="your-key"
729
- llms --enable mistral
730
- ```
731
-
732
- ### Codestral
733
- - **Type**: `OpenAiProvider`
734
- - **Models**: Codestral
735
- - **Features**: Code generation
736
-
737
- ```bash
738
- export CODESTRAL_API_KEY="your-key"
739
- llms --enable codestral
740
- ```
741
-
742
- ## Model Routing
743
-
744
- The tool automatically routes requests to the first available provider that supports the requested model. If a provider fails, it tries the next available provider with that model.
745
-
746
- Example: If both OpenAI and OpenRouter support `kimi-k2`, the request will first try OpenRouter (free), then fall back to Groq than OpenRouter (Paid) if requests fails.
747
-
748
- ## Configuration Examples
749
-
750
- ### Minimal Configuration
751
-
752
- ```json
753
- {
754
- "defaults": {
755
- "headers": {"Content-Type": "application/json"},
756
- "text": {
757
- "model": "kimi-k2",
758
- "messages": [{"role": "user", "content": ""}]
759
- }
760
- },
761
- "providers": {
762
- "groq": {
763
- "enabled": true,
764
- "type": "OpenAiProvider",
765
- "base_url": "https://api.groq.com/openai",
766
- "api_key": "$GROQ_API_KEY",
767
- "models": {
768
- "llama3.3:70b": "llama-3.3-70b-versatile",
769
- "llama4:109b": "meta-llama/llama-4-scout-17b-16e-instruct",
770
- "llama4:400b": "meta-llama/llama-4-maverick-17b-128e-instruct",
771
- "kimi-k2": "moonshotai/kimi-k2-instruct-0905",
772
- "gpt-oss:120b": "openai/gpt-oss-120b",
773
- "gpt-oss:20b": "openai/gpt-oss-20b",
774
- "qwen3:32b": "qwen/qwen3-32b"
775
- }
776
- }
777
- }
778
- }
779
- ```
780
-
781
- ### Multi-Provider Setup
782
-
783
- ```json
784
- {
785
- "providers": {
786
- "openrouter": {
787
- "enabled": false,
788
- "type": "OpenAiProvider",
789
- "base_url": "https://openrouter.ai/api",
790
- "api_key": "$OPENROUTER_API_KEY",
791
- "models": {
792
- "grok-4": "x-ai/grok-4",
793
- "glm-4.5-air": "z-ai/glm-4.5-air",
794
- "kimi-k2": "moonshotai/kimi-k2",
795
- "deepseek-v3.1:671b": "deepseek/deepseek-chat",
796
- "llama4:400b": "meta-llama/llama-4-maverick"
797
- }
798
- },
799
- "anthropic": {
800
- "enabled": false,
801
- "type": "OpenAiProvider",
802
- "base_url": "https://api.anthropic.com",
803
- "api_key": "$ANTHROPIC_API_KEY",
804
- "models": {
805
- "claude-sonnet-4-0": "claude-sonnet-4-0"
806
- }
807
- },
808
- "ollama": {
809
- "enabled": false,
810
- "type": "OllamaProvider",
811
- "base_url": "http://localhost:11434",
812
- "models": {},
813
- "all_models": true
814
- }
815
- }
816
- }
817
- ```
818
-
819
- ## Usage
820
-
821
- Run `llms` without arguments to see the help screen:
822
-
823
- usage: llms.py [-h] [--config FILE] [-m MODEL] [--chat REQUEST] [-s PROMPT] [--image IMAGE] [--audio AUDIO]
824
- [--file FILE] [--raw] [--list] [--serve PORT] [--enable PROVIDER] [--disable PROVIDER]
825
- [--default MODEL] [--init] [--logprefix PREFIX] [--verbose] [--update]
826
-
827
- llms
828
-
829
- options:
830
- -h, --help show this help message and exit
831
- --config FILE Path to config file
832
- -m MODEL, --model MODEL
833
- Model to use
834
- --chat REQUEST OpenAI Chat Completion Request to send
835
- -s PROMPT, --system PROMPT
836
- System prompt to use for chat completion
837
- --image IMAGE Image input to use in chat completion
838
- --audio AUDIO Audio input to use in chat completion
839
- --file FILE File input to use in chat completion
840
- --raw Return raw AI JSON response
841
- --list Show list of enabled providers and their models (alias ls provider?)
842
- --serve PORT Port to start an OpenAI Chat compatible server on
843
- --enable PROVIDER Enable a provider
844
- --disable PROVIDER Disable a provider
845
- --default MODEL Configure the default model to use
846
- --init Create a default llms.json
847
- --logprefix PREFIX Prefix used in log messages
848
- --verbose Verbose output
849
- --update Update to latest version
850
-
851
- ## Troubleshooting
852
-
853
- ### Common Issues
854
-
855
- **Config file not found**
856
- ```bash
857
- # Initialize default config
858
- llms --init
859
-
860
- # Or specify custom path
861
- llms --config ./my-config.json
862
- ```
863
-
864
- **No providers enabled**
865
-
866
- ```bash
867
- # Check status
868
- llms --list
869
-
870
- # Enable providers
871
- llms --enable google anthropic
872
- ```
873
-
874
- **API key issues**
875
- ```bash
876
- # Check environment variables
877
- echo $ANTHROPIC_API_KEY
878
-
879
- # Enable verbose logging
880
- llms --verbose "test"
881
- ```
882
-
883
- **Model not found**
884
-
885
- ```bash
886
- # List available models
887
- llms --list
888
-
889
- # Check provider configuration
890
- llms ls openrouter
891
- ```
892
-
893
- ### Debug Mode
894
-
895
- Enable verbose logging to see detailed request/response information:
896
-
897
- ```bash
898
- llms --verbose --logprefix "[DEBUG] " "Hello"
899
- ```
900
-
901
- This shows:
902
- - Enabled providers
903
- - Model routing decisions
904
- - HTTP request details
905
- - Error messages with stack traces
906
-
907
- ## Development
908
-
909
- ### Project Structure
910
-
911
- - `llms.py` - Main script with CLI and server functionality
912
- - `llms.json` - Default configuration file
913
- - `requirements.txt` - Python dependencies
914
-
915
- ### Provider Classes
916
-
917
- - `OpenAiProvider` - Generic OpenAI-compatible provider
918
- - `OllamaProvider` - Ollama-specific provider with model auto-discovery
919
- - `GoogleProvider` - Google Gemini with native API format
920
- - `GoogleOpenAiProvider` - Google Gemini via OpenAI-compatible endpoint
921
-
922
- ### Adding New Providers
923
-
924
- 1. Create a provider class inheriting from `OpenAiProvider`
925
- 2. Implement provider-specific authentication and formatting
926
- 3. Add provider configuration to `llms.json`
927
- 4. Update initialization logic in `init_llms()`
928
-
929
- ## Contributing
930
-
931
- Contributions are welcome! Please submit a PR to add support for any missing OpenAI-compatible providers.