llms-py 3.0.17__tar.gz → 3.0.19__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.
Files changed (214) hide show
  1. {llms_py-3.0.17/llms_py.egg-info → llms_py-3.0.19}/PKG-INFO +1 -1
  2. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/providers/openai.py +5 -0
  3. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/skills/ui/index.mjs +22 -8
  4. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/tools/ui/index.mjs +91 -60
  5. {llms_py-3.0.17 → llms_py-3.0.19}/llms/main.py +2 -2
  6. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/ai.mjs +1 -1
  7. {llms_py-3.0.17 → llms_py-3.0.19/llms_py.egg-info}/PKG-INFO +1 -1
  8. {llms_py-3.0.17 → llms_py-3.0.19}/pyproject.toml +1 -1
  9. {llms_py-3.0.17 → llms_py-3.0.19}/setup.py +1 -1
  10. {llms_py-3.0.17 → llms_py-3.0.19}/LICENSE +0 -0
  11. {llms_py-3.0.17 → llms_py-3.0.19}/MANIFEST.in +0 -0
  12. {llms_py-3.0.17 → llms_py-3.0.19}/README.md +0 -0
  13. {llms_py-3.0.17 → llms_py-3.0.19}/llms/__init__.py +0 -0
  14. {llms_py-3.0.17 → llms_py-3.0.19}/llms/__main__.py +0 -0
  15. {llms_py-3.0.17 → llms_py-3.0.19}/llms/db.py +0 -0
  16. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/analytics/ui/index.mjs +0 -0
  17. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/app/README.md +0 -0
  18. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/app/__init__.py +0 -0
  19. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/app/db.py +0 -0
  20. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/app/ui/Recents.mjs +0 -0
  21. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/app/ui/index.mjs +0 -0
  22. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/app/ui/threadStore.mjs +0 -0
  23. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/computer/README.md +0 -0
  24. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/computer/__init__.py +0 -0
  25. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/computer/base.py +0 -0
  26. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/computer/bash.py +0 -0
  27. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/computer/computer.py +0 -0
  28. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/computer/edit.py +0 -0
  29. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/computer/filesystem.py +0 -0
  30. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/computer/platform.py +0 -0
  31. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/computer/run.py +0 -0
  32. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/CALCULATOR.md +0 -0
  33. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/__init__.py +0 -0
  34. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +0 -0
  35. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +0 -0
  36. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +0 -0
  37. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +0 -0
  38. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +0 -0
  39. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +0 -0
  40. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +0 -0
  41. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +0 -0
  42. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +0 -0
  43. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/codemirror.css +0 -0
  44. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/codemirror.js +0 -0
  45. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/doc/docs.css +0 -0
  46. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  47. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +0 -0
  48. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +0 -0
  49. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +0 -0
  50. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +0 -0
  51. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/mode/python/python.js +0 -0
  52. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/theme/dracula.css +0 -0
  53. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/codemirror/theme/mocha.css +0 -0
  54. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/core_tools/ui/index.mjs +0 -0
  55. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/gallery/README.md +0 -0
  56. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/gallery/__init__.py +0 -0
  57. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/gallery/db.py +0 -0
  58. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/gallery/ui/index.mjs +0 -0
  59. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/README.md +0 -0
  60. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/__init__.py +0 -0
  61. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/README.md +0 -0
  62. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/auto-render.js +0 -0
  63. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/auto-render.min.js +0 -0
  64. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/auto-render.mjs +0 -0
  65. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/copy-tex.js +0 -0
  66. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/copy-tex.min.js +0 -0
  67. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/copy-tex.mjs +0 -0
  68. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/mathtex-script-type.js +0 -0
  69. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +0 -0
  70. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +0 -0
  71. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/mhchem.js +0 -0
  72. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/mhchem.min.js +0 -0
  73. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/mhchem.mjs +0 -0
  74. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/render-a11y-string.js +0 -0
  75. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/render-a11y-string.min.js +0 -0
  76. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/contrib/render-a11y-string.mjs +0 -0
  77. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  78. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  79. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  80. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  81. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  82. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  83. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  84. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  85. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  86. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  87. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  88. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  89. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  90. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  91. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  92. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  93. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  94. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  95. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  96. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  97. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  98. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  99. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  100. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  101. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  102. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  103. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  104. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  105. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  106. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  107. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  108. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  109. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  110. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  111. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  112. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  113. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  114. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  115. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  116. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  117. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  118. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  119. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  120. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  121. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  122. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  123. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  124. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  125. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  126. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  127. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  128. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  129. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  130. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  131. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  132. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  133. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  134. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  135. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  136. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  137. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/index.mjs +0 -0
  138. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/katex-swap.css +0 -0
  139. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/katex-swap.min.css +0 -0
  140. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/katex.css +0 -0
  141. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/katex.js +0 -0
  142. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/katex.min.css +0 -0
  143. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/katex.min.js +0 -0
  144. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/katex.min.mjs +0 -0
  145. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/katex/ui/katex.mjs +0 -0
  146. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/providers/__init__.py +0 -0
  147. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/providers/anthropic.py +0 -0
  148. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/providers/cerebras.py +0 -0
  149. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/providers/chutes.py +0 -0
  150. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/providers/google.py +0 -0
  151. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/providers/nvidia.py +0 -0
  152. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/providers/openrouter.py +0 -0
  153. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/providers/zai.py +0 -0
  154. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/skills/LICENSE +0 -0
  155. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/skills/__init__.py +0 -0
  156. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/skills/errors.py +0 -0
  157. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/skills/models.py +0 -0
  158. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/skills/parser.py +0 -0
  159. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/skills/ui/skills/create-plan/SKILL.md +0 -0
  160. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/skills/validator.py +0 -0
  161. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/system_prompts/README.md +0 -0
  162. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/system_prompts/__init__.py +0 -0
  163. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/system_prompts/ui/index.mjs +0 -0
  164. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/system_prompts/ui/prompts.json +0 -0
  165. {llms_py-3.0.17 → llms_py-3.0.19}/llms/extensions/tools/__init__.py +0 -0
  166. {llms_py-3.0.17 → llms_py-3.0.19}/llms/index.html +0 -0
  167. {llms_py-3.0.17 → llms_py-3.0.19}/llms/llms.json +0 -0
  168. {llms_py-3.0.17 → llms_py-3.0.19}/llms/providers-extra.json +0 -0
  169. {llms_py-3.0.17 → llms_py-3.0.19}/llms/providers.json +0 -0
  170. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/App.mjs +0 -0
  171. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/app.css +0 -0
  172. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/ctx.mjs +0 -0
  173. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/fav.svg +0 -0
  174. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/index.mjs +0 -0
  175. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/chart.js +0 -0
  176. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/charts.mjs +0 -0
  177. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/color.js +0 -0
  178. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/highlight.min.mjs +0 -0
  179. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/idb.min.mjs +0 -0
  180. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/marked.min.mjs +0 -0
  181. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/servicestack-client.mjs +0 -0
  182. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/servicestack-vue.mjs +0 -0
  183. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/vue-router.min.mjs +0 -0
  184. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/vue.min.mjs +0 -0
  185. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/lib/vue.mjs +0 -0
  186. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/markdown.mjs +0 -0
  187. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/modules/chat/ChatBody.mjs +0 -0
  188. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/modules/chat/SettingsDialog.mjs +0 -0
  189. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/modules/chat/index.mjs +0 -0
  190. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/modules/icons.mjs +0 -0
  191. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/modules/layout.mjs +0 -0
  192. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/modules/model-selector.mjs +0 -0
  193. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/tailwind.input.css +0 -0
  194. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/typography.css +0 -0
  195. {llms_py-3.0.17 → llms_py-3.0.19}/llms/ui/utils.mjs +0 -0
  196. {llms_py-3.0.17 → llms_py-3.0.19}/llms_py.egg-info/SOURCES.txt +0 -0
  197. {llms_py-3.0.17 → llms_py-3.0.19}/llms_py.egg-info/dependency_links.txt +0 -0
  198. {llms_py-3.0.17 → llms_py-3.0.19}/llms_py.egg-info/entry_points.txt +0 -0
  199. {llms_py-3.0.17 → llms_py-3.0.19}/llms_py.egg-info/not-zip-safe +0 -0
  200. {llms_py-3.0.17 → llms_py-3.0.19}/llms_py.egg-info/requires.txt +0 -0
  201. {llms_py-3.0.17 → llms_py-3.0.19}/llms_py.egg-info/top_level.txt +0 -0
  202. {llms_py-3.0.17 → llms_py-3.0.19}/requirements.txt +0 -0
  203. {llms_py-3.0.17 → llms_py-3.0.19}/setup.cfg +0 -0
  204. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_async.py +0 -0
  205. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_config.py +0 -0
  206. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_core_tools_direct.py +0 -0
  207. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_extensions.py +0 -0
  208. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_gemini_tool_calling.py +0 -0
  209. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_gemini_upload.py +0 -0
  210. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_integration.py +0 -0
  211. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_interleaved_thinking.py +0 -0
  212. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_provider_checks.py +0 -0
  213. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_provider_config.py +0 -0
  214. {llms_py-3.0.17 → llms_py-3.0.19}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.17
3
+ Version: 3.0.19
4
4
  Summary: A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers
5
5
  Home-page: https://github.com/ServiceStack/llms
6
6
  Author: ServiceStack
@@ -18,6 +18,11 @@ def install_openai(ctx):
18
18
  super().__init__(**kwargs)
19
19
  self.modalities["image"] = OpenAiGenerator(**kwargs)
20
20
 
21
+ async def process_chat(self, chat, provider_id=None):
22
+ ret = await super().process_chat(chat, provider_id)
23
+ chat.pop("modalities", None) # openai chat completion doesn't support modalities
24
+ return ret
25
+
21
26
  # https://platform.openai.com/docs/api-reference/images
22
27
  class OpenAiGenerator(GeneratorBase):
23
28
  sdk = "openai/image"
@@ -11,14 +11,21 @@ const SkillSelector = {
11
11
  <div class="flex items-center justify-between mb-4">
12
12
  <span class="text-xs font-bold uppercase text-gray-500 tracking-wider">Include Skills</span>
13
13
  <div class="flex items-center gap-2">
14
- <button @click="$ctx.setPrefs({ onlySkills: null })"
14
+ <button type="button" v-if="!$ctx.tools?.isToolEnabled('skill')"
15
+ class="px-3 py-1 rounded-md text-xs font-medium border transition-colors select-none cursor-pointer bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-400 border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600"
16
+ @click="$ctx.tools?.enableTool('skill')"
17
+ title="'skill' tool needs to be enabled to use Skills"
18
+ >
19
+ <span class="text-xs font-semibold text-red-700 dark:text-red-300">⚠️ Enable skill tool</span>
20
+ </button>
21
+ <button type="button" @click="$ctx.setPrefs({ onlySkills: null })"
15
22
  class="px-3 py-1 rounded-md text-xs font-medium border transition-colors select-none"
16
23
  :class="$prefs.onlySkills == null
17
24
  ? 'bg-green-100 dark:bg-green-900/40 text-green-800 dark:text-green-300 border-green-300 dark:border-green-800'
18
25
  : 'cursor-pointer bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-400 border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'">
19
26
  All Skills
20
27
  </button>
21
- <button @click="$ctx.setPrefs({ onlySkills:[] })"
28
+ <button type="button" @click="$ctx.setPrefs({ onlySkills:[] })"
22
29
  class="px-3 py-1 rounded-md text-xs font-medium border transition-colors select-none"
23
30
  :class="$prefs.onlySkills?.length === 0
24
31
  ? 'bg-fuchsia-100 dark:bg-fuchsia-900/40 text-fuchsia-800 dark:text-fuchsia-300 border-fuchsia-200 dark:border-fuchsia-800'
@@ -264,24 +271,31 @@ export default {
264
271
  component: {
265
272
  template: svg([
266
273
  `@click="$ctx.toggleTop('SkillSelector')"`,
267
- `:class="$prefs.onlySkills == null ? 'text-green-600 dark:text-green-300' : $prefs.onlySkills.length ? 'text-blue-600! dark:text-blue-300!' : ''"`
274
+ `:class="!$tools?.isToolEnabled('skill') ? '' : $prefs.onlySkills == null ? 'text-green-600 dark:text-green-300' : $prefs.onlySkills.length ? 'text-blue-600! dark:text-blue-300!' : ''"`
268
275
  ].join(' ')),
269
276
  },
270
277
  isActive({ top }) {
271
278
  return top === 'SkillSelector'
272
279
  },
273
280
  get title() {
274
- return ctx.prefs.onlySkills == null
275
- ? `All Skills Included`
276
- : ctx.prefs.onlySkills.length
277
- ? `${ctx.prefs.onlySkills.length} ${ctx.utils.pluralize('Skill', ctx.prefs.onlySkills.length)} Included`
278
- : 'No Skills Included'
281
+ return !ctx.tools?.isToolEnabled('skill')
282
+ ? `skill tool not enabled`
283
+ : ctx.prefs.onlySkills == null
284
+ ? `All Skills Included`
285
+ : ctx.prefs.onlySkills.length
286
+ ? `${ctx.prefs.onlySkills.length} ${ctx.utils.pluralize('Skill', ctx.prefs.onlySkills.length)} Included`
287
+ : 'No Skills Included'
279
288
  }
280
289
  }
281
290
  })
