llms-py 3.0.2__tar.gz → 3.0.3__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 (192) hide show
  1. {llms_py-3.0.2/llms_py.egg-info → llms_py-3.0.3}/PKG-INFO +1 -1
  2. {llms_py-3.0.2 → llms_py-3.0.3}/llms/db.py +18 -9
  3. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/app/__init__.py +1 -0
  4. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/app/ui/threadStore.mjs +3 -0
  5. {llms_py-3.0.2 → llms_py-3.0.3}/llms/main.py +3 -1
  6. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/ai.mjs +1 -1
  7. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/app.css +33 -23
  8. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/ctx.mjs +13 -0
  9. llms_py-3.0.3/llms/ui/modules/chat/ChatBody.mjs +688 -0
  10. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/modules/chat/index.mjs +80 -7
  11. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/tailwind.input.css +1 -1
  12. {llms_py-3.0.2 → llms_py-3.0.3/llms_py.egg-info}/PKG-INFO +1 -1
  13. {llms_py-3.0.2 → llms_py-3.0.3}/pyproject.toml +1 -1
  14. {llms_py-3.0.2 → llms_py-3.0.3}/setup.py +1 -1
  15. llms_py-3.0.2/llms/ui/modules/chat/ChatBody.mjs +0 -692
  16. {llms_py-3.0.2 → llms_py-3.0.3}/LICENSE +0 -0
  17. {llms_py-3.0.2 → llms_py-3.0.3}/MANIFEST.in +0 -0
  18. {llms_py-3.0.2 → llms_py-3.0.3}/README.md +0 -0
  19. {llms_py-3.0.2 → llms_py-3.0.3}/llms/__init__.py +0 -0
  20. {llms_py-3.0.2 → llms_py-3.0.3}/llms/__main__.py +0 -0
  21. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/analytics/ui/index.mjs +0 -0
  22. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/app/README.md +0 -0
  23. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/app/db.py +0 -0
  24. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/app/ui/Recents.mjs +0 -0
  25. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/app/ui/index.mjs +0 -0
  26. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/CALCULATOR.md +0 -0
  27. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/__init__.py +0 -0
  28. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +0 -0
  29. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +0 -0
  30. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +0 -0
  31. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +0 -0
  32. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +0 -0
  33. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +0 -0
  34. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +0 -0
  35. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +0 -0
  36. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +0 -0
  37. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/doc/docs.css +0 -0
  38. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  39. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +0 -0
  40. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +0 -0
  41. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +0 -0
  42. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +0 -0
  43. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/mode/python/python.js +0 -0
  44. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/theme/dracula.css +0 -0
  45. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/codemirror/theme/mocha.css +0 -0
  46. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/core_tools/ui/index.mjs +0 -0
  47. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/gallery/README.md +0 -0
  48. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/gallery/__init__.py +0 -0
  49. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/gallery/db.py +0 -0
  50. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/gallery/ui/index.mjs +0 -0
  51. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/README.md +0 -0
  52. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/__init__.py +0 -0
  53. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/README.md +0 -0
  54. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/auto-render.js +0 -0
  55. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/auto-render.min.js +0 -0
  56. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/auto-render.mjs +0 -0
  57. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/copy-tex.js +0 -0
  58. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/copy-tex.min.js +0 -0
  59. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/copy-tex.mjs +0 -0
  60. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/mathtex-script-type.js +0 -0
  61. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +0 -0
  62. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +0 -0
  63. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/mhchem.js +0 -0
  64. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/mhchem.min.js +0 -0
  65. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/mhchem.mjs +0 -0
  66. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/render-a11y-string.js +0 -0
  67. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/render-a11y-string.min.js +0 -0
  68. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/contrib/render-a11y-string.mjs +0 -0
  69. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  70. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  71. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  72. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  73. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  74. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  75. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  76. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  77. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  78. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  79. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  80. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  81. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  82. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  83. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  84. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  85. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  86. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  87. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  88. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  89. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  90. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  91. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  92. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  93. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  94. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  95. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  96. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  97. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  98. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  99. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  100. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  101. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  102. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  103. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  104. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  105. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  106. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  107. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  108. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  109. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  110. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  111. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  112. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  113. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  114. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  115. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  116. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  117. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  118. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  119. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  120. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  121. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  122. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  123. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  124. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  125. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  126. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  127. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  128. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  129. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/index.mjs +0 -0
  130. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/katex-swap.css +0 -0
  131. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/katex-swap.min.css +0 -0
  132. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/katex.css +0 -0
  133. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/katex.js +0 -0
  134. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/katex.min.css +0 -0
  135. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/katex.min.js +0 -0
  136. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/katex.min.mjs +0 -0
  137. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/katex/ui/katex.mjs +0 -0
  138. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/providers/__init__.py +0 -0
  139. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/providers/anthropic.py +0 -0
  140. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/providers/cerebras.py +0 -0
  141. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/providers/chutes.py +0 -0
  142. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/providers/google.py +0 -0
  143. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/providers/nvidia.py +0 -0
  144. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/providers/openai.py +0 -0
  145. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/providers/openrouter.py +0 -0
  146. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/system_prompts/README.md +0 -0
  147. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/system_prompts/__init__.py +0 -0
  148. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/system_prompts/ui/index.mjs +0 -0
  149. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/system_prompts/ui/prompts.json +0 -0
  150. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/tools/__init__.py +0 -0
  151. {llms_py-3.0.2 → llms_py-3.0.3}/llms/extensions/tools/ui/index.mjs +0 -0
  152. {llms_py-3.0.2 → llms_py-3.0.3}/llms/index.html +0 -0
  153. {llms_py-3.0.2 → llms_py-3.0.3}/llms/llms.json +0 -0
  154. {llms_py-3.0.2 → llms_py-3.0.3}/llms/providers-extra.json +0 -0
  155. {llms_py-3.0.2 → llms_py-3.0.3}/llms/providers.json +0 -0
  156. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/App.mjs +0 -0
  157. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/fav.svg +0 -0
  158. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/index.mjs +0 -0
  159. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/chart.js +0 -0
  160. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/charts.mjs +0 -0
  161. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/color.js +0 -0
  162. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/highlight.min.mjs +0 -0
  163. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/idb.min.mjs +0 -0
  164. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/marked.min.mjs +0 -0
  165. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/servicestack-client.mjs +0 -0
  166. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/servicestack-vue.mjs +0 -0
  167. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/vue-router.min.mjs +0 -0
  168. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/vue.min.mjs +0 -0
  169. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/lib/vue.mjs +0 -0
  170. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/markdown.mjs +0 -0
  171. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/modules/chat/SettingsDialog.mjs +0 -0
  172. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/modules/icons.mjs +0 -0
  173. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/modules/layout.mjs +0 -0
  174. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/modules/model-selector.mjs +0 -0
  175. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/typography.css +0 -0
  176. {llms_py-3.0.2 → llms_py-3.0.3}/llms/ui/utils.mjs +0 -0
  177. {llms_py-3.0.2 → llms_py-3.0.3}/llms_py.egg-info/SOURCES.txt +0 -0
  178. {llms_py-3.0.2 → llms_py-3.0.3}/llms_py.egg-info/dependency_links.txt +0 -0
  179. {llms_py-3.0.2 → llms_py-3.0.3}/llms_py.egg-info/entry_points.txt +0 -0
  180. {llms_py-3.0.2 → llms_py-3.0.3}/llms_py.egg-info/not-zip-safe +0 -0
  181. {llms_py-3.0.2 → llms_py-3.0.3}/llms_py.egg-info/requires.txt +0 -0
  182. {llms_py-3.0.2 → llms_py-3.0.3}/llms_py.egg-info/top_level.txt +0 -0
  183. {llms_py-3.0.2 → llms_py-3.0.3}/requirements.txt +0 -0
  184. {llms_py-3.0.2 → llms_py-3.0.3}/setup.cfg +0 -0
  185. {llms_py-3.0.2 → llms_py-3.0.3}/tests/test_async.py +0 -0
  186. {llms_py-3.0.2 → llms_py-3.0.3}/tests/test_config.py +0 -0
  187. {llms_py-3.0.2 → llms_py-3.0.3}/tests/test_extensions.py +0 -0
  188. {llms_py-3.0.2 → llms_py-3.0.3}/tests/test_gemini_upload.py +0 -0
  189. {llms_py-3.0.2 → llms_py-3.0.3}/tests/test_integration.py +0 -0
  190. {llms_py-3.0.2 → llms_py-3.0.3}/tests/test_provider_checks.py +0 -0
  191. {llms_py-3.0.2 → llms_py-3.0.3}/tests/test_provider_config.py +0 -0
  192. {llms_py-3.0.2 → llms_py-3.0.3}/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.2
3
+ Version: 3.0.3
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
@@ -1,10 +1,11 @@
1
1
  import json
2
+ import os
2
3
  import sqlite3
3
4
  import threading
4
5
  from queue import Empty, Queue
5
6
  from threading import Event, Thread
6
7
 
7
- POOL = True
8
+ POOL = os.getenv("LLMS_POOL", "1") == "1"
8
9
 
9
10
 
10
11
  def create_reader_connection(db_path):
@@ -39,7 +40,7 @@ def writer_thread(ctx, db_path, task_queue, stop_event):
39
40
  sql, args, callback = task # Optional callback for results
40
41
 
41
42
  try:
42
- ctx.dbg("SQL>" + ("\n" if "\n" in sql else " ") + sql + ("\n" if args else "") + str(args))
43
+ ctx.dbg("SQL>" + ("\n" if "\n" in sql else " ") + sql + ("\n" if args else " ") + str(args))
43
44
  cursor = conn.execute(sql, args)
44
45
  conn.commit()
45
46
  ctx.dbg(f"lastrowid {cursor.lastrowid}, rowcount {cursor.rowcount}")
@@ -172,7 +173,9 @@ class DbManager:
172
173
 
173
174
  def log_sql(self, sql, parameters=None):
174
175
  if self.ctx.debug:
