toolslm 0.0.3__py3-none-any.whl → 0.0.5__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 CHANGED
@@ -1 +1 @@
1
- __version__ = "0.0.3"
1
+ __version__ = "0.0.5"
toolslm/_modidx.py CHANGED
@@ -11,9 +11,6 @@ d = { 'settings': { 'branch': 'main',
11
11
  'toolslm.funccall._types': ('funccall.html#_types', 'toolslm/funccall.py'),
12
12
  'toolslm.funccall.get_schema': ('funccall.html#get_schema', 'toolslm/funccall.py'),
13
13
  'toolslm.funccall.python': ('funccall.html#python', 'toolslm/funccall.py')},
14
- 'toolslm.lmcode': { 'toolslm.lmcode._copy_loc': ('lmcode.html#_copy_loc', 'toolslm/lmcode.py'),
15
- 'toolslm.lmcode._run': ('lmcode.html#_run', 'toolslm/lmcode.py'),
16
- 'toolslm.lmcode.python': ('lmcode.html#python', 'toolslm/lmcode.py')},
17
14
  'toolslm.shell': { 'toolslm.shell.TerminalInteractiveShell.run_cell': ( 'shell.html#terminalinteractiveshell.run_cell',
18
15
  'toolslm/shell.py'),
19
16
  'toolslm.shell.get_shell': ('shell.html#get_shell', 'toolslm/shell.py')},
@@ -21,9 +18,7 @@ d = { 'settings': { 'branch': 'main',
21
18
  'toolslm.xml.docs_xml': ('xml.html#docs_xml', 'toolslm/xml.py'),
22
19
  'toolslm.xml.files2ctx': ('xml.html#files2ctx', 'toolslm/xml.py'),
23
20
  'toolslm.xml.folder2ctx': ('xml.html#folder2ctx', 'toolslm/xml.py'),
24
- 'toolslm.xml.hl_md': ('xml.html#hl_md', 'toolslm/xml.py'),
21
+ 'toolslm.xml.folder2ctx_cli': ('xml.html#folder2ctx_cli', 'toolslm/xml.py'),
25
22
  'toolslm.xml.json_to_xml': ('xml.html#json_to_xml', 'toolslm/xml.py'),
26
23
  'toolslm.xml.mk_doc': ('xml.html#mk_doc', 'toolslm/xml.py'),
27
- 'toolslm.xml.mk_doctype': ('xml.html#mk_doctype', 'toolslm/xml.py'),
28
- 'toolslm.xml.to_xml': ('xml.html#to_xml', 'toolslm/xml.py'),
29
- 'toolslm.xml.xt': ('xml.html#xt', 'toolslm/xml.py')}}}
24
+ 'toolslm.xml.mk_doctype': ('xml.html#mk_doctype', 'toolslm/xml.py')}}}
toolslm/funccall.py CHANGED
@@ -29,7 +29,7 @@ def _param(name, info):
29
29
  return pschema
30
30
 
31
31
  # %% ../01_funccall.ipynb 17
32
- def get_schema(f:callable)->dict:
32
+ def get_schema(f:callable, pname='input_schema')->dict:
33
33
  "Convert function `f` into a JSON schema `dict` for tool use."
34
34
  d = docments(f, full=True)
35
35
  ret = d.pop('return')
@@ -40,9 +40,10 @@ def get_schema(f:callable)->dict:
40
40
  'required': [n for n,o in d.items() if o.default is empty and n[0]!='_']
41
41
  }
42
42
  desc = f.__doc__
43
+ assert desc, "Docstring missing!"
43
44
  if ret.anno is not empty: desc += f'\n\nReturns:\n- type: {_types(ret.anno)[0]}'
44
45
  if ret.docment: desc += f'\n- description: {ret.docment}'
45
- return dict(name=f.__name__, description=desc or "", input_schema=paramd)
46
+ return {'name':f.__name__, 'description':desc, pname:paramd}
46
47
 
47
48
  # %% ../01_funccall.ipynb 22
48
49
  import ast, time, signal, traceback
