fmtr.tools 1.2.0__py3-none-any.whl → 1.2.2__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.

Potentially problematic release.


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

@@ -1,17 +1,31 @@
1
- from typing import List, Optional
2
-
3
1
  import pydantic_ai
4
- from pydantic_ai import RunContext
2
+ from pydantic_ai import RunContext, ModelRetry
5
3
  from pydantic_ai.agent import AgentRunResult, Agent
6
4
  from pydantic_ai.models.openai import OpenAIModel
7
5
  from pydantic_ai.providers.openai import OpenAIProvider
6
+ from typing import List, Optional, Any
8
7
 
9
8
  from fmtr.tools import environment_tools as env
10
9
  from fmtr.tools.constants import Constants
10
+ from fmtr.tools.logging_tools import logger
11
11
  from fmtr.tools.string_tools import truncate_mid
12
12
 
13
13
  pydantic_ai.Agent.instrument_all()
14
14
 
15
+
16
+ class Validator:
17
+ """
18
+
19
+ Subclassable validator
20
+
21
+ """
22
+
23
+ async def validate(self, ctx: RunContext[Any], output: Any) -> List[str]:
24
+ raise NotImplementedError()
25
+
26
+
27
+
28
+
15
29
  class Task:
16
30
  """
17
31
 
@@ -31,6 +45,7 @@ class Task:
31
45
  DEPS_TYPE = str
32
46
  RESULT_TYPE = str
33
47
  RESULT_RETRIES = 5
48
+ VALIDATORS: List[Validator] = []
34
49
 
35
50
  def __init__(self, *args, **kwargs):
36
51
  """
@@ -77,9 +92,18 @@ class Task:
77
92
  async def validate(self, ctx: RunContext[DEPS_TYPE], output: RESULT_TYPE) -> RESULT_TYPE:
78
93
  """
79
94
 
80
- Dummy validator
95
+ Aggregate any validation failures and combine them into a single ModelRetry exception
81
96
 
82
97
  """
98
+ msgs = []
99
+ for validator in self.VALIDATORS:
100
+ msgs += validator.validate(ctx, output)
101
+
102
+ if msgs:
103
+ msg = '. '.join(msgs)
104
+ logger.warning(msg)
105
+ raise ModelRetry(msg)
106
+
83
107
  return output
84
108
 
85
109
  def get_prompt(self, deps: Optional[DEPS_TYPE]) -> Optional[str]:
fmtr/tools/version CHANGED
@@ -1 +1 @@
1
- 1.2.0
1
+ 1.2.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.2.0
3
+ Version: 1.2.2
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/tools
6
6
  Author: Frontmatter
@@ -123,60 +123,60 @@ Requires-Dist: logfire[httpx]; extra == "http"
123
123
  Provides-Extra: setup
124
124
  Requires-Dist: setuptools; extra == "setup"
125
125
  Provides-Extra: all
126
- Requires-Dist: openai; extra == "all"
126
+ Requires-Dist: httpx; extra == "all"
127
+ Requires-Dist: html2text; extra == "all"
128
+ Requires-Dist: ollama; extra == "all"
129
+ Requires-Dist: google-auth-httplib2; extra == "all"
127
130
  Requires-Dist: deepmerge; extra == "all"
128
- Requires-Dist: tinynetrc; extra == "all"
129
- Requires-Dist: sentence_transformers; extra == "all"
130
- Requires-Dist: regex; extra == "all"
131
- Requires-Dist: docker; extra == "all"
132
- Requires-Dist: appdirs; extra == "all"
131
+ Requires-Dist: contexttimer; extra == "all"
133
132
  Requires-Dist: sre_yield; extra == "all"
134
133
  Requires-Dist: google-auth; extra == "all"
135
- Requires-Dist: logfire; extra == "all"
136
- Requires-Dist: diskcache; extra == "all"
137
- Requires-Dist: google-api-python-client; extra == "all"
138
- Requires-Dist: contexttimer; extra == "all"
139
- Requires-Dist: openpyxl; extra == "all"
134
+ Requires-Dist: huggingface_hub; extra == "all"
135
+ Requires-Dist: setuptools; extra == "all"
136
+ Requires-Dist: pyyaml; extra == "all"
137
+ Requires-Dist: dask[bag]; extra == "all"
138
+ Requires-Dist: google-auth-oauthlib; extra == "all"
139
+ Requires-Dist: pymupdf4llm; extra == "all"
140
+ Requires-Dist: logfire[fastapi]; extra == "all"
141
+ Requires-Dist: tinynetrc; extra == "all"
140
142
  Requires-Dist: Unidecode; extra == "all"
