toolslm 0.3.26__py3-none-any.whl → 0.3.28__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.
- toolslm/__init__.py +1 -1
- toolslm/_modidx.py +2 -0
- toolslm/funccall.py +29 -10
- {toolslm-0.3.26.dist-info → toolslm-0.3.28.dist-info}/METADATA +10 -23
- toolslm-0.3.28.dist-info/RECORD +14 -0
- {toolslm-0.3.26.dist-info → toolslm-0.3.28.dist-info}/WHEEL +1 -1
- toolslm-0.3.26.dist-info/RECORD +0 -14
- {toolslm-0.3.26.dist-info → toolslm-0.3.28.dist-info}/entry_points.txt +0 -0
- {toolslm-0.3.26.dist-info → toolslm-0.3.28.dist-info}/licenses/LICENSE +0 -0
- {toolslm-0.3.26.dist-info → toolslm-0.3.28.dist-info}/top_level.txt +0 -0
toolslm/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.3.
|
|
1
|
+
__version__ = "0.3.28"
|
toolslm/_modidx.py
CHANGED
|
@@ -28,10 +28,12 @@ d = { 'settings': { 'branch': 'main',
|
|
|
28
28
|
'toolslm.funccall.call_func': ('funccall.html#call_func', 'toolslm/funccall.py'),
|
|
29
29
|
'toolslm.funccall.call_func_async': ('funccall.html#call_func_async', 'toolslm/funccall.py'),
|
|
30
30
|
'toolslm.funccall.get_schema': ('funccall.html#get_schema', 'toolslm/funccall.py'),
|
|
31
|
+
'toolslm.funccall.get_schema_nm': ('funccall.html#get_schema_nm', 'toolslm/funccall.py'),
|
|
31
32
|
'toolslm.funccall.mk_ns': ('funccall.html#mk_ns', 'toolslm/funccall.py'),
|
|
32
33
|
'toolslm.funccall.mk_param': ('funccall.html#mk_param', 'toolslm/funccall.py'),
|
|
33
34
|
'toolslm.funccall.mk_tool': ('funccall.html#mk_tool', 'toolslm/funccall.py'),
|
|
34
35
|
'toolslm.funccall.python': ('funccall.html#python', 'toolslm/funccall.py'),
|
|
36
|
+
'toolslm.funccall.resolve_nm': ('funccall.html#resolve_nm', 'toolslm/funccall.py'),
|
|
35
37
|
'toolslm.funccall.schema2sig': ('funccall.html#schema2sig', 'toolslm/funccall.py')},
|
|
36
38
|
'toolslm.inspecttools': { 'toolslm.inspecttools.SymbolNotFound': ( 'inspecttools.html#symbolnotfound',
|
|
37
39
|
'toolslm/inspecttools.py'),
|
toolslm/funccall.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# AUTOGENERATED! DO NOT EDIT! File to edit: ../01_funccall.ipynb.
|
|
2
2
|
|
|
3
3
|
# %% auto #0
|
|
4
|
-
__all__ = ['empty', 'custom_types', 'get_schema', 'python', 'mk_ns', '
|
|
5
|
-
'mk_tool']
|
|
4
|
+
__all__ = ['empty', 'custom_types', 'get_schema', 'python', 'mk_ns', 'resolve_nm', 'get_schema_nm', 'call_func',
|
|
5
|
+
'call_func_async', 'mk_param', 'schema2sig', 'mk_tool']
|
|
6
6
|
|
|
7
7
|
# %% ../01_funccall.ipynb #e5ad6b86
|
|
8
8
|
import inspect, json, ast
|
|
@@ -15,6 +15,7 @@ from typing import get_type_hints
|
|
|
15
15
|
from inspect import Parameter, Signature
|
|
16
16
|
from decimal import Decimal
|
|
17
17
|
from uuid import UUID
|
|
18
|
+
from functools import reduce
|
|
18
19
|
|
|
19
20
|
# %% ../01_funccall.ipynb #a9f43047
|
|
20
21
|
empty = inspect.Parameter.empty
|
|
@@ -25,7 +26,7 @@ def _types(t:type)->tuple[str,Optional[str]]:
|
|
|
25
26
|
if t is empty: raise TypeError('Missing type')
|
|
26
27
|
tmap = {int:"integer", float:"number", str:"string", bool:"boolean", list:"array", dict:"object"}
|
|
27
28
|
tmap.update({k.__name__: v for k, v in tmap.items()})
|
|
28
|
-
if getattr(t, '__origin__', None) in (list,tuple):
|
|
29
|
+
if getattr(t, '__origin__', None) in (list,tuple,set):
|
|
29
30
|
args = getattr(t, '__args__', None)
|
|
30
31
|
item_type = "object" if not args else tmap.get(t.__args__[0].__name__, "object")
|
|
31
32
|
return "array", item_type
|
|
@@ -58,9 +59,11 @@ custom_types = {Path, bytes, Decimal, UUID}
|
|
|
58
59
|
|
|
59
60
|
def _handle_type(t, defs):
|
|
60
61
|
"Handle a single type, creating nested schemas if necessary"
|
|
62
|
+
ot = ifnone(get_origin(t), t)
|
|
61
63
|
if t is NoneType: return {'type': 'null'}
|
|
62
64
|
if t in custom_types: return {'type':'string', 'format':t.__name__}
|
|
63
|
-
if
|
|
65
|
+
if ot is dict: return {'type': _types(t)[0]}
|
|
66
|
+
if ot in (list, tuple, set): return {'type': _types(t)[0], 'items':{}}
|
|
64
67
|
if isinstance(t, type) and not issubclass(t, (int, float, str, bool)) or inspect.isfunction(t):
|
|
65
68
|
defs[t.__name__] = _get_nested_schema(t)
|
|
66
69
|
return {'$ref': f'#/$defs/{t.__name__}'}
|
|
@@ -132,12 +135,17 @@ def get_schema(
|
|
|
132
135
|
f:Union[callable,dict], # Function to get schema for
|
|
133
136
|
pname='input_schema', # Key name for parameters
|
|
134
137
|
evalable=False, # stringify defaults that can't be literal_eval'd?
|
|
135
|
-
skip_hidden=False # skip parameters starting with '_'?
|
|
138
|
+
skip_hidden=False, # skip parameters starting with '_'?
|
|
139
|
+
name=None # Override function name (useful for dotted paths like 'obj.method')
|
|
136
140
|
)->dict: # {'name':..., 'description':..., pname:...}
|
|
137
141
|
"Generate JSON schema for a class, function, or method"
|
|
138
142
|
if isinstance(f, dict): return f
|
|
143
|
+
if hasattr(f, '__call__') and not isinstance(f, type) and not inspect.isfunction(f) and not inspect.ismethod(f):
|
|
144
|
+
orig_doc = f.__doc__
|
|
145
|
+
f = f.__call__
|
|
146
|
+
else: orig_doc = None
|
|
139
147
|
schema = _get_nested_schema(f, evalable=evalable, skip_hidden=skip_hidden)
|
|
140
|
-
desc = f.__doc__
|
|
148
|
+
desc = f.__doc__ or orig_doc
|
|
141
149
|
assert desc, "Docstring missing!"
|
|
142
150
|
d = docments(f, full=True)
|
|
143
151
|
ret = d.pop('return')
|
|
@@ -147,7 +155,7 @@ def get_schema(
|
|
|
147
155
|
type_str = f'type: {_types(ret.anno)[0]}' if has_type else None
|
|
148
156
|
ret_str = f'{ret.docment} ({type_str})' if has_type and has_doc else (type_str if has_type else ret.docment)
|
|
149
157
|
desc += f'\n\nReturns:\n- {ret_str}'
|
|
150
|
-
return {"name": f.__name__, "description": desc, pname: schema}
|
|
158
|
+
return {"name": name or f.__name__, "description": desc, pname: schema}
|
|
151
159
|
|
|
152
160
|
# %% ../01_funccall.ipynb #873000d7
|
|
153
161
|
import ast, time, signal, traceback
|
|
@@ -223,11 +231,22 @@ def _coerce_inputs(func, inputs):
|
|
|
223
231
|
else: res[k] = v
|
|
224
232
|
return res
|
|
225
233
|
|
|
226
|
-
# %% ../01_funccall.ipynb #
|
|
234
|
+
# %% ../01_funccall.ipynb #925f462b
|
|
235
|
+
def resolve_nm(nm, ns):
|
|
236
|
+
st,*rest = nm.split('.')
|
|
237
|
+
return reduce(getattr, rest, ns[st])
|
|
238
|
+
|
|
239
|
+
# %% ../01_funccall.ipynb #6f6b5bfa
|
|
240
|
+
def get_schema_nm(nm:str, ns, dot2dash=False, **kwargs):
|
|
241
|
+
"Get schema for symbol `nm` in namespace `ns`, preserving the full dotted name"
|
|
242
|
+
name = nm.replace('.', '-') if dot2dash else nm
|
|
243
|
+
return get_schema(resolve_nm(nm, ns), name=name, **kwargs)
|
|
244
|
+
|
|
245
|
+
# %% ../01_funccall.ipynb #47b49644
|
|
227
246
|
def call_func(fc_name, fc_inputs, ns, raise_on_err=True):
|
|
228
247
|
"Call the function `fc_name` with the given `fc_inputs` using namespace `ns`."
|
|
229
248
|
if not isinstance(ns, abc.Mapping): ns = mk_ns(ns)
|
|
230
|
-
func = ns
|
|
249
|
+
func = resolve_nm(fc_name, ns)
|
|
231
250
|
inps = {re.sub(r'\W', '', k):v for k,v in fc_inputs.items()}
|
|
232
251
|
inps = _coerce_inputs(func, inps)
|
|
233
252
|
try: return func(**inps)
|
|
@@ -235,7 +254,7 @@ def call_func(fc_name, fc_inputs, ns, raise_on_err=True):
|
|
|
235
254
|
if raise_on_err: raise e from None
|
|
236
255
|
else: return traceback.format_exc()
|
|
237
256
|
|
|
238
|
-
# %% ../01_funccall.ipynb #
|
|
257
|
+
# %% ../01_funccall.ipynb #73bca085
|
|
239
258
|
async def call_func_async(fc_name, fc_inputs, ns, raise_on_err=True):
|
|
240
259
|
"Awaits the function `fc_name` with the given `fc_inputs` using namespace `ns`."
|
|
241
260
|
res = call_func(fc_name, fc_inputs, ns, raise_on_err=raise_on_err)
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: toolslm
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.28
|
|
4
4
|
Summary: Tools to make language models a bit easier to use
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
Keywords: nbdev
|
|
10
|
-
Classifier: Development Status :: 4 - Beta
|
|
11
|
-
Classifier: Intended Audience :: Developers
|
|
5
|
+
Author-email: Jeremy Howard <j@fast.ai>
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Project-URL: Repository, https://github.com/AnswerDotAI/toolslm
|
|
8
|
+
Project-URL: Documentation, https://AnswerDotAI.github.io/toolslm
|
|
9
|
+
Keywords: nbdev,jupyter,notebook,python
|
|
12
10
|
Classifier: Natural Language :: English
|
|
13
|
-
Classifier:
|
|
14
|
-
Classifier:
|
|
15
|
-
Classifier:
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
15
|
Requires-Python: >=3.9
|
|
17
16
|
Description-Content-Type: text/markdown
|
|
18
17
|
License-File: LICENSE
|
|
@@ -22,19 +21,7 @@ Requires-Dist: ghapi
|
|
|
22
21
|
Requires-Dist: codesigs
|
|
23
22
|
Provides-Extra: dev
|
|
24
23
|
Requires-Dist: ipython; extra == "dev"
|
|
25
|
-
Dynamic: author
|
|
26
|
-
Dynamic: author-email
|
|
27
|
-
Dynamic: classifier
|
|
28
|
-
Dynamic: description
|
|
29
|
-
Dynamic: description-content-type
|
|
30
|
-
Dynamic: home-page
|
|
31
|
-
Dynamic: keywords
|
|
32
|
-
Dynamic: license
|
|
33
24
|
Dynamic: license-file
|
|
34
|
-
Dynamic: provides-extra
|
|
35
|
-
Dynamic: requires-dist
|
|
36
|
-
Dynamic: requires-python
|
|
37
|
-
Dynamic: summary
|
|
38
25
|
|
|
39
26
|
# toolslm
|
|
40
27
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
toolslm/__init__.py,sha256=eHgKaEsTNXyaLskZLw_tmKgMJo4Bmsn8JX-mwr5QLLo,23
|
|
2
|
+
toolslm/_modidx.py,sha256=16eJzowUt9cpwnpt83goPyn_3Q3doH73X61s0YFmyuI,9172
|
|
3
|
+
toolslm/download.py,sha256=tBDG5QFnbDdRigiSBjA_GUAC4lAE1LOEs-cjpW5C-kw,4582
|
|
4
|
+
toolslm/funccall.py,sha256=Kzx_OjhQe_yuNKydYuHVExyvpSrP20hr05wEbSrQGgU,12512
|
|
5
|
+
toolslm/inspecttools.py,sha256=wkHlbOgbps7hTmYQbG7mg4gDkFL_prvk3pfgSQz27L4,9810
|
|
6
|
+
toolslm/md_hier.py,sha256=r_NPezhgfxjRmSYFlu_ND42hXt1qSbaPWHTcjbviOn4,11010
|
|
7
|
+
toolslm/shell.py,sha256=VhXav3MSwK7P8e63-HKawFmrCkOdZSi8t4QgsIu8oFU,1617
|
|
8
|
+
toolslm/xml.py,sha256=buCRuFluYQ2EvQR0nIGoeQoxrIln-o5QCRNyLFO_RcY,13226
|
|
9
|
+
toolslm-0.3.28.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
10
|
+
toolslm-0.3.28.dist-info/METADATA,sha256=PxhYugzJJCV3Km13RdZ56xXjz3L-kecRX_F_sdgyYKA,2231
|
|
11
|
+
toolslm-0.3.28.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
12
|
+
toolslm-0.3.28.dist-info/entry_points.txt,sha256=L77QoeUC_BjrE3BVY-Wpi4RMq_iwfX_1eAWchc6Zsmw,131
|
|
13
|
+
toolslm-0.3.28.dist-info/top_level.txt,sha256=4hRTrFWayz_Kz5221XjvlpCwVFrW3WPi1P0fllkTq9s,8
|
|
14
|
+
toolslm-0.3.28.dist-info/RECORD,,
|
toolslm-0.3.26.dist-info/RECORD
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
toolslm/__init__.py,sha256=PEJ4dz-V-DCK0OeabDYIWRrLQrxB_F8MVeCQiGql0Y0,23
|
|
2
|
-
toolslm/_modidx.py,sha256=uRIQ7S4CNtTE4v6um6VE0HTOLvCbnLzKjWVpYQSytRk,8930
|
|
3
|
-
toolslm/download.py,sha256=tBDG5QFnbDdRigiSBjA_GUAC4lAE1LOEs-cjpW5C-kw,4582
|
|
4
|
-
toolslm/funccall.py,sha256=S68mlYOn-OW0j52PR7pHzAKk_D3omWv0q1W5pt-GIUc,11650
|
|
5
|
-
toolslm/inspecttools.py,sha256=wkHlbOgbps7hTmYQbG7mg4gDkFL_prvk3pfgSQz27L4,9810
|
|
6
|
-
toolslm/md_hier.py,sha256=r_NPezhgfxjRmSYFlu_ND42hXt1qSbaPWHTcjbviOn4,11010
|
|
7
|
-
toolslm/shell.py,sha256=VhXav3MSwK7P8e63-HKawFmrCkOdZSi8t4QgsIu8oFU,1617
|
|
8
|
-
toolslm/xml.py,sha256=buCRuFluYQ2EvQR0nIGoeQoxrIln-o5QCRNyLFO_RcY,13226
|
|
9
|
-
toolslm-0.3.26.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
10
|
-
toolslm-0.3.26.dist-info/METADATA,sha256=8f85HepLX7oU4Upxw0UWkCMZzty10mkV2fg4NAqFeBQ,2489
|
|
11
|
-
toolslm-0.3.26.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
12
|
-
toolslm-0.3.26.dist-info/entry_points.txt,sha256=L77QoeUC_BjrE3BVY-Wpi4RMq_iwfX_1eAWchc6Zsmw,131
|
|
13
|
-
toolslm-0.3.26.dist-info/top_level.txt,sha256=4hRTrFWayz_Kz5221XjvlpCwVFrW3WPi1P0fllkTq9s,8
|
|
14
|
-
toolslm-0.3.26.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|