175
- self.ctx.dbg("SQL>" + ("\n" if "\n" in sql else " ") + sql + ("\n" if parameters else "") + str(parameters))
176
+ self.ctx.dbg(
177
+ "SQL>" + ("\n" if "\n" in sql else " ") + sql + ("\n" if parameters else " ") + str(parameters)
178
+ )
176
179
 
177
180
  def exec(self, connection, sql, parameters=None):
178
181
  self.log_sql(sql, parameters)
@@ -289,17 +292,20 @@ class DbManager:
289
292
  async def insert_async(self, table, columns, info):
290
293
  event = threading.Event()
291
294
 
292
- ret = [None]
295
+ ret = [None, None]
293
296
 
294
297
  def cb(lastrowid, rowcount, error=None):
295
298
  nonlocal ret
296
299
  if error:
297
- raise error
298
- ret[0] = lastrowid
300
+ ret[1] = error
301
+ else:
302
+ ret[0] = lastrowid
299
303
  event.set()
300
304
 
301
305
  self.insert(table, columns, info, cb)
302
306
  event.wait()
307
+ if ret[1]:
308
+ raise ret[1]
303
309
  return ret[0]
304
310
 
305
311
  def update(self, table, columns, info, callback=None):
@@ -323,17 +329,20 @@ class DbManager:
323
329
  async def update_async(self, table, columns, info):
324
330
  event = threading.Event()
325
331
 
326
- ret = [None]
332
+ ret = [None, None]
327
333
 
328
334
  def cb(lastrowid, rowcount, error=None):
329
335
  nonlocal ret
330
336
  if error:
331
- raise error
332
- ret[0] = rowcount
337
+ ret[1] = error
338
+ else:
339
+ ret[0] = rowcount
333
340
  event.set()
334
341
 
335
342
  self.update(table, columns, info, cb)
336
343
  event.wait()
344
+ if ret[1]:
345
+ raise ret[1]
337
346
  return ret[0]
338
347
 
339
348
  def close(self):
@@ -38,6 +38,7 @@ def install(ctx):
38
38
  "modelInfo",
39
39
  "modalities",
40
40
  "messages",
41
+ "tools",
41
42
  "args",
42
43
  "cost",
43
44
  "inputTokens",
@@ -116,6 +116,9 @@ function replaceThread(thread) {
116
116
  if (currentThread.value?.id === thread.id) {
117
117
  currentThread.value = thread
118
118
  }
119
+ if (thread.completedAt || thread.error) {
120
+ threadDetails.value[thread.id] = thread
121
+ }
119
122
  startWatchingThread()
120
123
  return thread
121
124
  }
@@ -41,7 +41,7 @@ try:
41
41
  except ImportError:
42
42
  HAS_PIL = False
43
43
 
44
- VERSION = "3.0.2"
44
+ VERSION = "3.0.3"
45
45
  _ROOT = None
46
46
  DEBUG = os.getenv("DEBUG") == "1"
47
47
  MOCK = os.getenv("MOCK") == "1"
@@ -1288,6 +1288,8 @@ def to_error_message(e):
1288
1288
  # check if has 'message' attribute
1289
1289
  if hasattr(e, "message"):
1290
1290
  return e.message
1291
+ if hasattr(e, "status"):
1292
+ return str(e.status)
1291
1293
  return str(e)
1292
1294
 
1293
1295
 
@@ -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.2',
9
+ version: '3.0.3',
10
10
  base,
11
11
  prefsKey,
12
12
  welcome: 'Welcome to llms.py',
@@ -18,6 +18,12 @@
18
18
  --color-red-700: oklch(50.5% 0.213 27.518);
19
19
  --color-red-800: oklch(44.4% 0.177 26.899);
20
20
  --color-red-900: oklch(39.6% 0.141 25.723);
21
+ --color-orange-100: oklch(95.4% 0.038 75.164);
22
+ --color-orange-200: oklch(90.1% 0.076 70.697);
23
+ --color-orange-400: oklch(75% 0.183 55.934);
24
+ --color-orange-600: oklch(64.6% 0.222 41.116);
25
+ --color-orange-800: oklch(47% 0.157 37.304);
26
+ --color-orange-900: oklch(40.8% 0.123 38.172);
21
27
  --color-yellow-50: oklch(98.7% 0.026 102.212);
22
28
  --color-yellow-100: oklch(97.3% 0.071 103.193);
23
29
  --color-yellow-200: oklch(94.5% 0.129 101.54);
@@ -1103,6 +1109,9 @@
1103
1109
  .cursor-default {
1104
1110
  cursor: default;
1105
1111
  }
1112
+ .cursor-help {
1113
+ cursor: help;
1114
+ }
1106
1115
  .cursor-not-allowed {
1107
1116
  cursor: not-allowed;
1108
1117
  }
@@ -1668,6 +1677,9 @@
1668
1677
  .bg-indigo-700 {
1669
1678
  background-color: var(--color-indigo-700);
1670
1679
  }
1680
+ .bg-orange-100 {
1681
+ background-color: var(--color-orange-100);
1682
+ }
1671
1683
  .bg-purple-100 {
1672
1684
  background-color: var(--color-purple-100);
1673
1685
  }
@@ -1743,9 +1755,6 @@
1743
1755
  .bg-yellow-50 {
1744
1756
  background-color: var(--color-yellow-50);
1745
1757
  }
1746
- .bg-yellow-100 {
1747
- background-color: var(--color-yellow-100);
1748
- }
1749
1758
  .bg-yellow-400 {
1750
1759
  background-color: var(--color-yellow-400);
1751
1760
  }
@@ -2313,6 +2322,12 @@
2313
2322
  .text-indigo-700 {
2314
2323
  color: var(--color-indigo-700);
2315
2324
  }
2325
+ .text-orange-600 {
2326
+ color: var(--color-orange-600);
2327
+ }
2328
+ .text-orange-800 {
2329
+ color: var(--color-orange-800);
2330
+ }
2316
2331
  .text-purple-600 {
2317
2332
  color: var(--color-purple-600);
2318
2333
  }
@@ -2385,9 +2400,6 @@
2385
2400
  .text-yellow-700 {
2386
2401
  color: var(--color-yellow-700);
2387
2402
  }
2388
- .text-yellow-800 {
2389
- color: var(--color-yellow-800);
2390
- }
2391
2403
  .capitalize {
2392
2404
  text-transform: capitalize;
2393
2405
  }
@@ -4830,6 +4842,11 @@
4830
4842
  background-color: var(--color-indigo-900);
4831
4843
  }
4832
4844
  }
4845
+ .dark\:bg-orange-900 {
4846
+ &:where(.dark, .dark *) {
4847
+ background-color: var(--color-orange-900);
4848
+ }
4849
+ }
4833
4850
  .dark\:bg-purple-600 {
4834
4851
  &:where(.dark, .dark *) {
4835
4852
  background-color: var(--color-purple-600);
@@ -4920,23 +4937,11 @@
4920
4937
  background-color: var(--color-yellow-200);
4921
4938
  }
4922
4939
  }
4923
- .dark\:bg-yellow-900 {
4924
- &:where(.dark, .dark *) {
4925
- background-color: var(--color-yellow-900);
4926
- }
4927
- }
4928
4940
  .dark\:fill-gray-300 {
4929
4941
  &:where(.dark, .dark *) {
4930
4942
  fill: var(--color-gray-300);
4931
4943
  }
4932
4944
  }
4933
- .dark\:dark\:text-gray-200 {
4934
- &:where(.dark, .dark *) {
4935
- &:where(.dark, .dark *) {
4936
- color: var(--color-gray-200);
4937
- }
4938
- }
4939
- }
4940
4945
  .dark\:text-black {
4941
4946
  &:where(.dark, .dark *) {
4942
4947
  color: var(--color-black);
@@ -5073,6 +5078,16 @@
5073
5078
  color: var(--color-indigo-500);
5074
5079
  }
5075
5080
  }
5081
+ .dark\:text-orange-200 {
5082
+ &:where(.dark, .dark *) {
5083
+ color: var(--color-orange-200);
5084
+ }
5085
+ }
5086
+ .dark\:text-orange-400 {
5087
+ &:where(.dark, .dark *) {
5088
+ color: var(--color-orange-400);
5089
+ }
5090
+ }
5076
5091
  .dark\:text-purple-300 {
5077
5092
  &:where(.dark, .dark *) {
5078
5093
  color: var(--color-purple-300);
@@ -5118,11 +5133,6 @@
5118
5133
  color: var(--color-white);
5119
5134
  }
5120
5135
  }
5121
- .dark\:text-yellow-200 {
5122
- &:where(.dark, .dark *) {
5123
- color: var(--color-yellow-200);
5124
- }
5125
- }
5126
5136
  .dark\:placeholder-gray-400 {
5127
5137
  &:where(.dark, .dark *) {
5128
5138
  &::placeholder {
@@ -30,6 +30,7 @@ export class ExtensionScope {
30
30
  return this.ctx.ai.get(combinePaths(this.baseUrl, url), options)
31
31
  }
32
32
  delete(url, options) {
33
+ this.ctx.clearError()
33
34
  return this.ctx.ai.get(combinePaths(this.baseUrl, url), {
34
35
  ...options,
35
36
  method: 'DELETE'
@@ -39,41 +40,49 @@ export class ExtensionScope {
39
40
  return this.ctx.ai.getJson(combinePaths(this.baseUrl, url), options)
40
41
  }
41
42
  async deleteJson(url, options) {
43
+ this.ctx.clearError()
42
44
  return this.ctx.ai.getJson(combinePaths(this.baseUrl, url), {
43
45
  ...options,
44
46
  method: 'DELETE'
45
47
  })
46
48
  }
47
49
  post(url, options) {
50
+ this.ctx.clearError()
48
51
  return this.ctx.ai.post(combinePaths(this.baseUrl, url), options)
49
52
  }
50
53
  put(url, options) {
54
+ this.ctx.clearError()
51
55
  return this.ctx.ai.post(combinePaths(this.baseUrl, url), {
52
56
  ...options,
53
57
  method: 'PUT'
54
58
  })
55
59
  }
56
60
  patch(url, options) {
61
+ this.ctx.clearError()
57
62
  return this.ctx.ai.post(combinePaths(this.baseUrl, url), {
58
63
  ...options,
59
64
  method: 'PATCH'
60
65
  })
61
66
  }
62
67
  async postForm(url, options) {
68
+ this.ctx.clearError()
63
69
  return await this.ctx.ai.postForm(combinePaths(this.baseUrl, url), options)
64
70
  }
65
71
  async postJson(url, body) {
72
+ this.ctx.clearError()
66
73
  return this.ctx.ai.postJson(combinePaths(this.baseUrl, url), {
67
74
  body: body instanceof FormData ? body : JSON.stringify(body)
68
75
  })
69
76
  }
70
77
  async putJson(url, body) {
78
+ this.ctx.clearError()
71
79
  return this.ctx.ai.postJson(combinePaths(this.baseUrl, url), {
72
80
  method: 'PUT',
73
81
  body: body instanceof FormData ? body : JSON.stringify(body)
74
82
  })
75
83
  }
76
84
  async patchJson(url, body) {
85
+ this.ctx.clearError()
77
86
  return this.ctx.ai.postJson(combinePaths(this.baseUrl, url), {
78
87
  method: 'PATCH',
79
88
  body: body instanceof FormData ? body : JSON.stringify(body)
@@ -136,6 +145,7 @@ export class AppContext {
136
145
  this.chatErrorFilters = []
137
146
  this.createThreadFilters = []
138
147
  this.updateThreadFilters = []
148
+ this.threadHeaderComponents = {}
139
149
  this.threadFooterComponents = {}
140
150
  this.top = {}
141
151
  this.left = {}
@@ -297,6 +307,9 @@ export class AppContext {
297
307
  this.toggleLayout('left', toggle)
298
308
  return toggle
299
309
  }
310
+ setThreadHeaders(components) {
311
+ Object.assign(this.threadHeaderComponents, components)
312
+ }
300
313
  setThreadFooters(components) {
301
314
  Object.assign(this.threadFooterComponents, components)
302
315
  }