141
- Requires-Dist: pydevd-pycharm; extra == "all"
142
- Requires-Dist: logfire[httpx]; extra == "all"
143
- Requires-Dist: json_repair; extra == "all"
144
143
  Requires-Dist: tabulate; extra == "all"
145
- Requires-Dist: flet-webview; extra == "all"
146
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
147
- Requires-Dist: logfire[fastapi]; extra == "all"
148
- Requires-Dist: yamlscript; extra == "all"
149
- Requires-Dist: peft; extra == "all"
150
- Requires-Dist: pandas; extra == "all"
151
- Requires-Dist: pymupdf; extra == "all"
152
- Requires-Dist: tokenizers; extra == "all"
153
- Requires-Dist: uvicorn[standard]; extra == "all"
154
- Requires-Dist: pydantic-settings; extra == "all"
155
- Requires-Dist: pymupdf4llm; extra == "all"
156
- Requires-Dist: distributed; extra == "all"
144
+ Requires-Dist: flet[all]; extra == "all"
157
145
  Requires-Dist: fastapi; extra == "all"
158
- Requires-Dist: torchvision; extra == "all"
146
+ Requires-Dist: appdirs; extra == "all"
147
+ Requires-Dist: flet-webview; extra == "all"
148
+ Requires-Dist: regex; extra == "all"
159
149
  Requires-Dist: semver; extra == "all"
160
- Requires-Dist: ollama; extra == "all"
161
- Requires-Dist: setuptools; extra == "all"
162
- Requires-Dist: dnspython[doh]; extra == "all"
163
- Requires-Dist: pytest-cov; extra == "all"
164
- Requires-Dist: filetype; extra == "all"
165
- Requires-Dist: httpx; extra == "all"
166
- Requires-Dist: dask[bag]; extra == "all"
167
150
  Requires-Dist: transformers[sentencepiece]; extra == "all"
151
+ Requires-Dist: google-api-python-client; extra == "all"
168
152
  Requires-Dist: flet-video; extra == "all"
153
+ Requires-Dist: distributed; extra == "all"
154
+ Requires-Dist: pymupdf; extra == "all"
155
+ Requires-Dist: peft; extra == "all"
156
+ Requires-Dist: pydantic-settings; extra == "all"
157
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
169
158
  Requires-Dist: httpx_retries; extra == "all"
159
+ Requires-Dist: pydevd-pycharm; extra == "all"
160
+ Requires-Dist: sentence_transformers; extra == "all"
170
161
  Requires-Dist: faker; extra == "all"
162
+ Requires-Dist: diskcache; extra == "all"
163
+ Requires-Dist: tokenizers; extra == "all"
164
+ Requires-Dist: pytest-cov; extra == "all"
165
+ Requires-Dist: filetype; extra == "all"
166
+ Requires-Dist: json_repair; extra == "all"
167
+ Requires-Dist: logfire; extra == "all"
168
+ Requires-Dist: openai; extra == "all"
169
+ Requires-Dist: logfire[httpx]; extra == "all"
170
+ Requires-Dist: uvicorn[standard]; extra == "all"
171
171
  Requires-Dist: torchaudio; extra == "all"
172
- Requires-Dist: html2text; extra == "all"
173
- Requires-Dist: google-auth-httplib2; extra == "all"
172
+ Requires-Dist: pandas; extra == "all"
173
+ Requires-Dist: docker; extra == "all"
174
+ Requires-Dist: dnspython[doh]; extra == "all"
174
175
  Requires-Dist: pydantic; extra == "all"
176
+ Requires-Dist: torchvision; extra == "all"
177
+ Requires-Dist: openpyxl; extra == "all"
175
178
  Requires-Dist: bokeh; extra == "all"
176
- Requires-Dist: flet[all]; extra == "all"
177
- Requires-Dist: huggingface_hub; extra == "all"
178
- Requires-Dist: pyyaml; extra == "all"
179
- Requires-Dist: google-auth-oauthlib; extra == "all"
179
+ Requires-Dist: yamlscript; extra == "all"
180
180
  Dynamic: author
181
181
  Dynamic: author-email