282
291
 
283
292
  ctx.chatRequestFilters.push(({ request, thread, context }) => {
284
293
 
294
+ if (!ctx.tools?.isToolEnabled('skill')) {
295
+ console.log(`skills.chatRequestFilters: 'skill' tool is not enabled`)
296
+ return
297
+ }
298
+
285
299
  const prefs = ctx.prefs
286
300
  if (prefs.onlySkills != null) {
287
301
  if (Array.isArray(prefs.onlySkills)) {
@@ -2,6 +2,86 @@ import { inject, computed, ref, onMounted } from "vue"
2
2
 
3
3
  let ext
4
4
 
5
+ function useTools(ctx) {
6
+
7
+ const availableTools = computed(() => ctx.state.tool.definitions.filter(x => x.function))
8
+ const toolPageHeaders = {}
9
+
10
+ function setToolPageHeaders(components) {
11
+ Object.assign(toolPageHeaders, components)
12
+ }
13
+
14
+ function selectTool({ group, tool }) {
15
+ ext.setPrefs({ selectedGroup: group, selectedTool: tool })
16
+ }
17
+
18
+ function getToolDefinition(name) {
19
+ return ctx.state.tool.definitions.find(d => d.function?.name === name)
20
+ }
21
+
22
+ function isToolEnabled(name) {
23
+ const toolDef = getToolDefinition(name)
24
+ if (!toolDef) return false
25
+ const onlyTools = ctx.prefs.onlyTools
26
+ if (onlyTools == null) return true
27
+ return Array.isArray(onlyTools) && onlyTools.includes(name)
28
+ }
29
+
30
+ function enableTool(name) {
31
+ let onlyTools = ctx.prefs.onlyTools
32
+ if (onlyTools == null) return // All tools are enabled
33
+
34
+ if (!Array.isArray(onlyTools)) {
35
+ onlyTools = [onlyTools]
36
+ }
37
+ else if (!onlyTools.includes(name)) {
38
+ onlyTools.push(name)
39
+ } else {
40
+ return // Already enabled
41
+ }
42
+ ctx.setPrefs({ onlyTools })
43
+ }
44
+
45
+ function disableTool(name) {
46
+ let onlyTools = ctx.prefs.onlyTools
47
+ if (onlyTools == null) {
48
+ // If currently 'All', clicking a tool means we enter custom mode with all OTHER tools selected
49
+ onlyTools = availableTools.value.map(t => t.function.name).filter(t => t !== name)
50
+ } else if (!Array.isArray(onlyTools)) {
51
+ onlyTools = []
52
+ } else {
53
+ onlyTools = onlyTools.filter(t => t !== name)
54
+ }
55
+ ctx.setPrefs({ onlyTools })
56
+ }
57
+
58
+ function toggleTool(name, enable = null) {
59
+ if (enable == null) {
60
+ enable = !isToolEnabled(name)
61
+ }
62
+ if (enable) {
63
+ enableTool(name)
64
+ } else {
65
+ disableTool(name)
66
+ }
67
+ }
68
+
69
+ return {
70
+ availableTools,
71
+ toolPageHeaders,
72
+ setToolPageHeaders,
73
+ selectTool,
74
+ getToolDefinition,
75
+ isToolEnabled,
76
+ enableTool,
77
+ disableTool,
78
+ toggleTool,
79
+ get selectedGroup() { return ext.prefs.selectedGroup },
80
+ get selectedTool() { return ext.prefs.selectedTool },
81
+ }
82
+ }
83
+
84
+
5
85
  const ToolResult = {
6
86
  template: `
7
87
  <div>
@@ -487,14 +567,14 @@ const ToolSelector = {
487
567
  <div class="flex items-center gap-2">
488
568
  <button @click="$ctx.setPrefs({ onlyTools: null })"
489
569
  class="px-3 py-1 rounded-md text-xs font-medium border transition-colors select-none"
490
- :class="$prefs.onlyTools == null
570
+ :class="prefs.onlyTools == null
491
571
  ? 'bg-green-100 dark:bg-green-900/40 text-green-800 dark:text-green-300 border-green-300 dark:border-green-800'
492
572
  : 'cursor-pointer bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-400 border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'">
493
573
  All Tools
494
574
  </button>
495
575
  <button @click="$ctx.setPrefs({ onlyTools:[] })"
496
576
  class="px-3 py-1 rounded-md text-xs font-medium border transition-colors select-none"
497
- :class="$prefs.onlyTools?.length === 0
577
+ :class="prefs.onlyTools?.length === 0
498
578
  ? 'bg-fuchsia-100 dark:bg-fuchsia-900/40 text-fuchsia-800 dark:text-fuchsia-300 border-fuchsia-200 dark:border-fuchsia-800'
499
579
  : 'cursor-pointer bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-400 border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'">
500
580
  No Tools
@@ -547,10 +627,10 @@ const ToolSelector = {
547
627
  <div v-show="!isCollapsed(group.name)" class="p-3 bg-white dark:bg-gray-900 border-t border-gray-100 dark:border-gray-800">
548
628
  <div class="flex flex-wrap gap-2">
549
629
  <button v-for="tool in group.tools" :key="tool.function.name" type="button"
550
- @click="toggleTool(tool.function.name)"
630
+ @click="$tools.toggleTool(tool.function.name)"
551
631
  :title="tool.function.description"
552
632
  class="px-2.5 py-1 rounded-full text-xs font-medium border transition-colors select-none text-left truncate max-w-[200px]"
553
- :class="isToolActive(tool.function.name)
633
+ :class="$tools.isToolEnabled(tool.function.name)
554
634
  ? 'bg-blue-100 dark:bg-blue-900/40 text-blue-800 dark:text-blue-300 border-blue-200 dark:border-blue-800'
555
635
  : 'bg-gray-50 dark:bg-gray-800 text-gray-600 dark:text-gray-400 border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'">
556
636
  {{ tool.function.name }}
@@ -565,10 +645,10 @@ const ToolSelector = {
565
645
  const ctx = inject('ctx')
566
646
  const collapsedState = ref({})
567
647
 
568
- const availableTools = computed(() => ctx.state.tool.definitions.filter(x => x.function))
648
+ const prefs = computed(() => ctx.prefs)
569
649
 
570
650
  const toolGroups = computed(() => {
571
- const defs = availableTools.value
651
+ const defs = ctx.tools.availableTools.value
572
652
  const groups = ctx.state.tool.groups || {}
573
653
 
574
654
  const definedGroups = []
@@ -591,33 +671,6 @@ const ToolSelector = {
591
671
  return definedGroups
592
672
  })
593
673
 
594
- function isToolActive(name) {
595
- const only = ctx.prefs.onlyTools
596
- if (only == null) return true
597
- if (Array.isArray(only)) {
598
- return only.includes(name)
599
- }
600
- return false
601
- }
602
-
603
- function toggleTool(name) {
604
- let onlyTools = ctx.prefs.onlyTools
605
-
606
- // If currently 'All', clicking a tool means we enter custom mode with all OTHER tools selected (deselecting clicked)
607
- if (onlyTools == null) {
608
- onlyTools = availableTools.value.map(t => t.function.name).filter(t => t !== name)
609
- } else {
610
- // Currently Custom or None
611
- if (onlyTools.includes(name)) {
612
- onlyTools = onlyTools.filter(t => t !== name)
613
- } else {
614
- onlyTools = [...onlyTools, name]
615
- }
616
- }
617
-
618
- ctx.setPrefs({ onlyTools })
619
- }
620
-
621
674
  function toggleCollapse(groupName) {
622
675
  const key = groupName || '_other_'
623
676
  collapsedState.value[key] = !collapsedState.value[key]
@@ -630,19 +683,19 @@ const ToolSelector = {
630
683
 
631
684
  function setGroupTools(group, enable) {
632
685
  const groupToolNames = group.tools.map(t => t.function.name)
633
- let onlyTools = ctx.prefs.onlyTools
686
+ let onlyTools = prefs.value.onlyTools
634
687
 
635
688
  if (enable) {
636
689
  if (onlyTools == null) return
637
690
  const newSet = new Set(onlyTools)
638
691
  groupToolNames.forEach(n => newSet.add(n))
639
692
  onlyTools = Array.from(newSet)
640
- if (onlyTools.length === availableTools.value.length) {
693
+ if (onlyTools.length === ctx.tools.availableTools.value.length) {
641
694
  onlyTools = null
642
695
  }
643
696
  } else {
644
697
  if (onlyTools == null) {
645
- onlyTools = availableTools.value
698
+ onlyTools = ctx.tools.availableTools.value
646
699
  .map(t => t.function.name)
647
700
  .filter(n => !groupToolNames.includes(n))
648
701
  } else {
@@ -654,16 +707,14 @@ const ToolSelector = {
654
707
  }
655
708
 
656
709
  function getActiveCount(group) {
657
- const onlyTools = ctx.prefs.onlyTools
710
+ const onlyTools = prefs.value.onlyTools
658
711
  if (onlyTools == null) return group.tools.length
659
712
  return group.tools.filter(t => onlyTools.includes(t.function.name)).length
660
713
  }
661
714
 
662
715
  return {
663
- availableTools,
716
+ prefs,
664
717
  toolGroups,
665
- isToolActive,
666
- toggleTool,
667
718
  toggleCollapse,
668
719
  isCollapsed,
669
720
  setGroupTools,
@@ -672,26 +723,6 @@ const ToolSelector = {
672
723
  }
673
724
  }
674
725
 
675
- function useTools(ctx) {
676
- const toolPageHeaders = {}
677
-
678
- function setToolPageHeaders(components) {
679
- Object.assign(toolPageHeaders, components)
680
- }
681
-
682
- function selectTool({ group, tool }) {
683
- ext.setPrefs({ selectedGroup: group, selectedTool: tool })
684
- }
685
-
686
- return {
687
- toolPageHeaders,
688
- setToolPageHeaders,
689
- selectTool,
690
- get selectedGroup() { return ext.prefs.selectedGroup },
691
- get selectedTool() { return ext.prefs.selectedTool },
692
- }
693
- }
694
-
695
726
  export default {
696
727
  order: 10 - 100,
697
728
 
@@ -57,7 +57,7 @@ try:
57
57
  except ImportError:
58
58
  HAS_PIL = False
59
59
 
60
- VERSION = "3.0.17"
60
+ VERSION = "3.0.19"
61
61
  _ROOT = None
62
62
  DEBUG = os.getenv("DEBUG") == "1"
63
63
  MOCK = os.getenv("MOCK") == "1"
@@ -1305,7 +1305,7 @@ class GroqProvider(OpenAiCompatible):
1305
1305
  super().__init__(**kwargs)
1306
1306
 
1307
1307
  async def process_chat(self, chat, provider_id=None):
1308
- ret = await process_chat(chat, provider_id)
1308
+ ret = await super().process_chat(chat, provider_id)
1309
1309
  chat.pop("modalities", None) # groq doesn't support modalities
1310
1310
  messages = chat.get("messages", []).copy()
1311
1311
  for message in messages:
@@ -6,7 +6,7 @@ const headers = { 'Accept': 'application/json' }
6
6
  const prefsKey = 'llms.prefs'
7
7
 
8
8
  export const o = {
9
- version: '3.0.17',
9
+ version: '3.0.19',
10
10
  base,
11
11
  prefsKey,
12
12
  welcome: 'Welcome to llms.py',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.17
3
+ Version: 3.0.19
4
4
  Summary: A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers
5
5
  Home-page: https://github.com/ServiceStack/llms
6
6
  Author: ServiceStack
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "llms-py"
7
- version = "3.0.17"
7
+ version = "3.0.19"
8
8
  description = "A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers"
9
9
  readme = "README.md"
10
10
  license = "BSD-3-Clause"
@@ -15,7 +15,7 @@ with open(os.path.join(this_directory, "requirements.txt"), encoding="utf-8") as
15
15
 
16
16
  setup(
17
17
  name="llms-py",
18
- version="3.0.17",
18
+ version="3.0.19",
19
19
  author="ServiceStack",
20
20
  author_email="team@servicestack.net",
21
21
  description="A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes