fmtr.tools 1.3.52__tar.gz → 1.3.54__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.

Potentially problematic release.


This version of fmtr.tools might be problematic. Click here for more details.

Files changed (101) hide show
  1. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/PKG-INFO +53 -53
  2. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/__init__.py +1 -5
  3. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/ai_tools/agentic_tools.py +16 -15
  4. fmtr_tools-1.3.54/fmtr/tools/docker_tools/__init__.py +6 -0
  5. fmtr_tools-1.3.54/fmtr/tools/version +1 -0
  6. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr.tools.egg-info/PKG-INFO +53 -53
  7. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr.tools.egg-info/SOURCES.txt +2 -2
  8. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr.tools.egg-info/requires.txt +52 -52
  9. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/setup.py +1 -1
  10. fmtr_tools-1.3.52/fmtr/tools/docker_tools.py +0 -30
  11. fmtr_tools-1.3.52/fmtr/tools/version +0 -1
  12. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/LICENSE +0 -0
  13. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/README.md +0 -0
  14. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/ai_tools/__init__.py +0 -0
  15. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  16. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/api_tools.py +0 -0
  17. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/async_tools.py +0 -0
  18. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/augmentation_tools.py +0 -0
  19. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/caching_tools.py +0 -0
  20. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/constants.py +0 -0
  21. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/context_tools.py +0 -0
  22. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/data_modelling_tools.py +0 -0
  23. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/database_tools/__init__.py +0 -0
  24. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/database_tools/document.py +0 -0
  25. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/dataclass_tools.py +0 -0
  26. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/datatype_tools.py +0 -0
  27. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/datetime_tools.py +0 -0
  28. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/debugging_tools.py +0 -0
  29. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/dns_tools/__init__.py +0 -0
  30. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/dns_tools/client.py +0 -0
  31. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/dns_tools/dm.py +0 -0
  32. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/dns_tools/proxy.py +0 -0
  33. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/dns_tools/server.py +0 -0
  34. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/entrypoints/__init__.py +0 -0
  35. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  36. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/entrypoints/ep_test.py +0 -0
  37. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  38. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  39. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  40. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/environment_tools.py +0 -0
  41. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/function_tools.py +0 -0
  42. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/google_api_tools.py +0 -0
  43. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/hash_tools.py +0 -0
  44. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/hfh_tools.py +0 -0
  45. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/html_tools.py +0 -0
  46. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/http_tools.py +0 -0
  47. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/import_tools.py +0 -0
  48. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/inherit_tools.py +0 -0
  49. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/inspection_tools.py +0 -0
  50. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/interface_tools/__init__.py +0 -0
  51. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/interface_tools/context.py +0 -0
  52. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/interface_tools/controls.py +0 -0
  53. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/interface_tools/interface_tools.py +0 -0
  54. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/iterator_tools.py +0 -0
  55. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/json_fix_tools.py +0 -0
  56. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/json_tools.py +0 -0
  57. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/logging_tools.py +0 -0
  58. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/merging_tools.py +0 -0
  59. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/metric_tools.py +0 -0
  60. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/name_tools.py +0 -0
  61. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/netrc_tools.py +0 -0
  62. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/openai_tools.py +0 -0
  63. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/packaging_tools.py +0 -0
  64. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/parallel_tools.py +0 -0
  65. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/path_tools/__init__.py +0 -0
  66. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  67. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/path_tools/path_tools.py +0 -0
  68. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  69. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/pattern_tools.py +0 -0
  70. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/pdf_tools.py +0 -0
  71. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/platform_tools.py +0 -0
  72. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/process_tools.py +0 -0
  73. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/profiling_tools.py +0 -0
  74. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/random_tools.py +0 -0
  75. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/semantic_tools.py +0 -0
  76. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/settings_tools.py +0 -0
  77. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/setup_tools/__init__.py +0 -0
  78. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  79. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/spaces_tools.py +0 -0
  80. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/string_tools.py +0 -0
  81. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tabular_tools.py +0 -0
  82. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tests/__init__.py +0 -0
  83. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tests/conftest.py +0 -0
  84. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tests/helpers.py +0 -0
  85. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tests/test_datatype.py +0 -0
  86. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tests/test_environment.py +0 -0
  87. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tests/test_json.py +0 -0
  88. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tests/test_path.py +0 -0
  89. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tests/test_yaml.py +0 -0
  90. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tokenization_tools.py +0 -0
  91. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/tools.py +0 -0
  92. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/unicode_tools.py +0 -0
  93. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/version_tools/__init__.py +0 -0
  94. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/version_tools/version_tools.py +0 -0
  95. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/webhook_tools.py +0 -0
  96. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr/tools/yaml_tools.py +0 -0
  97. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  98. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr.tools.egg-info/entry_points.txt +0 -0
  99. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/fmtr.tools.egg-info/top_level.txt +0 -0
  100. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/pyproject.toml +0 -0
  101. {fmtr_tools-1.3.52 → fmtr_tools-1.3.54}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.52
