llms-py 3.0.9__tar.gz → 3.0.10__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 (194) hide show
  1. {llms_py-3.0.9 → llms_py-3.0.10}/PKG-INFO +1 -1
  2. {llms_py-3.0.9 → llms_py-3.0.10}/llms/main.py +1 -1
  3. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/ai.mjs +1 -1
  4. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/modules/chat/ChatBody.mjs +82 -71
  5. {llms_py-3.0.9 → llms_py-3.0.10}/llms_py.egg-info/PKG-INFO +1 -1
  6. {llms_py-3.0.9 → llms_py-3.0.10}/pyproject.toml +1 -1
  7. {llms_py-3.0.9 → llms_py-3.0.10}/setup.py +1 -1
  8. {llms_py-3.0.9 → llms_py-3.0.10}/LICENSE +0 -0
  9. {llms_py-3.0.9 → llms_py-3.0.10}/MANIFEST.in +0 -0
  10. {llms_py-3.0.9 → llms_py-3.0.10}/README.md +0 -0
  11. {llms_py-3.0.9 → llms_py-3.0.10}/llms/__init__.py +0 -0
  12. {llms_py-3.0.9 → llms_py-3.0.10}/llms/__main__.py +0 -0
  13. {llms_py-3.0.9 → llms_py-3.0.10}/llms/db.py +0 -0
  14. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/analytics/ui/index.mjs +0 -0
  15. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/app/README.md +0 -0
  16. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/app/__init__.py +0 -0
  17. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/app/db.py +0 -0
  18. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/app/ui/Recents.mjs +0 -0
  19. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/app/ui/index.mjs +0 -0
  20. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/app/ui/threadStore.mjs +0 -0
  21. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/CALCULATOR.md +0 -0
  22. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/__init__.py +0 -0
  23. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +0 -0
  24. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +0 -0
  25. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +0 -0
  26. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +0 -0
  27. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +0 -0
  28. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +0 -0
  29. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +0 -0
  30. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +0 -0
  31. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +0 -0
  32. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/codemirror.css +0 -0
  33. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/codemirror.js +0 -0
  34. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/doc/docs.css +0 -0
  35. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  36. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +0 -0
  37. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +0 -0
  38. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +0 -0
  39. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +0 -0
  40. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/mode/python/python.js +0 -0
  41. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/theme/dracula.css +0 -0
  42. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/codemirror/theme/mocha.css +0 -0
  43. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/core_tools/ui/index.mjs +0 -0
  44. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/gallery/README.md +0 -0
  45. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/gallery/__init__.py +0 -0
  46. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/gallery/db.py +0 -0
  47. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/gallery/ui/index.mjs +0 -0
  48. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/README.md +0 -0
  49. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/__init__.py +0 -0
  50. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/README.md +0 -0
  51. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/auto-render.js +0 -0
  52. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/auto-render.min.js +0 -0
  53. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/auto-render.mjs +0 -0
  54. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/copy-tex.js +0 -0
  55. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/copy-tex.min.js +0 -0
  56. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/copy-tex.mjs +0 -0
  57. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/mathtex-script-type.js +0 -0
  58. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +0 -0
  59. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +0 -0
  60. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/mhchem.js +0 -0
  61. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/mhchem.min.js +0 -0
  62. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/mhchem.mjs +0 -0
  63. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/render-a11y-string.js +0 -0
  64. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/render-a11y-string.min.js +0 -0
  65. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/contrib/render-a11y-string.mjs +0 -0
  66. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  67. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  68. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  69. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  70. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  71. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  72. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  73. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  74. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  75. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  76. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  77. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  78. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  79. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  80. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  81. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  82. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  83. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  84. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  85. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  86. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  87. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  88. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  89. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  90. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  91. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  92. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  93. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  94. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  95. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  96. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  97. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  98. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  99. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  100. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  101. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  102. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  103. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  104. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  105. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  106. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  107. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  108. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  109. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  110. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  111. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  112. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  113. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  114. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  115. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  116. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  117. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  118. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  119. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  120. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  121. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  122. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  123. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  124. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  125. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  126. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/index.mjs +0 -0
  127. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/katex-swap.css +0 -0
  128. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/katex-swap.min.css +0 -0
  129. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/katex.css +0 -0
  130. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/katex.js +0 -0
  131. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/katex.min.css +0 -0
  132. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/katex.min.js +0 -0
  133. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/katex.min.mjs +0 -0
  134. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/katex/ui/katex.mjs +0 -0
  135. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/providers/__init__.py +0 -0
  136. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/providers/anthropic.py +0 -0
  137. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/providers/cerebras.py +0 -0
  138. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/providers/chutes.py +0 -0
  139. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/providers/google.py +0 -0
  140. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/providers/nvidia.py +0 -0
  141. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/providers/openai.py +0 -0
  142. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/providers/openrouter.py +0 -0
  143. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/providers/zai.py +0 -0
  144. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/system_prompts/README.md +0 -0
  145. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/system_prompts/__init__.py +0 -0
  146. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/system_prompts/ui/index.mjs +0 -0
  147. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/system_prompts/ui/prompts.json +0 -0
  148. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/tools/__init__.py +0 -0
  149. {llms_py-3.0.9 → llms_py-3.0.10}/llms/extensions/tools/ui/index.mjs +0 -0
  150. {llms_py-3.0.9 → llms_py-3.0.10}/llms/index.html +0 -0
  151. {llms_py-3.0.9 → llms_py-3.0.10}/llms/llms.json +0 -0
  152. {llms_py-3.0.9 → llms_py-3.0.10}/llms/providers-extra.json +0 -0
  153. {llms_py-3.0.9 → llms_py-3.0.10}/llms/providers.json +0 -0
  154. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/App.mjs +0 -0
  155. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/app.css +0 -0
  156. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/ctx.mjs +0 -0
  157. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/fav.svg +0 -0
  158. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/index.mjs +0 -0
  159. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/chart.js +0 -0
  160. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/charts.mjs +0 -0
  161. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/color.js +0 -0
  162. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/highlight.min.mjs +0 -0
  163. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/idb.min.mjs +0 -0
  164. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/marked.min.mjs +0 -0
  165. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/servicestack-client.mjs +0 -0
  166. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/servicestack-vue.mjs +0 -0
  167. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/vue-router.min.mjs +0 -0
  168. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/vue.min.mjs +0 -0
  169. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/lib/vue.mjs +0 -0
  170. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/markdown.mjs +0 -0
  171. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/modules/chat/SettingsDialog.mjs +0 -0
  172. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/modules/chat/index.mjs +0 -0
  173. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/modules/icons.mjs +0 -0
  174. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/modules/layout.mjs +0 -0
  175. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/modules/model-selector.mjs +0 -0
  176. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/tailwind.input.css +0 -0
  177. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/typography.css +0 -0
  178. {llms_py-3.0.9 → llms_py-3.0.10}/llms/ui/utils.mjs +0 -0
  179. {llms_py-3.0.9 → llms_py-3.0.10}/llms_py.egg-info/SOURCES.txt +0 -0
  180. {llms_py-3.0.9 → llms_py-3.0.10}/llms_py.egg-info/dependency_links.txt +0 -0
  181. {llms_py-3.0.9 → llms_py-3.0.10}/llms_py.egg-info/entry_points.txt +0 -0
  182. {llms_py-3.0.9 → llms_py-3.0.10}/llms_py.egg-info/not-zip-safe +0 -0
  183. {llms_py-3.0.9 → llms_py-3.0.10}/llms_py.egg-info/requires.txt +0 -0
  184. {llms_py-3.0.9 → llms_py-3.0.10}/llms_py.egg-info/top_level.txt +0 -0
  185. {llms_py-3.0.9 → llms_py-3.0.10}/requirements.txt +0 -0
  186. {llms_py-3.0.9 → llms_py-3.0.10}/setup.cfg +0 -0
  187. {llms_py-3.0.9 → llms_py-3.0.10}/tests/test_async.py +0 -0
  188. {llms_py-3.0.9 → llms_py-3.0.10}/tests/test_config.py +0 -0
  189. {llms_py-3.0.9 → llms_py-3.0.10}/tests/test_extensions.py +0 -0
  190. {llms_py-3.0.9 → llms_py-3.0.10}/tests/test_gemini_upload.py +0 -0
  191. {llms_py-3.0.9 → llms_py-3.0.10}/tests/test_integration.py +0 -0
  192. {llms_py-3.0.9 → llms_py-3.0.10}/tests/test_provider_checks.py +0 -0
  193. {llms_py-3.0.9 → llms_py-3.0.10}/tests/test_provider_config.py +0 -0
  194. {llms_py-3.0.9 → llms_py-3.0.10}/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.9