182
182
  Dynamic: description
@@ -45,11 +45,11 @@ fmtr/tools/tabular_tools.py,sha256=tpIpZzYku1HcJrHZJL6BC39LmN3WUWVhFbK2N7nDVmE,1
45
45
  fmtr/tools/tokenization_tools.py,sha256=me-IBzSLyNYejLybwjO9CNB6Mj2NYfKPaOVThXyaGNg,4268
46
46
  fmtr/tools/tools.py,sha256=CAsApa1YwVdNE6H66Vjivs_mXYvOas3rh7fPELAnTpk,795
47
47
  fmtr/tools/unicode_tools.py,sha256=yS_9wpu8ogNoiIL7s1G_8bETFFO_YQlo4LNPv1NLDeY,52
48
- fmtr/tools/version,sha256=n3cDSx61fSTyGsfetlycyZ9jtyd14xHx8oCrK2wuBqI,5
48
+ fmtr/tools/version,sha256=HsT6sNjdXq_vguZ_YaNcA-6ZSYilKT4Xzz0-l8NRGEc,5
49
49
  fmtr/tools/version_tools.py,sha256=yNs_CGqWpqE4jbK9wsPIi14peJVXYbhIcMqHAFOw3yE,1480
50
50
  fmtr/tools/yaml_tools.py,sha256=9kuYChqJelWQIjGlSnK4iDdOWWH06P0gp9jIcRrC3UI,1903
51
51
  fmtr/tools/ai_tools/__init__.py,sha256=JZrLuOFNV1A3wvJgonxOgz_4WS-7MfCuowGWA5uYCjs,372
52
- fmtr/tools/ai_tools/agentic_tools.py,sha256=YebH7R9ovVo3GzfWAZxY49e2fNt13APDMe290xx7zks,3720
52
+ fmtr/tools/ai_tools/agentic_tools.py,sha256=acSEPFS-aguDXanWGs3fAAlRyJSYPZW7L-Kb2qDLm-I,4300
53
53
  fmtr/tools/ai_tools/inference_tools.py,sha256=2UP2gXEyOJUjyyV6zmFIYmIxUsh1rXkRH0IbFvr2bRs,11908
54
54
  fmtr/tools/entrypoints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  fmtr/tools/entrypoints/cache_hfh.py,sha256=fQNs4J9twQuZH_Yj98-oOvEX7-LrSUP3kO8nzw2HrHs,60
@@ -70,9 +70,9 @@ fmtr/tools/tests/test_environment.py,sha256=iHaiMQfECYZPkPKwfuIZV9uHuWe3aE-p_dN_
70
70
  fmtr/tools/tests/test_json.py,sha256=IeSP4ziPvRcmS8kq7k9tHonC9rN5YYq9GSNT2ul6Msk,287
71
71
  fmtr/tools/tests/test_path.py,sha256=AkZQa6_8BQ-VaCyL_J-iKmdf2ZaM-xFYR37Kun3k4_g,2188
72
72
  fmtr/tools/tests/test_yaml.py,sha256=jc0TwwKu9eC0LvFGNMERdgBue591xwLxYXFbtsRwXVM,287
73
- fmtr_tools-1.2.0.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
74
- fmtr_tools-1.2.0.dist-info/METADATA,sha256=2QBz83ifUL0Z0Z5uFdQtn_WqvwzafB8OlzM-TAaIfCY,15738
75
- fmtr_tools-1.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
76
- fmtr_tools-1.2.0.dist-info/entry_points.txt,sha256=fSQrDGNctdQXbUxpMWYVfVQ0mhZMDyaEDG3D3a0zOSc,278
77
- fmtr_tools-1.2.0.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
78
- fmtr_tools-1.2.0.dist-info/RECORD,,
73
+ fmtr_tools-1.2.2.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
74
+ fmtr_tools-1.2.2.dist-info/METADATA,sha256=tvVd8XZQ7rBtJ2d_gjBvw5orqsRHKnyewIIiyBXy7OY,15738
75
+ fmtr_tools-1.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
76
+ fmtr_tools-1.2.2.dist-info/entry_points.txt,sha256=fSQrDGNctdQXbUxpMWYVfVQ0mhZMDyaEDG3D3a0zOSc,278
77
+ fmtr_tools-1.2.2.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
78
+ fmtr_tools-1.2.2.dist-info/RECORD,,