3
+ Version: 1.3.54
4
4
  Summary: Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML
5
5
  Home-page: https://github.com/fmtr/fmtr.tools
6
6
  Author: Frontmatter
@@ -28,8 +28,8 @@ Provides-Extra: process
28
28
  Requires-Dist: logfire; extra == "process"
29
29
  Provides-Extra: profiling
30
30
  Requires-Dist: contexttimer; extra == "profiling"
31
- Provides-Extra: docker-api
32
- Requires-Dist: docker; extra == "docker-api"
31
+ Provides-Extra: docker-client
32
+ Requires-Dist: python-on-whales; extra == "docker-client"
33
33
  Provides-Extra: unicode
34
34
  Requires-Dist: Unidecode; extra == "unicode"
35
35
  Provides-Extra: version
@@ -154,68 +154,68 @@ Provides-Extra: db-document
154
154
  Requires-Dist: beanie[odm]; extra == "db-document"
155
155
  Requires-Dist: motor; extra == "db-document"
156
156
  Provides-Extra: all
157
- Requires-Dist: bokeh; extra == "all"
158
- Requires-Dist: distributed; extra == "all"
159
- Requires-Dist: motor; extra == "all"
160
- Requires-Dist: faker; extra == "all"
161
- Requires-Dist: peft; extra == "all"
162
- Requires-Dist: openai; extra == "all"
163
- Requires-Dist: pandas; extra == "all"
157
+ Requires-Dist: appdirs; extra == "all"
158
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
159
+ Requires-Dist: odfpy; extra == "all"
160
+ Requires-Dist: google-api-python-client; extra == "all"
161
+ Requires-Dist: flet[all]; extra == "all"
162
+ Requires-Dist: tokenizers; extra == "all"
163
+ Requires-Dist: openpyxl; extra == "all"
164
+ Requires-Dist: dnspython[doh]; extra == "all"
164
165
  Requires-Dist: deepdiff; extra == "all"
165
- Requires-Dist: pycountry; extra == "all"
166
- Requires-Dist: regex; extra == "all"
167
- Requires-Dist: dask[bag]; extra == "all"
168
- Requires-Dist: filetype; extra == "all"
169
- Requires-Dist: logfire[httpx]; extra == "all"
170
- Requires-Dist: yamlscript; extra == "all"
171
- Requires-Dist: google-auth-httplib2; extra == "all"
172
166
  Requires-Dist: pymupdf; extra == "all"
167
+ Requires-Dist: json_repair; extra == "all"
168
+ Requires-Dist: flet-webview; extra == "all"
169
+ Requires-Dist: torchaudio; extra == "all"
170
+ Requires-Dist: tabulate; extra == "all"
173
171
  Requires-Dist: pymupdf4llm; extra == "all"
174
- Requires-Dist: httpx_retries; extra == "all"
175
- Requires-Dist: google-auth; extra == "all"
176
- Requires-Dist: logfire[fastapi]; extra == "all"
177
- Requires-Dist: torchvision; extra == "all"
178
- Requires-Dist: diskcache; extra == "all"
179
- Requires-Dist: cachetools; extra == "all"
180
- Requires-Dist: semver; extra == "all"
181
- Requires-Dist: tinynetrc; extra == "all"
182
172
  Requires-Dist: sentence_transformers; extra == "all"