3
+ Version: 3.0.10
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
@@ -41,7 +41,7 @@ try:
41
41
  except ImportError:
42
42
  HAS_PIL = False
43
43
 
44
- VERSION = "3.0.9"
44
+ VERSION = "3.0.10"
45
45
  _ROOT = None
46
46
  DEBUG = os.getenv("DEBUG") == "1"
47
47
  MOCK = os.getenv("MOCK") == "1"
@@ -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.9',
9
+ version: '3.0.10',
10
10
  base,
11
11
  prefsKey,
12
12
  welcome: 'Welcome to llms.py',
@@ -12,6 +12,47 @@ function hasJsonStructure(str) {
12
12
  return tryParseJson(str) != null
13
13
  }
14
14
 
15
+ function isEmpty(v) {
16
+ return !v || v === '{}' || v === '[]' || v === 'null' || v === 'undefined' || v === '""' || v === "''" || v === "``"
17
+ }
18
+ function embedHtml(html) {
19
+ const resizeScript = `<script>
20
+ let lastH = 0;
21
+ const sendHeight = () => {
22
+ const body = document.body;
23
+ if (!body) return;
24
+ // Force re-calc
25
+ const h = document.documentElement.getBoundingClientRect().height;
26
+ if (Math.abs(h - lastH) > 2) {
27
+ lastH = h;
28
+ window.parent.postMessage({ type: 'iframe-resize', height: h }, '*');
29
+ }
30
+ }
31
+ const ro = new ResizeObserver(sendHeight);
32
+ window.addEventListener('load', () => {
33
+ // Inject styles to prevent infinite loops
34
+ const style = document.createElement('style');
35
+ style.textContent = 'html, body { height: auto !important; min-height: 0 !important; margin: 0 !important; padding: 0 !important; overflow: hidden !important; }';
36
+ document.head.appendChild(style);
37
+
38
+ const body = document.body;
39
+ if (body) {
40
+ ro.observe(body);
41
+ ro.observe(document.documentElement);
42
+ sendHeight();
43
+ }
44
+ });
45
+ <\/script>`
46
+
47
+ const escaped = (html + resizeScript)
48
+ .replace(/&/g, '&amp;')
49
+ .replace(/</g, '&lt;')
50
+ .replace(/>/g, '&gt;')
51
+ .replace(/"/g, '&quot;')
52
+ .replace(/'/g, '&#39;')
53
+ return `<iframe srcdoc="${escaped}" sandbox="allow-scripts" style="width:100%;height:auto;border:none;"></iframe>`
54
+ }
55
+
15
56
  export const TypeText = {
16
57
  template: `
17
58
  <div v-if="text.type === 'text'">
@@ -332,46 +373,6 @@ export const ToolArguments = {
332
373
  },
333
374
  setup(props) {
334
375
  const refArgs = ref()
335
- function isEmpty(v) {
336
- return !v || v === '{}' || v === '[]' || v === 'null' || v === 'undefined' || v === '""' || v === "''" || v === "``"
337
- }
338
- function embedHtml(html) {
339
- const resizeScript = `<script>
340
- let lastH = 0;
341
- const sendHeight = () => {
342
- const body = document.body;
343
- if (!body) return;
344
- // Force re-calc
345
- const h = document.documentElement.getBoundingClientRect().height;
346
- if (Math.abs(h - lastH) > 2) {
347
- lastH = h;
348
- window.parent.postMessage({ type: 'iframe-resize', height: h }, '*');
349
- }
350
- }
351
- const ro = new ResizeObserver(sendHeight);
352
- window.addEventListener('load', () => {
353
- // Inject styles to prevent infinite loops
354
- const style = document.createElement('style');
355
- style.textContent = 'html, body { height: auto !important; min-height: 0 !important; margin: 0 !important; padding: 0 !important; overflow: hidden !important; }';
356
- document.head.appendChild(style);
357
-
358
- const body = document.body;
359
- if (body) {
360
- ro.observe(body);
361
- ro.observe(document.documentElement);
362
- sendHeight();
363
- }
364
- });
365
- <\/script>`
366
-
367
- const escaped = (html + resizeScript)
368
- .replace(/&/g, '&amp;')
369
- .replace(/</g, '&lt;')
370
- .replace(/>/g, '&gt;')
371
- .replace(/"/g, '&quot;')
372
- .replace(/'/g, '&#39;')
373
- return `<iframe srcdoc="${escaped}" sandbox="allow-scripts" style="width:100%;height:auto;border:none;"></iframe>`
374
- }
375
376
  const dict = computed(() => {
376
377
  if (isEmpty(props.value)) return null
377
378
  const ret = tryParseJson(props.value)
@@ -417,9 +418,47 @@ export const ToolArguments = {
417
418
  }
418
419
 
419
420
  export const ToolOutput = {
420
- template: ``,
421
+ template: `
422
+ <div v-if="output" class="border-t border-gray-200 dark:border-gray-700">
423
+ <div class="px-3 py-1.5 flex justify-between items-center border-b border-gray-200 dark:border-gray-800 bg-gray-50/30 dark:bg-gray-800">
424
+ <div class="flex items-center gap-2 ">
425
+ <svg class="size-3.5 text-gray-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
426
+ <span class="text-[10px] uppercase tracking-wider text-gray-400 font-medium">Output</span>
427
+ </div>
428
+ <div v-if="hasJsonStructure(output.content)" class="flex items-center gap-2 text-[10px] uppercase tracking-wider font-medium select-none">
429
+ <span @click="$ctx.setPrefs({ toolFormat: 'text' })"
430
+ class="cursor-pointer transition-colors"
431
+ :class="$ctx.prefs.toolFormat !== 'preview' ? 'text-gray-600 dark:text-gray-300' : 'text-gray-400 hover:text-gray-600 dark:hover:text-gray-300'">
432
+ text
433
+ </span>
434
+ <span class="text-gray-300 dark:text-gray-700">|</span>
435
+ <span @click="$ctx.setPrefs({ toolFormat: 'preview' })"
436
+ class="cursor-pointer transition-colors"
437
+ :class="$ctx.prefs.toolFormat == 'preview' ? 'text-gray-600 dark:text-gray-300' : 'text-gray-400 hover:text-gray-600 dark:hover:text-gray-300'">
438
+ preview
439
+ </span>
440
+ </div>
441
+ </div>
442
+ <div class="not-prose px-3 py-2">
443
+ <pre v-if="$ctx.prefs.toolFormat !== 'preview' || !hasJsonStructure(output.content)" class="tool-output">{{ output.content }}</pre>
444
+ <div v-else class="text-xs">
445
+ <HtmlFormat v-if="tryParseJson(output.content)" :value="tryParseJson(output.content)" :classes="$utils.htmlFormatClasses" />
446
+ <div v-else class="text-gray-500 italic p-2">Invalid JSON content</div>
447
+ </div>
448
+ </div>
449
+ <ViewToolTypes :output="output" class="p-2" />
450
+ </div>
451
+ `,
452
+ props: {
453
+ tool: Object,
454
+ output: Object,
455
+ },
421
456
  setup(props) {
422
457
 
458
+ return {
459
+ tryParseJson,
460
+ hasJsonStructure,
461
+ }
423
462
  }
424
463
  }
425
464
 
@@ -523,36 +562,8 @@ export const ChatBody = {
523
562
 
524
563
  <ToolArguments :value="tool.function.arguments" />
525
564
 
526
- <!-- Tool Output (Nested) -->
527
- <div v-if="getToolOutput(tool.id)" class="border-t border-gray-200 dark:border-gray-700">
528
- <div class="px-3 py-1.5 flex justify-between items-center border-b border-gray-200 dark:border-gray-800 bg-gray-50/30 dark:bg-gray-800">
529
- <div class="flex items-center gap-2 ">
530
- <svg class="size-3.5 text-gray-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
531
- <span class="text-[10px] uppercase tracking-wider text-gray-400 font-medium">Output</span>
532
- </div>
533
- <div v-if="hasJsonStructure(getToolOutput(tool.id).content)" class="flex items-center gap-2 text-[10px] uppercase tracking-wider font-medium select-none">
534
- <span @click="setPrefs({ toolFormat: 'text' })"
535
- class="cursor-pointer transition-colors"
536
- :class="prefs.toolFormat !== 'preview' ? 'text-gray-600 dark:text-gray-300' : 'text-gray-400 hover:text-gray-600 dark:hover:text-gray-300'">
537
- text
538
- </span>
539
- <span class="text-gray-300 dark:text-gray-700">|</span>
540
- <span @click="setPrefs({ toolFormat: 'preview' })"
541
- class="cursor-pointer transition-colors"
542
- :class="prefs.toolFormat == 'preview' ? 'text-gray-600 dark:text-gray-300' : 'text-gray-400 hover:text-gray-600 dark:hover:text-gray-300'">
543
- preview
544
- </span>
545
- </div>
546
- </div>
547
- <div class="not-prose px-3 py-2">
548
- <pre v-if="prefs.toolFormat !== 'preview' || !hasJsonStructure(getToolOutput(tool.id).content)" class="tool-output">{{ getToolOutput(tool.id).content }}</pre>
549
- <div v-else class="text-xs">
550
- <HtmlFormat v-if="tryParseJson(getToolOutput(tool.id).content)" :value="tryParseJson(getToolOutput(tool.id).content)" :classes="$utils.htmlFormatClasses" />
551
- <div v-else class="text-gray-500 italic p-2">Invalid JSON content</div>
552
- </div>
553
- </div>
554
- <ViewToolTypes :output="getToolOutput(tool.id)" />
555
- </div>
565
+ <ToolOutput :tool="tool" :output="getToolOutput(tool.id)" />
566
+
556
567
  </div>
557
568
  </div>
558
569
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.9
3
+ Version: 3.0.10
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.9"
7
+ version = "3.0.10"
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.9",
18
+ version="3.0.10",
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes