minions-py 0.2.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.
- minions_py-0.2.0/PKG-INFO +464 -0
- minions_py-0.2.0/README.md +451 -0
- minions_py-0.2.0/__init__.py +64 -0
- minions_py-0.2.0/claude.py +286 -0
- minions_py-0.2.0/config.py +211 -0
- minions_py-0.2.0/gemini.py +309 -0
- minions_py-0.2.0/gpt.py +227 -0
- minions_py-0.2.0/grok.py +393 -0
- minions_py-0.2.0/minions_py.egg-info/PKG-INFO +464 -0
- minions_py-0.2.0/minions_py.egg-info/SOURCES.txt +27 -0
- minions_py-0.2.0/minions_py.egg-info/dependency_links.txt +1 -0
- minions_py-0.2.0/minions_py.egg-info/requires.txt +5 -0
- minions_py-0.2.0/minions_py.egg-info/top_level.txt +1 -0
- minions_py-0.2.0/mistral.py +464 -0
- minions_py-0.2.0/pyproject.toml +29 -0
- minions_py-0.2.0/setup.cfg +4 -0
- minions_py-0.2.0/tests/test_architecture.py +260 -0
- minions_py-0.2.0/tests/test_claude.py +137 -0
- minions_py-0.2.0/tests/test_gemini.py +109 -0
- minions_py-0.2.0/tests/test_gpt.py +104 -0
- minions_py-0.2.0/tests/test_grok.py +156 -0
- minions_py-0.2.0/tests/test_mistral.py +217 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: minions-py
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Reusable provider-specific AI workflow agents.
|
|
5
|
+
Project-URL: Repository, https://github.com/is-leeroy-jenkins/minions
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: anthropic<2,>=1.4
|
|
9
|
+
Requires-Dist: google-adk<3,>=2.8
|
|
10
|
+
Requires-Dist: mistralai[agents]<3,>=2.9
|
|
11
|
+
Requires-Dist: openai-agents<1,>=0.22
|
|
12
|
+
Requires-Dist: xai-sdk<2,>=1.19
|
|
13
|
+
|
|
14
|
+
###### minions
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<img src="resources/images/minions-project.png" alt="Minions" width="900">
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<a href="#supported-providers">Providers</a> ·
|
|
22
|
+
<a href="#installation">Installation</a> ·
|
|
23
|
+
<a href="#concrete-minions">Minions</a> ·
|
|
24
|
+
<a href="#native-provider-tools">Native Tools</a> ·
|
|
25
|
+
<a href="https://github.com/is-leeroy-jenkins/minions/blob/main/resources/user-guide.md">User Guide</a> ·
|
|
26
|
+
<a href="#development">Development</a>
|
|
27
|
+
</p>
|
|
28
|
+
|
|
29
|
+
___
|
|
30
|
+
|
|
31
|
+
[](https://is-leeroy-jenkins.github.io/minions/)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
Provider-native AI agents organized as reusable workflow-specific `Minion` classes.
|
|
35
|
+
|
|
36
|
+

|
|
37
|
+
|
|
38
|
+
___
|
|
39
|
+
|
|
40
|
+
Minions keeps each workflow inside one provider pathway. Tool schemas and tool functions are never
|
|
41
|
+
translated or mixed between providers.
|
|
42
|
+
|
|
43
|
+
## Supported Providers
|
|
44
|
+
|
|
45
|
+
| Module | Provider SDK | `Minion` implementation | Execution methods |
|
|
46
|
+
|-------------------|------------------------------|------------------------------------------|------------------------------|
|
|
47
|
+
| `minions.gpt` | OpenAI Agents SDK | Inherits `agents.Agent` | `run`, `run_async`, `stream` |
|
|
48
|
+
| `minions.gemini` | Google Agent Development Kit | Inherits `google.adk.Agent` | `run`, `run_async`, `stream` |
|
|
49
|
+
| `minions.grok` | xAI SDK | Wraps synchronous and asynchronous chats | `run`, `run_async`, `stream` |
|
|
50
|
+
| `minions.claude` | Anthropic SDK | Wraps native tool runners | `run`, `run_async`, `stream` |
|
|
51
|
+
| `minions.mistral` | Mistral SDK | Wraps a native remote agent | `run`, `run_async`, `stream` |
|
|
52
|
+
|
|
53
|
+
## Installation
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
python -m venv .venv
|
|
57
|
+
.\.venv\Scripts\Activate.ps1
|
|
58
|
+
python -m pip install --upgrade pip
|
|
59
|
+
python -m pip install git+https://github.com/is-leeroy-jenkins/minions.git
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Editable installation for development:
|
|
63
|
+
|
|
64
|
+
```powershell
|
|
65
|
+
git clone https://github.com/is-leeroy-jenkins/minions.git
|
|
66
|
+
Set-Location minions
|
|
67
|
+
python -m pip install -e .
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Authentication
|
|
71
|
+
|
|
72
|
+
Set only the key required by the selected provider.
|
|
73
|
+
|
|
74
|
+
| Provider | Environment variable |
|
|
75
|
+
|----------|----------------------|
|
|
76
|
+
| OpenAI | `OPENAI_API_KEY` |
|
|
77
|
+
| Gemini | `GOOGLE_API_KEY` |
|
|
78
|
+
| Grok | `XAI_API_KEY` |
|
|
79
|
+
| Claude | `ANTHROPIC_API_KEY` |
|
|
80
|
+
| Mistral | `MISTRAL_API_KEY` |
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+

|
|
85
|
+
|
|
86
|
+
___
|
|
87
|
+
|
|
88
|
+
## Concrete Minions
|
|
89
|
+
|
|
90
|
+
The same concrete class family is exported from every provider module.
|
|
91
|
+
|
|
92
|
+
| Guro workflow category | Minion class |
|
|
93
|
+
|------------------------------------------|-------------------------|
|
|
94
|
+
| Research / Academic | `ResearchMinion` |
|
|
95
|
+
| Writing / Administrative | `WritingMinion` |
|
|
96
|
+
| Compliance / Legal / Budget | `ComplianceMinion` |
|
|
97
|
+
| Business / Finance / Marketing | `BusinessMinion` |
|
|
98
|
+
| Software Engineering / Software Engineer | `CodingMinion` |
|
|
99
|
+
| Data Analytics | `DataMinion` |
|
|
100
|
+
| Data Governance | `GovernanceMinion` |
|
|
101
|
+
| Instruction / Training / Planning | `PlanningMinion` |
|
|
102
|
+
| Image Generation | `ImageGenerationMinion` |
|
|
103
|
+
| Image Analysis | `ImageAnalysisMinion` |
|
|
104
|
+
| Image Editing | `ImageEditingMinion` |
|
|
105
|
+
| Translation API | `TranslationMinion` |
|
|
106
|
+
| Transcription API | `TranscriptionMinion` |
|
|
107
|
+
| Speech API | `SpeechMinion` |
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
## Quick Start
|
|
112
|
+
|
|
113
|
+
### OpenAI
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
from fonky.gpt import tools
|
|
117
|
+
from guro import instructions
|
|
118
|
+
from minions.gpt import DataMinion
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
minion = DataMinion(
|
|
122
|
+
model='gpt-5.6-sol',
|
|
123
|
+
instructions=instructions.get( 'DATA_SCIENTIST' ),
|
|
124
|
+
tools=[ tools.fetch_wikipedia, tools.load_csv ],
|
|
125
|
+
)
|
|
126
|
+
result = minion.run( 'Analyze the available evidence.' )
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Gemini
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
from fonky.gemini import tools
|
|
133
|
+
from guro import instructions
|
|
134
|
+
from minions.gemini import ResearchMinion
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
minion = ResearchMinion(
|
|
138
|
+
model='gemini-2.5-flash',
|
|
139
|
+
instructions=instructions.get( 'DEEP_RESEARCH_AGENT' ),
|
|
140
|
+
tools=[ tools.fetch_wikipedia ],
|
|
141
|
+
)
|
|
142
|
+
result = minion.run( 'Research the requested topic.' )
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Grok
|
|
146
|
+
|
|
147
|
+
Grok requires matching provider schemas and local callables only for client-executed function
|
|
148
|
+
tools. xAI-hosted tools do not require entries in `functions`.
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
from fonky.grok import tools
|
|
152
|
+
from guro import instructions
|
|
153
|
+
from minions.grok import DataMinion
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
minion = DataMinion(
|
|
157
|
+
model='grok-4.5',
|
|
158
|
+
instructions=instructions.get( 'DATA_SCIENTIST' ),
|
|
159
|
+
tools=[ tools.wikipedia_fetch_tool, tools.csv_tool ],
|
|
160
|
+
functions=[ tools.fetch_wikipedia, tools.load_csv ],
|
|
161
|
+
)
|
|
162
|
+
result = minion.run( 'Analyze the available evidence.' )
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Claude
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
from fonky.claude import tools
|
|
169
|
+
from guro import instructions
|
|
170
|
+
from minions.claude import ComplianceMinion
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
minion = ComplianceMinion(
|
|
174
|
+
model='claude-sonnet-4-6',
|
|
175
|
+
instructions=instructions.get( 'COMPLIANCE_ANALYST' ),
|
|
176
|
+
tools=[ tools.load_pdf, tools.fetch_web_page ],
|
|
177
|
+
)
|
|
178
|
+
result = minion.run( 'Evaluate the supplied material.' )
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Mistral
|
|
182
|
+
|
|
183
|
+
Mistral requires matching provider schemas and local callables for local function tools.
|
|
184
|
+
Provider-hosted tools do not require a local callable.
|
|
185
|
+
|
|
186
|
+
```python
|
|
187
|
+
from fonky.mistral import tools
|
|
188
|
+
from guro import instructions
|
|
189
|
+
from minions.mistral import CodingMinion
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
minion = CodingMinion(
|
|
193
|
+
model='mistral-medium-latest',
|
|
194
|
+
instructions=instructions.get( 'SENIOR_ENGINEER' ),
|
|
195
|
+
tools=[ tools.github_tool ],
|
|
196
|
+
functions=[ tools.load_github ],
|
|
197
|
+
)
|
|
198
|
+
result = minion.run( 'Review the repository.' )
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Tool-Free Execution
|
|
202
|
+
|
|
203
|
+
Tools are optional for every provider.
|
|
204
|
+
|
|
205
|
+
```python
|
|
206
|
+
from guro import instructions
|
|
207
|
+
from minions.gpt import WritingMinion
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
minion = WritingMinion(
|
|
211
|
+
model='gpt-5.6-sol',
|
|
212
|
+
instructions=instructions.get( 'TECHNICAL_WRITER' ),
|
|
213
|
+
)
|
|
214
|
+
result = minion.run( 'Draft the requested documentation.' )
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Constructor Reference
|
|
218
|
+
|
|
219
|
+
### Common arguments
|
|
220
|
+
|
|
221
|
+
| Argument | Type | Default | Description |
|
|
222
|
+
|---|---|---:|---|
|
|
223
|
+
| `model` | `str` | Required | Provider model identifier |
|
|
224
|
+
| `instructions` | `str` | Required | System instructions, including Guro instruction text |
|
|
225
|
+
| `tools` | Provider-specific sequence or `None` | `None` | Optional provider-native tools |
|
|
226
|
+
| `max_turns` | `int` | `10` | Maximum model turns for one execution |
|
|
227
|
+
| `name` | `str` or `None` | `None` | Overrides the concrete class display name |
|
|
228
|
+
|
|
229
|
+
### Provider-specific arguments
|
|
230
|
+
|
|
231
|
+
| Provider | Argument | Type | Default | Description |
|
|
232
|
+
|---|---|---|---:|---|
|
|
233
|
+
| Grok | `functions` | `Sequence[ToolFunction]` or `None` | `None` | Local callables matching Grok tool schemas |
|
|
234
|
+
| Grok | `api_key` | `str` or `None` | `None` | Overrides `XAI_API_KEY` |
|
|
235
|
+
| Claude | `max_tokens` | `int` | `4096` | Maximum generated tokens |
|
|
236
|
+
| Claude | `api_key` | `str` or `None` | `None` | Overrides `ANTHROPIC_API_KEY` |
|
|
237
|
+
| Mistral | `functions` | `Sequence[ToolFunction]` or `None` | `None` | Local callables matching function-tool schemas |
|
|
238
|
+
| Mistral | `api_key` | `str` or `None` | `None` | Overrides `MISTRAL_API_KEY` |
|
|
239
|
+
|
|
240
|
+
## Execution Reference
|
|
241
|
+
|
|
242
|
+
| Provider | `run` return | `run_async` return | `stream` return |
|
|
243
|
+
|---|---|---|---|
|
|
244
|
+
| OpenAI | `RunResult` | `RunResult` | `RunResultStreaming` |
|
|
245
|
+
| Gemini | Final `Event` | Final `Event` | `AsyncIterator[Event]` |
|
|
246
|
+
| Grok | `Response` | `Response` | `AsyncIterator[tuple[Response, Chunk]]` |
|
|
247
|
+
| Claude | `BetaMessage` | `BetaMessage` | `BetaAsyncStreamingToolRunner[object]` |
|
|
248
|
+
| Mistral | `ChatCompletionResponse` | `ChatCompletionResponse` | `Iterator[CompletionEvent]` |
|
|
249
|
+
|
|
250
|
+
Asynchronous execution:
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
result = await minion.run_async( 'Complete the workflow.' )
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Streaming execution:
|
|
257
|
+
|
|
258
|
+
```python
|
|
259
|
+
stream = minion.stream( 'Complete the workflow.' )
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
OpenAI and Claude return provider-managed streaming objects. Gemini and Grok return asynchronous
|
|
263
|
+
iterators. Mistral returns a synchronous iterator. Each pathway continues its tool loop through the
|
|
264
|
+
final provider response.
|
|
265
|
+
|
|
266
|
+
## Tool Contracts
|
|
267
|
+
|
|
268
|
+
| Provider | Accepted tool contract |
|
|
269
|
+
|---|---|
|
|
270
|
+
| OpenAI | OpenAI Agents SDK `Tool` objects |
|
|
271
|
+
| Gemini | Callable, `BaseTool`, or `BaseToolset` |
|
|
272
|
+
| Grok | xAI `chat_pb2.Tool`; local function schemas require identically named callables |
|
|
273
|
+
| Claude | `ClaudeTool`: Anthropic `BetaFunctionTool` or `BetaToolUnionParam` |
|
|
274
|
+
| Mistral | `CreateAgentRequestTool` schemas; local function tools require identically named callables |
|
|
275
|
+
|
|
276
|
+
Grok and Mistral reject duplicate, missing, or extra local function names before execution.
|
|
277
|
+
Provider-hosted tools execute on the provider and therefore do not require local callables.
|
|
278
|
+
|
|
279
|
+
## Native Provider Tools
|
|
280
|
+
|
|
281
|
+
| Provider | Native tools exported by the provider module |
|
|
282
|
+
|---|---|
|
|
283
|
+
| OpenAI | `WebSearchTool`, `FileSearchTool`, `CodeInterpreterTool`, `ImageGenerationTool` |
|
|
284
|
+
| Gemini | `google_search`, `url_context`, `VertexAiSearchTool` |
|
|
285
|
+
| Grok | `web_search`, `code_execution`, `collections_search`, `image_generation` |
|
|
286
|
+
| Claude | Web search, web fetch, and code execution through `BetaToolUnionParam` definitions |
|
|
287
|
+
| Mistral | `WebSearchTool`, `CodeInterpreterTool`, `ImageGenerationTool`, `DocumentLibraryTool` |
|
|
288
|
+
|
|
289
|
+
Native tools remain optional and provider-specific. Do not pass a native tool from one provider to
|
|
290
|
+
another provider's Minion.
|
|
291
|
+
|
|
292
|
+
### OpenAI native tools
|
|
293
|
+
|
|
294
|
+
```python
|
|
295
|
+
from minions.gpt import FileSearchTool, ResearchMinion, WebSearchTool
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
minion = ResearchMinion(
|
|
299
|
+
model='gpt-5.6-sol',
|
|
300
|
+
instructions='Research the question using current and indexed sources.',
|
|
301
|
+
tools=[
|
|
302
|
+
WebSearchTool( ),
|
|
303
|
+
FileSearchTool( vector_store_ids=[ 'vs_...' ] ),
|
|
304
|
+
],
|
|
305
|
+
)
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
`CodeInterpreterTool` and `ImageGenerationTool` accept their native OpenAI tool configuration
|
|
309
|
+
objects. Minions passes those configurations to the OpenAI Agents SDK unchanged.
|
|
310
|
+
|
|
311
|
+
### Gemini native tools
|
|
312
|
+
|
|
313
|
+
```python
|
|
314
|
+
from minions.gemini import ResearchMinion, VertexAiSearchTool
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
minion = ResearchMinion(
|
|
318
|
+
model='gemini-2.5-flash',
|
|
319
|
+
instructions='Research the configured enterprise data store.',
|
|
320
|
+
tools=[
|
|
321
|
+
VertexAiSearchTool(
|
|
322
|
+
data_store_id=(
|
|
323
|
+
'projects/project/locations/global/collections/default_collection/'
|
|
324
|
+
'dataStores/store'
|
|
325
|
+
),
|
|
326
|
+
),
|
|
327
|
+
],
|
|
328
|
+
)
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
`google_search` and `url_context` are native ADK tool objects and can be imported directly from
|
|
332
|
+
`minions.gemini`. Supported tool combinations depend on the selected Gemini model and ADK rules.
|
|
333
|
+
|
|
334
|
+
### Grok native tools
|
|
335
|
+
|
|
336
|
+
```python
|
|
337
|
+
from minions.grok import DataMinion, code_execution, collections_search, web_search
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
minion = DataMinion(
|
|
341
|
+
model='grok-4.5',
|
|
342
|
+
instructions='Research and analyze the requested subject.',
|
|
343
|
+
tools=[
|
|
344
|
+
web_search( ),
|
|
345
|
+
code_execution( ),
|
|
346
|
+
collections_search( collection_ids=[ 'collection-id' ] ),
|
|
347
|
+
],
|
|
348
|
+
)
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
The `image_generation` constructor is also exported from `minions.grok`. xAI executes these tools
|
|
352
|
+
on its servers; `functions` remains reserved for client-executed function schemas.
|
|
353
|
+
|
|
354
|
+
### Claude native tools
|
|
355
|
+
|
|
356
|
+
```python
|
|
357
|
+
from minions.claude import ResearchMinion
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
minion = ResearchMinion(
|
|
361
|
+
model='claude-sonnet-4-6',
|
|
362
|
+
instructions='Research and analyze the requested subject.',
|
|
363
|
+
tools=[
|
|
364
|
+
{ 'type': 'web_search_20260318', 'name': 'web_search' },
|
|
365
|
+
{ 'type': 'web_fetch_20260318', 'name': 'web_fetch' },
|
|
366
|
+
{ 'type': 'code_execution_20260521', 'name': 'code_execution' },
|
|
367
|
+
],
|
|
368
|
+
)
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
Anthropic executes these server tools. Local tools decorated with `anthropic.beta_tool` can appear
|
|
372
|
+
in the same `tools` sequence and are executed by Anthropic's native tool runner.
|
|
373
|
+
|
|
374
|
+
### Mistral native tools
|
|
375
|
+
|
|
376
|
+
```python
|
|
377
|
+
from minions.mistral import (
|
|
378
|
+
CodeInterpreterTool,
|
|
379
|
+
DataMinion,
|
|
380
|
+
DocumentLibraryTool,
|
|
381
|
+
WebSearchTool,
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
minion = DataMinion(
|
|
386
|
+
model='mistral-medium-latest',
|
|
387
|
+
instructions='Research and analyze the requested subject.',
|
|
388
|
+
tools=[
|
|
389
|
+
WebSearchTool( ),
|
|
390
|
+
CodeInterpreterTool( ),
|
|
391
|
+
DocumentLibraryTool( library_ids=[ 'library-id' ] ),
|
|
392
|
+
],
|
|
393
|
+
)
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
`ImageGenerationTool` is also exported from `minions.mistral`. Mistral executes native tools;
|
|
397
|
+
`functions` remains reserved for client-executed function schemas.
|
|
398
|
+
|
|
399
|
+
## Category Templates
|
|
400
|
+
|
|
401
|
+
Concrete Minions are subclass templates. Guro prompts plug into a category through the
|
|
402
|
+
`instructions` argument without a factory or registry.
|
|
403
|
+
|
|
404
|
+
```python
|
|
405
|
+
from guro import instructions
|
|
406
|
+
from minions.gpt import GovernanceMinion
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
governor = GovernanceMinion(
|
|
410
|
+
model='gpt-5.6-sol',
|
|
411
|
+
instructions=instructions.get( 'AI_GOVENANCE_AGENT' ),
|
|
412
|
+
)
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
Provider-specific customization uses ordinary inheritance:
|
|
416
|
+
|
|
417
|
+
```python
|
|
418
|
+
from minions.gpt import ComplianceMinion
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
class BudgetMinion( ComplianceMinion ):
|
|
422
|
+
"""OpenAI Minion specialized for federal budget compliance."""
|
|
423
|
+
|
|
424
|
+
minion_name: str = 'Budget Minion'
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
## Development
|
|
428
|
+
|
|
429
|
+
```powershell
|
|
430
|
+
python -m pip install -e .
|
|
431
|
+
python -m pip install pytest pytest-asyncio build
|
|
432
|
+
python -m pytest
|
|
433
|
+
python -m build
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
Documentation:
|
|
437
|
+
|
|
438
|
+
```powershell
|
|
439
|
+
python -m pip install -r requirements-docs.txt
|
|
440
|
+
python -m mkdocs build --strict
|
|
441
|
+
python -m mkdocs serve
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
Tests mock provider network boundaries and validate provider inheritance, optional tools, concrete
|
|
445
|
+
class exports, synchronous execution, asynchronous execution, streaming, and local tool loops.
|
|
446
|
+
|
|
447
|
+
## Project Structure
|
|
448
|
+
|
|
449
|
+
```text
|
|
450
|
+
minions/
|
|
451
|
+
├── __init__.py
|
|
452
|
+
├── config.py
|
|
453
|
+
├── gpt.py
|
|
454
|
+
├── gemini.py
|
|
455
|
+
├── grok.py
|
|
456
|
+
├── claude.py
|
|
457
|
+
├── mistral.py
|
|
458
|
+
└── tests/
|
|
459
|
+
```
|
|
460
|
+
<p align="center">
|
|
461
|
+
<a href="https://github.com/is-leeroy-jenkins/minions/actions/workflows/tests.yml"><img src="https://github.com/is-leeroy-jenkins/minions/actions/workflows/tests.yml/badge.svg" alt="Tests"></a>
|
|
462
|
+
<img src="https://img.shields.io/badge/Python-3.11%2B-3776AB?logo=python&logoColor=white" alt="Python 3.11+">
|
|
463
|
+
<img src="https://img.shields.io/badge/version-0.2.0-6f42c1" alt="Version 0.2.0">
|
|
464
|
+
</p>
|