183
- Requires-Dist: Unidecode; extra == "all"
184
- Requires-Dist: openpyxl; extra == "all"
173
+ Requires-Dist: regex; extra == "all"
174
+ Requires-Dist: beanie[odm]; extra == "all"
175
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
185
176
  Requires-Dist: html2text; extra == "all"
186
- Requires-Dist: appdirs; extra == "all"
187
- Requires-Dist: ollama; extra == "all"
188
- Requires-Dist: docker; extra == "all"
189
- Requires-Dist: playwright; extra == "all"
190
- Requires-Dist: pytest-cov; extra == "all"
191
- Requires-Dist: pyyaml; extra == "all"
192
- Requires-Dist: fastapi; extra == "all"
177
+ Requires-Dist: google-auth-httplib2; extra == "all"
193
178
  Requires-Dist: setuptools; extra == "all"
194
- Requires-Dist: beanie[odm]; extra == "all"
179
+ Requires-Dist: bokeh; extra == "all"
180
+ Requires-Dist: tinynetrc; extra == "all"
181
+ Requires-Dist: openai; extra == "all"
182
+ Requires-Dist: motor; extra == "all"
183
+ Requires-Dist: pytest-cov; extra == "all"
184
+ Requires-Dist: distributed; extra == "all"
185
+ Requires-Dist: Unidecode; extra == "all"
186
+ Requires-Dist: logfire[fastapi]; extra == "all"
195
187
  Requires-Dist: google-auth-oauthlib; extra == "all"
196
- Requires-Dist: json_repair; extra == "all"
197
- Requires-Dist: google-api-python-client; extra == "all"
198
- Requires-Dist: logfire; extra == "all"
188
+ Requires-Dist: cachetools; extra == "all"
189
+ Requires-Dist: httpx_retries; extra == "all"
190
+ Requires-Dist: uvicorn[standard]; extra == "all"
191
+ Requires-Dist: pydantic-extra-types; extra == "all"
192
+ Requires-Dist: logfire[httpx]; extra == "all"
199
193
  Requires-Dist: deepmerge; extra == "all"
194
+ Requires-Dist: semver; extra == "all"
195
+ Requires-Dist: pycountry; extra == "all"
196
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
197
+ Requires-Dist: filetype; extra == "all"
198
+ Requires-Dist: playwright; extra == "all"
200
199
  Requires-Dist: sre_yield; extra == "all"
201
- Requires-Dist: uvicorn[standard]; extra == "all"
202
- Requires-Dist: flet-webview; extra == "all"
203
- Requires-Dist: huggingface_hub; extra == "all"
204
- Requires-Dist: tabulate; extra == "all"
205
- Requires-Dist: tokenizers; extra == "all"
200
+ Requires-Dist: fastapi; extra == "all"
201
+ Requires-Dist: faker; extra == "all"
206
202
  Requires-Dist: httpx; extra == "all"
207
- Requires-Dist: contexttimer; extra == "all"
208
- Requires-Dist: flet-video; extra == "all"
203
+ Requires-Dist: torchvision; extra == "all"
204
+ Requires-Dist: ollama; extra == "all"
209
205
  Requires-Dist: pydantic-settings; extra == "all"
210
- Requires-Dist: dnspython[doh]; extra == "all"
211
- Requires-Dist: odfpy; extra == "all"
212
- Requires-Dist: flet[all]; extra == "all"
213
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
214
- Requires-Dist: torchaudio; extra == "all"
206
+ Requires-Dist: yamlscript; extra == "all"
207
+ Requires-Dist: diskcache; extra == "all"
208
+ Requires-Dist: pyyaml; extra == "all"
209
+ Requires-Dist: python-on-whales; extra == "all"
210
+ Requires-Dist: peft; extra == "all"
211
+ Requires-Dist: contexttimer; extra == "all"
212
+ Requires-Dist: pandas; extra == "all"
213
+ Requires-Dist: google-auth; extra == "all"
214
+ Requires-Dist: dask[bag]; extra == "all"
215
+ Requires-Dist: huggingface_hub; extra == "all"
215
216
  Requires-Dist: pydantic; extra == "all"
216
- Requires-Dist: transformers[sentencepiece]; extra == "all"
217
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
218
- Requires-Dist: pydantic-extra-types; extra == "all"
217
+ Requires-Dist: flet-video; extra == "all"
218
+ Requires-Dist: logfire; extra == "all"
219
219
  Dynamic: author
220
220
  Dynamic: author-email
221
221
  Dynamic: description
@@ -21,6 +21,7 @@ import fmtr.tools.string_tools as string
21
21
  from fmtr.tools import ai_tools as ai
22
22
  from fmtr.tools import datetime_tools as dt
23
23
  from fmtr.tools import dns_tools as dns
24
+ from fmtr.tools import docker_tools as docker
24
25
  from fmtr.tools import interface_tools as interface
25
26
  from fmtr.tools import version_tools as version
26
27
  from fmtr.tools.constants import Constants
@@ -40,11 +41,6 @@ try:
40
41
  except ModuleNotFoundError as exception:
41
42
  yaml = MissingExtraMockModule('yaml', exception)
42
43
 
43
- try:
44
- from fmtr.tools import docker_tools as docker
45
- from fmtr.tools.docker_tools import Container
46
- except ModuleNotFoundError as exception:
47
- docker = Container = MissingExtraMockModule('docker.api', exception)
48
44
 
49
45
  try:
50
46
  from fmtr.tools import parallel_tools as parallel
@@ -1,10 +1,12 @@
1
1
  import pydantic_ai
2
2
  from pydantic import PlainValidator
3
3
  from pydantic_ai import RunContext, ModelRetry
4
+ from pydantic_ai._output import OutputDataT
4
5
  from pydantic_ai.agent import AgentRunResult, Agent
5
6
  from pydantic_ai.models.openai import OpenAIModel
6
7
  from pydantic_ai.providers.openai import OpenAIProvider
7
- from typing import List, Optional, Any, Annotated
8
+ from pydantic_ai.tools import AgentDepsT
9
+ from typing import List, Optional, Any, Annotated, Generic
8
10
 
9
11
  from fmtr.tools import environment_tools as env
10
12
  from fmtr.tools.constants import Constants
@@ -25,15 +27,16 @@ class Validator:
25
27
  raise NotImplementedError()
26
28
 
27
29
 
28
-
29
-
30
- class Task:
30
+ class Task(Generic[AgentDepsT, OutputDataT]):
31
31
  """
32
32
 
33
33
  Linear task definition, as Agent configuration and typing, plus state history.
34
34
 
35
35
  """
36
36
 
37
+ TypeDeps = str
38
+ TypeOutput = str
39
+
37
40
  PROVIDER = OpenAIProvider(api_key=env.get(Constants.FMTR_OPENAI_API_KEY_KEY))
38
41
 
39
42
  API_HOST_FMTR = env.get(Constants.FMTR_AI_HOST_KEY, Constants.FMTR_AI_HOST_DEFAULT)
@@ -43,8 +46,6 @@ class Task:
43
46
  MODEL_ID = 'gpt-4o'
44
47
  MODEL_ID_FMTR = 'qwen2.5-coder:14b'
45
48
  SYSTEM_PROMPT_STATIC = None
46
- DEPS_TYPE = str
47
- RESULT_TYPE = str
48
49
  RESULT_RETRIES = 5
49
50
  VALIDATORS: List[Validator] = []
50
51
 
@@ -56,13 +57,13 @@ class Task:
56
57
  """
57
58
 
58
59
  self.model = OpenAIModel(self.MODEL_ID, provider=self.PROVIDER)
59
- self.agent = Agent(
60
+ self.agent = Agent[AgentDepsT, OutputDataT](
60
61
  *args,
61
62
  model=self.model,
62
63
  system_prompt=self.SYSTEM_PROMPT_STATIC or [],
63
- deps_type=self.DEPS_TYPE,
64
- result_type=self.RESULT_TYPE,
65
- result_retries=self.RESULT_RETRIES,
64
+ deps_type=self.TypeDeps,
65
+ output_type=self.TypeOutput,
66
+ output_retries=self.RESULT_RETRIES,
66
67
  **kwargs
67
68
  )
68
69
 
@@ -80,7 +81,7 @@ class Task:
80
81
  import asyncio
81
82
  return asyncio.run
82
83
 
83
- async def run(self, *args, deps=None, **kwargs) -> AgentRunResult[RESULT_TYPE]:
84
+ async def run(self, *args, deps=None, **kwargs) -> AgentRunResult[OutputDataT]:
84
85
  """
85
86
 
86
87
  Run Agent with deps-relative user prompt and while storing history
@@ -90,7 +91,7 @@ class Task:
90
91
  self.history = result.all_messages()
91
92
  return result
92
93
 
93
- async def validate(self, ctx: RunContext[DEPS_TYPE], output: RESULT_TYPE) -> RESULT_TYPE:
94
+ async def validate(self, ctx: RunContext[AgentDepsT], output: OutputDataT) -> OutputDataT:
94
95
  """
95
96
 
96
97
  Aggregate any validation failures and combine them into a single ModelRetry exception
@@ -107,7 +108,7 @@ class Task:
107
108
 
108
109
  return output
109
110
 
110
- def get_prompt(self, deps: Optional[DEPS_TYPE]) -> Optional[str]:
111
+ def get_prompt(self, deps: Optional[AgentDepsT]) -> Optional[str]:
111
112
  """
112
113
 
113
114
  Dummy prompt generator
@@ -115,7 +116,7 @@ class Task:
115
116
  """
116
117
  return None
117
118
 
118
- def add_system_prompt(self, ctx: RunContext[DEPS_TYPE]) -> str | List[str]:
119
+ def add_system_prompt(self, ctx: RunContext[AgentDepsT]) -> str | List[str]:
119
120
  """
120
121
 
121
122
  Dummy system prompt append
@@ -181,7 +182,7 @@ if __name__ == '__main__':
181
182
  class TaskTest(Task):
182
183
  # PROVIDER = Task.PROVIDER_FMTR
183
184
  # MODEL_ID = 'qwen2.5-coder:14b'
184
- RESULT_TYPE = TestOutput
185
+ TypeOutput = TestOutput
185
186
  SYSTEM_PROMPT_STATIC = 'Tell the user jokes.'
186
187
 
187
188
  def add_system_prompt(self, ctx: RunContext[TestDeps]) -> str:
@@ -0,0 +1,6 @@
1
+ from fmtr.tools.import_tools import MissingExtraMockModule
2
+
3
+ try:
4
+ from python_on_whales import docker as client
5
+ except ModuleNotFoundError as exception:
6
+ client = MissingExtraMockModule('docker.client', exception)
@@ -0,0 +1 @@
1
+ 1.3.54
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.52
3
+ Version: 1.3.54
4
4
  Summary: Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML
5
5
  Home-page: https://github.com/fmtr/fmtr.tools
6
6
  Author: Frontmatter
@@ -28,8 +28,8 @@ Provides-Extra: process
28
28
  Requires-Dist: logfire; extra == "process"
29
29
  Provides-Extra: profiling
30
30
  Requires-Dist: contexttimer; extra == "profiling"
31
- Provides-Extra: docker-api
32
- Requires-Dist: docker; extra == "docker-api"
31
+ Provides-Extra: docker-client
32
+ Requires-Dist: python-on-whales; extra == "docker-client"
33
33
  Provides-Extra: unicode
34
34
  Requires-Dist: Unidecode; extra == "unicode"
35
35
  Provides-Extra: version
@@ -154,68 +154,68 @@ Provides-Extra: db-document
154
154
  Requires-Dist: beanie[odm]; extra == "db-document"
155
155
  Requires-Dist: motor; extra == "db-document"
156
156
  Provides-Extra: all
157
- Requires-Dist: bokeh; extra == "all"
158
- Requires-Dist: distributed; extra == "all"
159
- Requires-Dist: motor; extra == "all"
160
- Requires-Dist: faker; extra == "all"
161
- Requires-Dist: peft; extra == "all"
162
- Requires-Dist: openai; extra == "all"
163
- Requires-Dist: pandas; extra == "all"
157
+ Requires-Dist: appdirs; extra == "all"
158
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
159
+ Requires-Dist: odfpy; extra == "all"
160
+ Requires-Dist: google-api-python-client; extra == "all"
161
+ Requires-Dist: flet[all]; extra == "all"
162
+ Requires-Dist: tokenizers; extra == "all"
163
+ Requires-Dist: openpyxl; extra == "all"
164
+ Requires-Dist: dnspython[doh]; extra == "all"
164
165
  Requires-Dist: deepdiff; extra == "all"
165
- Requires-Dist: pycountry; extra == "all"
166
- Requires-Dist: regex; extra == "all"
167
- Requires-Dist: dask[bag]; extra == "all"
168
- Requires-Dist: filetype; extra == "all"
169
- Requires-Dist: logfire[httpx]; extra == "all"
170
- Requires-Dist: yamlscript; extra == "all"
171
- Requires-Dist: google-auth-httplib2; extra == "all"
172
166
  Requires-Dist: pymupdf; extra == "all"
167
+ Requires-Dist: json_repair; extra == "all"
168
+ Requires-Dist: flet-webview; extra == "all"
169
+ Requires-Dist: torchaudio; extra == "all"
170
+ Requires-Dist: tabulate; extra == "all"
173
171
  Requires-Dist: pymupdf4llm; extra == "all"
174
- Requires-Dist: httpx_retries; extra == "all"
175
- Requires-Dist: google-auth; extra == "all"
176
- Requires-Dist: logfire[fastapi]; extra == "all"
177
- Requires-Dist: torchvision; extra == "all"
178
- Requires-Dist: diskcache; extra == "all"
179
- Requires-Dist: cachetools; extra == "all"
180
- Requires-Dist: semver; extra == "all"
181
- Requires-Dist: tinynetrc; extra == "all"
182
172
  Requires-Dist: sentence_transformers; extra == "all"
183
- Requires-Dist: Unidecode; extra == "all"
184
- Requires-Dist: openpyxl; extra == "all"
173
+ Requires-Dist: regex; extra == "all"
174
+ Requires-Dist: beanie[odm]; extra == "all"
175
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
185
176
  Requires-Dist: html2text; extra == "all"
186
- Requires-Dist: appdirs; extra == "all"
187
- Requires-Dist: ollama; extra == "all"
188
- Requires-Dist: docker; extra == "all"
189
- Requires-Dist: playwright; extra == "all"
190
- Requires-Dist: pytest-cov; extra == "all"
191
- Requires-Dist: pyyaml; extra == "all"
192
- Requires-Dist: fastapi; extra == "all"
177
+ Requires-Dist: google-auth-httplib2; extra == "all"
193
178
  Requires-Dist: setuptools; extra == "all"
194
- Requires-Dist: beanie[odm]; extra == "all"
179
+ Requires-Dist: bokeh; extra == "all"
180
+ Requires-Dist: tinynetrc; extra == "all"
181
+ Requires-Dist: openai; extra == "all"
182
+ Requires-Dist: motor; extra == "all"
183
+ Requires-Dist: pytest-cov; extra == "all"
184
+ Requires-Dist: distributed; extra == "all"
185
+ Requires-Dist: Unidecode; extra == "all"
186
+ Requires-Dist: logfire[fastapi]; extra == "all"
195
187
  Requires-Dist: google-auth-oauthlib; extra == "all"
196
- Requires-Dist: json_repair; extra == "all"
197
- Requires-Dist: google-api-python-client; extra == "all"
198
- Requires-Dist: logfire; extra == "all"
188
+ Requires-Dist: cachetools; extra == "all"
189
+ Requires-Dist: httpx_retries; extra == "all"
190
+ Requires-Dist: uvicorn[standard]; extra == "all"
191
+ Requires-Dist: pydantic-extra-types; extra == "all"
192
+ Requires-Dist: logfire[httpx]; extra == "all"
199
193
  Requires-Dist: deepmerge; extra == "all"
194
+ Requires-Dist: semver; extra == "all"
195
+ Requires-Dist: pycountry; extra == "all"
196
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
197
+ Requires-Dist: filetype; extra == "all"
198
+ Requires-Dist: playwright; extra == "all"
200
199
  Requires-Dist: sre_yield; extra == "all"
201
- Requires-Dist: uvicorn[standard]; extra == "all"
202
- Requires-Dist: flet-webview; extra == "all"
203
- Requires-Dist: huggingface_hub; extra == "all"
204
- Requires-Dist: tabulate; extra == "all"
205
- Requires-Dist: tokenizers; extra == "all"
200
+ Requires-Dist: fastapi; extra == "all"
201
+ Requires-Dist: faker; extra == "all"
206
202
  Requires-Dist: httpx; extra == "all"
207
- Requires-Dist: contexttimer; extra == "all"
208
- Requires-Dist: flet-video; extra == "all"
203
+ Requires-Dist: torchvision; extra == "all"
204
+ Requires-Dist: ollama; extra == "all"
209
205
  Requires-Dist: pydantic-settings; extra == "all"
210
- Requires-Dist: dnspython[doh]; extra == "all"
211
- Requires-Dist: odfpy; extra == "all"
212
- Requires-Dist: flet[all]; extra == "all"
213
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
214
- Requires-Dist: torchaudio; extra == "all"
206
+ Requires-Dist: yamlscript; extra == "all"
207
+ Requires-Dist: diskcache; extra == "all"
208
+ Requires-Dist: pyyaml; extra == "all"
209
+ Requires-Dist: python-on-whales; extra == "all"
210
+ Requires-Dist: peft; extra == "all"
211
+ Requires-Dist: contexttimer; extra == "all"
212
+ Requires-Dist: pandas; extra == "all"
213
+ Requires-Dist: google-auth; extra == "all"
214
+ Requires-Dist: dask[bag]; extra == "all"
215
+ Requires-Dist: huggingface_hub; extra == "all"
215
216
  Requires-Dist: pydantic; extra == "all"
216
- Requires-Dist: transformers[sentencepiece]; extra == "all"
217
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
218
- Requires-Dist: pydantic-extra-types; extra == "all"
217
+ Requires-Dist: flet-video; extra == "all"
218
+ Requires-Dist: logfire; extra == "all"
219
219
  Dynamic: author
220
220
  Dynamic: author-email
221
221
  Dynamic: description
@@ -14,7 +14,6 @@ setup.py
14
14
  ./fmtr/tools/datatype_tools.py
15
15
  ./fmtr/tools/datetime_tools.py
16
16
  ./fmtr/tools/debugging_tools.py
17
- ./fmtr/tools/docker_tools.py
18
17
  ./fmtr/tools/environment_tools.py
19
18
  ./fmtr/tools/function_tools.py
20
19
  ./fmtr/tools/google_api_tools.py
@@ -63,6 +62,7 @@ setup.py
63
62
  ./fmtr/tools/dns_tools/dm.py
64
63
  ./fmtr/tools/dns_tools/proxy.py
65
64
  ./fmtr/tools/dns_tools/server.py
65
+ ./fmtr/tools/docker_tools/__init__.py
66
66
  ./fmtr/tools/entrypoints/__init__.py
67
67
  ./fmtr/tools/entrypoints/cache_hfh.py
68
68
  ./fmtr/tools/entrypoints/ep_test.py
@@ -107,7 +107,6 @@ fmtr/tools/dataclass_tools.py
107
107
  fmtr/tools/datatype_tools.py
108
108
  fmtr/tools/datetime_tools.py
109
109
  fmtr/tools/debugging_tools.py
110
- fmtr/tools/docker_tools.py
111
110
  fmtr/tools/environment_tools.py
112
111
  fmtr/tools/function_tools.py
113
112
  fmtr/tools/google_api_tools.py
@@ -156,6 +155,7 @@ fmtr/tools/dns_tools/client.py
156
155
  fmtr/tools/dns_tools/dm.py
157
156
  fmtr/tools/dns_tools/proxy.py
158
157
  fmtr/tools/dns_tools/server.py
158
+ fmtr/tools/docker_tools/__init__.py
159
159
  fmtr/tools/entrypoints/__init__.py
160
160
  fmtr/tools/entrypoints/cache_hfh.py
161
161
  fmtr/tools/entrypoints/ep_test.py
@@ -18,68 +18,68 @@ pydantic-ai[logfire,openai]
18
18
  ollama
19
19
 
20
20
  [all]
21
- bokeh
22
- distributed
23
- motor
24
- faker
25
- peft
26
- openai
27
- pandas
21
+ appdirs
22
+ transformers[sentencepiece]
23
+ odfpy
24
+ google-api-python-client
25
+ flet[all]
26
+ tokenizers
27
+ openpyxl
28
+ dnspython[doh]
28
29
  deepdiff
29
- pycountry
30
- regex
31
- dask[bag]
32
- filetype
33
- logfire[httpx]
34
- yamlscript
35
- google-auth-httplib2
36
30
  pymupdf
31
+ json_repair
32
+ flet-webview
33
+ torchaudio
34
+ tabulate
37
35
  pymupdf4llm
38
- httpx_retries
39
- google-auth
40
- logfire[fastapi]
41
- torchvision
42
- diskcache
43
- cachetools
44
- semver
45
- tinynetrc
46
36
  sentence_transformers
47
- Unidecode
48
- openpyxl
37
+ regex
38
+ beanie[odm]
39
+ pydevd-pycharm~=251.25410.159
49
40
  html2text
50
- appdirs
51
- ollama
52
- docker
53
- playwright
54
- pytest-cov
55
- pyyaml
56
- fastapi
41
+ google-auth-httplib2
57
42
  setuptools
58
- beanie[odm]
43
+ bokeh
44
+ tinynetrc
45
+ openai
46
+ motor
47
+ pytest-cov
48
+ distributed
49
+ Unidecode
50
+ logfire[fastapi]
59
51
  google-auth-oauthlib
60
- json_repair
61
- google-api-python-client
62
- logfire
52
+ cachetools
53
+ httpx_retries
54
+ uvicorn[standard]
55
+ pydantic-extra-types
56
+ logfire[httpx]
63
57
  deepmerge
58
+ semver
59
+ pycountry
60
+ pydantic-ai[logfire,openai]
61
+ filetype
62
+ playwright
64
63
  sre_yield
65
- uvicorn[standard]
66
- flet-webview
67
- huggingface_hub
68
- tabulate
69
- tokenizers
64
+ fastapi
65
+ faker
70
66
  httpx
71
- contexttimer
72
- flet-video
67
+ torchvision
68
+ ollama
73
69
  pydantic-settings
74
- dnspython[doh]
75
- odfpy
76
- flet[all]
77
- pydevd-pycharm~=251.25410.159
78
- torchaudio
70
+ yamlscript
71
+ diskcache
72
+ pyyaml
73
+ python-on-whales
74
+ peft
75
+ contexttimer
76
+ pandas
77
+ google-auth
78
+ dask[bag]
79
+ huggingface_hub
79
80
  pydantic
80
- transformers[sentencepiece]
81
- pydantic-ai[logfire,openai]
82
- pydantic-extra-types
81
+ flet-video
82
+ logfire
83
83
 
84
84
  [api]
85
85
  fastapi
@@ -122,8 +122,8 @@ httpx_retries
122
122
  logfire
123
123
  logfire[httpx]
124
124
 
125
- [docker.api]
126
- docker
125
+ [docker.client]
126
+ python-on-whales
127
127
 
128
128
  [google.api]
129
129
  google-auth
@@ -10,7 +10,7 @@ DEPENDENCIES = {
10
10
  'augmentation': ['faker', 'sre_yield'],
11
11
  'process': ['logging'],
12
12
  'profiling': ['contexttimer'],
13
- 'docker.api': ['docker'],
13
+ 'docker.client': ['python-on-whales'],
14
14
  'unicode': ['Unidecode'],
15
15
  'version': [],
16
16
  'version.dev': ['semver'],
@@ -1,30 +0,0 @@
1
- import contextlib
2
- import docker
3
-
4
-
5
- @contextlib.contextmanager
6
- def Container(image, ports=None, name=None, **kwargs):
7
- """
8
-
9
- Run a Docker container in a context manager
10
-
11
- """
12
- client = docker.from_env()
13
-
14
- try:
15
- container = client.containers.get(name)
16
- container.stop()
17
- container.remove()
18
- except docker.errors.NotFound:
19
- pass
20
-
21
- ports = {f'{port}/tcp': port for port in ports}
22
- container = client.containers.run(image, ports=ports, detach=True, name=name, **kwargs)
23
-
24
- try:
25
- yield container
26
- finally:
27
- container.stop()
28
- container.remove()
29
-
30
-
@@ -1 +0,0 @@
1
- 1.3.52
File without changes
File without changes
File without changes
File without changes