toolslm/xml.py CHANGED
@@ -1,8 +1,7 @@
1
1
  # AUTOGENERATED! DO NOT EDIT! File to edit: ../00_xml.ipynb.
2
2
 
3
3
  # %% auto 0
4
- __all__ = ['g', 'tags', 'doctype', 'xt', 'hl_md', 'to_xml', 'json_to_xml', 'mk_doctype', 'mk_doc', 'docs_xml', 'files2ctx',
5
- 'folder2ctx']
4
+ __all__ = ['doctype', 'json_to_xml', 'mk_doctype', 'mk_doc', 'docs_xml', 'files2ctx', 'folder2ctx', 'folder2ctx_cli']
6
5
 
7
6
  # %% ../00_xml.ipynb 3
8
7
  import hashlib,xml.etree.ElementTree as ET
@@ -10,45 +9,13 @@ from collections import namedtuple
10
9
 
11
10
  from fastcore.utils import *
12
11
  from fastcore.meta import delegates
12
+ from fastcore.xtras import hl_md
13
+ from fastcore.xml import to_xml, Document, Documents, Document_content, Source
14
+ from fastcore.script import call_parse
13
15
  try: from IPython import display
14
16
  except: display=None
15
17
 
16
- # %% ../00_xml.ipynb 6
17
- def xt(tag:str, # XML tag name
18
- c:Optional[list]=None, # Children
19
- **kw):
20
- "Helper to create appropriate data structure for `to_xml`."
21
- kw = {k.lstrip('_'):str(v) for k,v in kw.items()}
22
- return tag,c,kw
23
-
24
- # %% ../00_xml.ipynb 9
25
- g = globals()
26
- tags = 'div img h1 h2 h3 h4 h5 p hr span html'.split()
27
- for o in tags: g[o] = partial(xt, o)
28
-
29
- # %% ../00_xml.ipynb 12
30
- def hl_md(s, lang='xml'):
31
- "Syntax highlight `s` using `lang`."
32
- if display: return display.Markdown(f'```{lang}\n{s}\n```')
33
- print(s)
34
-
35
- # %% ../00_xml.ipynb 15
36
- def to_xml(node:tuple, # XML structure in `xt` format
37
- hl=False # Syntax highlight response?
38
- ):
39
- "Convert `node` to an XML string."
40
- def mk_el(tag, cs, attrs):
41
- el = ET.Element(tag, attrib=attrs)
42
- if isinstance(cs, list): el.extend([mk_el(*o) for o in cs])
43
- elif cs is not None: el.text = str(cs)
44
- return el
45
-
46
- root = mk_el(*node)
47
- ET.indent(root, space=' ' if hl else '')
48
- res = ET.tostring(root, encoding='unicode')
49
- return hl_md(res) if hl else res
50
-
51
- # %% ../00_xml.ipynb 18
18
+ # %% ../00_xml.ipynb 4
52
19
  def json_to_xml(d:dict, # JSON dictionary to convert
53
20
  rnm:str # Root name
54
21
  )->str:
@@ -64,17 +31,18 @@ def json_to_xml(d:dict, # JSON dictionary to convert
64
31
  ET.indent(root)
65
32
  return ET.tostring(root, encoding='unicode')
66
33
 
67
- # %% ../00_xml.ipynb 23
34
+ # %% ../00_xml.ipynb 9
68
35
  doctype = namedtuple('doctype', ['source', 'content'])
69
36
 
70
- # %% ../00_xml.ipynb 25
37
+ # %% ../00_xml.ipynb 11
71
38
  def _add_nls(s):
72
39
  "Add newlines to start and end of `s` if missing"
40
+ if not s: return s
73
41
  if s[ 0]!='\n': s = '\n'+s
74
42
  if s[-1]!='\n': s = s+'\n'
75
43
  return s
76
44
 
77
- # %% ../00_xml.ipynb 27
45
+ # %% ../00_xml.ipynb 13
78
46
  def mk_doctype(content:str, # The document content
79
47
  source:Optional[str]=None # URL, filename, etc; defaults to `md5(content)` if not provided
80
48
  ) -> namedtuple:
@@ -82,18 +50,29 @@ def mk_doctype(content:str, # The document content
82
50
  if source is None: source = hashlib.md5(content.encode()).hexdigest()[:8]
83
51
  return doctype(_add_nls(str(source).strip()), _add_nls(content.strip()))
84
52
 
85
- # %% ../00_xml.ipynb 30
53
+ # %% ../00_xml.ipynb 17
86
54
  def mk_doc(index:int, # The document index
87
55
  content:str, # The document content
88
56
  source:Optional[str]=None # URL, filename, etc; defaults to `md5(content)` if not provided
89
57
  ) -> tuple:
90
- "Create an `xt` format tuple for a single doc in Anthropic's recommended format"
58
+ "Create an `ft` format tuple for a single doc in Anthropic's recommended format"
91
59
  dt = mk_doctype(content, source)
92
- content = xt('document_content', dt.content)
93
- source = xt('source', dt.source)
94
- return xt('document', [source, content], index=index)
60
+ content = ft('document_content', dt.content)
61
+ source = ft('source', dt.source)
62
+ return ft('document', source, content, index=index)
95
63
 
96
- # %% ../00_xml.ipynb 33
64
+ # %% ../00_xml.ipynb 18
65
+ def mk_doc(index:int, # The document index
66
+ content:str, # The document content
67
+ source:Optional[str]=None # URL, filename, etc; defaults to `md5(content)` if not provided
68
+ ) -> tuple:
69
+ "Create an `ft` format tuple for a single doc in Anthropic's recommended format"
70
+ dt = mk_doctype(content, source)
71
+ content = Document_content(dt.content)
72
+ source = Source(dt.source)
73
+ return Document(source, content, index=index)
74
+
75
+ # %% ../00_xml.ipynb 22
97
76
  def docs_xml(docs:list[str], # The content of each document
98
77
  sources:Optional[list]=None, # URLs, filenames, etc; each one defaults to `md5(content)` if not provided
99
78
  prefix:bool=True # Include Anthropic's suggested prose intro?
@@ -101,10 +80,10 @@ def docs_xml(docs:list[str], # The content of each document
101
80
  "Create an XML string containing `docs` in Anthropic's recommended format"
102
81
  pre = 'Here are some documents for you to reference for your task:\n\n' if prefix else ''
103
82
  if sources is None: sources = [None]*len(docs)
104
- docs = [mk_doc(i+1, *o) for i,o in enumerate(zip(docs,sources))]
105
- return pre + to_xml(xt('documents', docs))
83
+ docs = (mk_doc(i+1, *o) for i,o in enumerate(zip(docs,sources)))
84
+ return pre + to_xml(Documents(docs))
106
85
 
107
- # %% ../00_xml.ipynb 40
86
+ # %% ../00_xml.ipynb 29
108
87
  def files2ctx(
109
88
  fnames:list[Union[str,Path]], # List of file names to add to context
110
89
  prefix:bool=True # Include Anthropic's suggested prose intro?
@@ -113,7 +92,7 @@ def files2ctx(
113
92
  contents = [o.read_text() for o in fnames]
114
93
  return docs_xml(contents, fnames, prefix=prefix)
115
94
 
116
- # %% ../00_xml.ipynb 43
95
+ # %% ../00_xml.ipynb 32
117
96
  @delegates(globtastic)
118
97
  def folder2ctx(
119
98
  folder:Union[str,Path], # Folder name containing files to add to context
@@ -122,3 +101,12 @@ def folder2ctx(
122
101
  )->str: # XML for Claude context
123
102
  fnames = globtastic(folder, **kwargs)
124
103
  return files2ctx(fnames, prefix=prefix)
104
+
105
+ # %% ../00_xml.ipynb 34
106
+ @call_parse
107
+ @delegates(folder2ctx)
108
+ def folder2ctx_cli(
109
+ folder:str, # Folder name containing files to add to context
110
+ **kwargs # Passed to `folder2ctx`
111
+ )->str: # XML for Claude context
112
+ return folder2ctx(folder, **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: toolslm
3
- Version: 0.0.3
3
+ Version: 0.0.5
4
4
  Summary: Tools to make language models a bit easier to use
5
5
  Home-page: https://github.com/AnswerDotAI/toolslm
6
6
  Author: Jeremy Howard
@@ -16,7 +16,7 @@ Classifier: License :: OSI Approved :: Apache Software License
16
16
  Requires-Python: >=3.9
17
17
  Description-Content-Type: text/markdown
18
18
  License-File: LICENSE
19
- Requires-Dist: fastcore
19
+ Requires-Dist: fastcore >=1.5.47
20
20
  Provides-Extra: dev
21
21
 
22
22
  # toolslm
@@ -0,0 +1,11 @@
1
+ toolslm/__init__.py,sha256=S7u1lbuWmM3A3ajykBialmPoJUK6Jg-WmNqM-9OZFdk,22
2
+ toolslm/_modidx.py,sha256=6T36Q2cYKH0lp9Tt9Us8xpZV-Z0FYqrtZGu2ZykHDkg,2068
3
+ toolslm/funccall.py,sha256=mzWNLdZY6cYk-I3O5noRiEB089mPwJhnRQFsS5_JYDs,3856
4
+ toolslm/shell.py,sha256=GVqfL74NHw66zzZ7jvGVLjE55ZNJGBPvEb8kLz4aoYc,1576
5
+ toolslm/xml.py,sha256=3rMyYK9VOvY3NElSNEoMGIe4iM8InKM-gbvjrK-2Ub0,4421
6
+ toolslm-0.0.5.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
7
+ toolslm-0.0.5.dist-info/METADATA,sha256=cJmpD5wO6AO62izboiKw8KeifsGy9duhZnJW_IQSXDg,3782
8
+ toolslm-0.0.5.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
9
+ toolslm-0.0.5.dist-info/entry_points.txt,sha256=xFz0Eymlo5X7BGpaO6DI9gMxvN5A7faebzrlr8ctp5I,95
10
+ toolslm-0.0.5.dist-info/top_level.txt,sha256=4hRTrFWayz_Kz5221XjvlpCwVFrW3WPi1P0fllkTq9s,8
11
+ toolslm-0.0.5.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ [console_scripts]
2
+ folder2ctx = toolslm.xml:folder2ctx_cli
3
+
4
+ [nbdev]
5
+ toolslm = toolslm._modidx:d
@@ -1,11 +0,0 @@
1
- toolslm/__init__.py,sha256=4GZKi13lDTD25YBkGakhZyEQZWTER_OWQMNPoH_UM2c,22
2
- toolslm/_modidx.py,sha256=mf2R89-fA85sjtgETrs_981ZiKBXwlnfWSo7FYPQDBg,2531
3
- toolslm/funccall.py,sha256=VLJ16OPeyv4QwMY6pTOGig0uep2QbEvN4lXIk3OfqEw,3809
4
- toolslm/shell.py,sha256=GVqfL74NHw66zzZ7jvGVLjE55ZNJGBPvEb8kLz4aoYc,1576
5
- toolslm/xml.py,sha256=4DnFUYG09fB1ZTzcyeugKdkMU40MMMf3zZEHbDfSGIo,4635
6
- toolslm-0.0.3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
7
- toolslm-0.0.3.dist-info/METADATA,sha256=xdGav82GXXWNJUDvGg2Hr6WXrDmUHR3zXeJ45FUC4J8,3773
8
- toolslm-0.0.3.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
9
- toolslm-0.0.3.dist-info/entry_points.txt,sha256=3os5YWuvVIFuweYaNtnwgv-xCe4Gb1KcZndFz8KWI0E,36
10
- toolslm-0.0.3.dist-info/top_level.txt,sha256=4hRTrFWayz_Kz5221XjvlpCwVFrW3WPi1P0fllkTq9s,8
11
- toolslm-0.0.3.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- [nbdev]
2
- toolslm = toolslm._modidx:d