llms-py 3.0.19__tar.gz → 3.0.21__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.
- {llms_py-3.0.19/llms_py.egg-info → llms_py-3.0.21}/PKG-INFO +1 -1
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/app/__init__.py +4 -1
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/computer/filesystem.py +37 -6
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/providers/openrouter.py +1 -1
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/main.py +15 -6
- llms_py-3.0.21/llms/providers.json +1 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/ai.mjs +1 -1
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/app.css +0 -463
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/ctx.mjs +16 -3
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/index.mjs +2 -2
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/servicestack-vue.mjs +3 -3
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/markdown.mjs +2 -1
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/modules/chat/ChatBody.mjs +3 -1
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/utils.mjs +48 -1
- {llms_py-3.0.19 → llms_py-3.0.21/llms_py.egg-info}/PKG-INFO +1 -1
- {llms_py-3.0.19 → llms_py-3.0.21}/pyproject.toml +1 -1
- {llms_py-3.0.19 → llms_py-3.0.21}/setup.py +1 -1
- llms_py-3.0.19/llms/providers.json +0 -1
- {llms_py-3.0.19 → llms_py-3.0.21}/LICENSE +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/MANIFEST.in +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/README.md +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/__init__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/__main__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/db.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/analytics/ui/index.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/app/README.md +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/app/db.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/app/ui/Recents.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/app/ui/index.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/app/ui/threadStore.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/computer/README.md +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/computer/__init__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/computer/base.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/computer/bash.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/computer/computer.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/computer/edit.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/computer/platform.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/computer/run.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/CALCULATOR.md +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/__init__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/codemirror.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/codemirror.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/doc/docs.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/mode/python/python.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/theme/dracula.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/codemirror/theme/mocha.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/core_tools/ui/index.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/gallery/README.md +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/gallery/__init__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/gallery/db.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/gallery/ui/index.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/README.md +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/__init__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/README.md +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/auto-render.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/auto-render.min.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/auto-render.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/copy-tex.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/copy-tex.min.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/copy-tex.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/mathtex-script-type.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/mhchem.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/mhchem.min.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/mhchem.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/render-a11y-string.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/render-a11y-string.min.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/contrib/render-a11y-string.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/index.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/katex-swap.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/katex-swap.min.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/katex.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/katex.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/katex.min.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/katex.min.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/katex.min.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/katex/ui/katex.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/providers/__init__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/providers/anthropic.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/providers/cerebras.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/providers/chutes.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/providers/google.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/providers/nvidia.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/providers/openai.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/providers/zai.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/skills/LICENSE +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/skills/__init__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/skills/errors.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/skills/models.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/skills/parser.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/skills/ui/index.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/skills/ui/skills/create-plan/SKILL.md +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/skills/validator.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/system_prompts/README.md +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/system_prompts/__init__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/system_prompts/ui/index.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/system_prompts/ui/prompts.json +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/tools/__init__.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/extensions/tools/ui/index.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/index.html +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/llms.json +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/providers-extra.json +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/App.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/fav.svg +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/chart.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/charts.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/color.js +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/highlight.min.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/idb.min.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/marked.min.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/servicestack-client.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/vue-router.min.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/vue.min.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/lib/vue.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/modules/chat/SettingsDialog.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/modules/chat/index.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/modules/icons.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/modules/layout.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/modules/model-selector.mjs +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/tailwind.input.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms/ui/typography.css +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms_py.egg-info/SOURCES.txt +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms_py.egg-info/dependency_links.txt +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms_py.egg-info/entry_points.txt +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms_py.egg-info/not-zip-safe +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms_py.egg-info/requires.txt +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/llms_py.egg-info/top_level.txt +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/requirements.txt +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/setup.cfg +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_async.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_config.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_core_tools_direct.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_extensions.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_gemini_tool_calling.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_gemini_upload.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_integration.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_interleaved_thinking.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_provider_checks.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/tests/test_provider_config.py +0 -0
- {llms_py-3.0.19 → llms_py-3.0.21}/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.
|
|
3
|
+
Version: 3.0.21
|
|
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
|
|
@@ -223,7 +223,10 @@ def install(ctx):
|
|
|
223
223
|
await ctx.chat_completion(chat_req, context=context_req)
|
|
224
224
|
except Exception as ex:
|
|
225
225
|
ctx.err("run_chat", ex)
|
|
226
|
-
#
|
|
226
|
+
# shouldn't be necessary to update thread in db with error as it's done in chat_error filter
|
|
227
|
+
thread = thread_dto(g_db.get_thread(id, user=ctx.get_username(request)))
|
|
228
|
+
if thread and not thread.get("error"):
|
|
229
|
+
await chat_error(ex, context)
|
|
227
230
|
|
|
228
231
|
asyncio.create_task(run_chat(chat, context))
|
|
229
232
|
|
|
@@ -406,7 +406,7 @@ def directory_tree(
|
|
|
406
406
|
) -> str:
|
|
407
407
|
"""
|
|
408
408
|
Get a recursive tree view of files and directories as a JSON structure. Each entry includes 'name', 'type' (file/directory), and 'children' for directories.
|
|
409
|
-
Files have no children array, while directories always have a children array (which may be empty).
|
|
409
|
+
Files have no children array, while directories always have a children array (which may be empty). Respects any .gitignore rules from the root directory together with any exclude_patterns.
|
|
410
410
|
The output is formatted with 2-space indentation for readability. Only works within allowed directories.
|
|
411
411
|
"""
|
|
412
412
|
import json
|
|
@@ -416,6 +416,24 @@ def directory_tree(
|
|
|
416
416
|
if exclude_patterns is None:
|
|
417
417
|
exclude_patterns = []
|
|
418
418
|
|
|
419
|
+
def _parse_gitignore(directory: str) -> List[str]:
|
|
420
|
+
gitignore_path = os.path.join(directory, ".gitignore")
|
|
421
|
+
patterns = []
|
|
422
|
+
if os.path.exists(gitignore_path) and os.path.isfile(gitignore_path):
|
|
423
|
+
try:
|
|
424
|
+
with open(gitignore_path, encoding="utf-8") as f:
|
|
425
|
+
for line in f:
|
|
426
|
+
line = line.strip()
|
|
427
|
+
if line and not line.startswith("#"):
|
|
428
|
+
patterns.append(line)
|
|
429
|
+
except Exception as e:
|
|
430
|
+
logger.warning(f"Error reading .gitignore in {directory}: {e}")
|
|
431
|
+
return patterns
|
|
432
|
+
|
|
433
|
+
# Parse .gitignore only in the root directory (Simple Global Mappings)
|
|
434
|
+
gitignore_patterns = _parse_gitignore(valid_path)
|
|
435
|
+
all_exclude_patterns = exclude_patterns + gitignore_patterns
|
|
436
|
+
|
|
419
437
|
def _build_tree(current_path: str) -> List[Dict[str, Any]]:
|
|
420
438
|
entries = []
|
|
421
439
|
try:
|
|
@@ -423,14 +441,27 @@ def directory_tree(
|
|
|
423
441
|
items = sorted(it, key=lambda x: x.name)
|
|
424
442
|
|
|
425
443
|
for entry in items:
|
|
426
|
-
# Check exclusion
|
|
427
|
-
|
|
428
|
-
|
|
444
|
+
# 1. Check exclusion patterns
|
|
445
|
+
rel_path_from_root = entry.path[root_path_len:]
|
|
446
|
+
|
|
429
447
|
should_exclude = False
|
|
430
|
-
for pattern in
|
|
431
|
-
|
|
448
|
+
for pattern in all_exclude_patterns:
|
|
449
|
+
# Match against relative path or name
|
|
450
|
+
# Support ending with / for directory matching
|
|
451
|
+
is_dir_pattern = pattern.endswith("/")
|
|
452
|
+
norm_pattern = pattern.rstrip("/")
|
|
453
|
+
|
|
454
|
+
if fnmatch.fnmatch(rel_path_from_root, pattern) or fnmatch.fnmatch(entry.name, pattern):
|
|
432
455
|
should_exclude = True
|
|
433
456
|
break
|
|
457
|
+
|
|
458
|
+
# Handle patterns like "node_modules/" matching "node_modules" directory
|
|
459
|
+
if fnmatch.fnmatch(entry.name, norm_pattern):
|
|
460
|
+
if is_dir_pattern and not entry.is_dir():
|
|
461
|
+
continue
|
|
462
|
+
should_exclude = True
|
|
463
|
+
break
|
|
464
|
+
|
|
434
465
|
if should_exclude:
|
|
435
466
|
continue
|
|
436
467
|
|
|
@@ -14,7 +14,7 @@ def install_openrouter(ctx):
|
|
|
14
14
|
def __init__(self, **kwargs):
|
|
15
15
|
super().__init__(**kwargs)
|
|
16
16
|
|
|
17
|
-
def to_response(self, response, chat, started_at):
|
|
17
|
+
def to_response(self, response, chat, started_at, context=None):
|
|
18
18
|
# go through all image responses and save them to cache
|
|
19
19
|
cost = None
|
|
20
20
|
if "usage" in response and "cost" in response["usage"]:
|
|
@@ -57,7 +57,7 @@ try:
|
|
|
57
57
|
except ImportError:
|
|
58
58
|
HAS_PIL = False
|
|
59
59
|
|
|
60
|
-
VERSION = "3.0.
|
|
60
|
+
VERSION = "3.0.21"
|
|
61
61
|
_ROOT = None
|
|
62
62
|
DEBUG = os.getenv("DEBUG") == "1"
|
|
63
63
|
MOCK = os.getenv("MOCK") == "1"
|
|
@@ -874,8 +874,18 @@ def save_image_to_cache(base64_data, filename, image_info, ignore_info=False):
|
|
|
874
874
|
async def response_json(response):
|
|
875
875
|
text = await response.text()
|
|
876
876
|
if response.status >= 400:
|
|
877
|
-
|
|
878
|
-
|
|
877
|
+
message = "HTTP " + str(response.status) + " " + response.reason
|
|
878
|
+
_dbg(f"HTTP {response.status} {response.reason}\n{dict(response.headers)}\n{text}")
|
|
879
|
+
try:
|
|
880
|
+
body = json.loads(text)
|
|
881
|
+
if "message" in body:
|
|
882
|
+
message = body["message"]
|
|
883
|
+
elif "error" in body:
|
|
884
|
+
message = body["error"]
|
|
885
|
+
except Exception:
|
|
886
|
+
if text:
|
|
887
|
+
message += ": " + text[:100]
|
|
888
|
+
raise Exception(message)
|
|
879
889
|
response.raise_for_status()
|
|
880
890
|
body = json.loads(text)
|
|
881
891
|
return body
|
|
@@ -1946,12 +1956,11 @@ async def g_chat_completion(chat, context=None):
|
|
|
1946
1956
|
first_exception = e
|
|
1947
1957
|
context["stackTrace"] = traceback.format_exc()
|
|
1948
1958
|
_err(f"Provider {provider_name} failed", first_exception)
|
|
1949
|
-
await g_app.on_chat_error(e, context)
|
|
1950
|
-
|
|
1951
1959
|
continue
|
|
1952
1960
|
|
|
1953
1961
|
# If we get here, all providers failed
|
|
1954
1962
|
if first_exception:
|
|
1963
|
+
await g_app.on_chat_error(first_exception, context or {"chat": chat})
|
|
1955
1964
|
raise first_exception
|
|
1956
1965
|
|
|
1957
1966
|
e = Exception("All providers failed")
|
|
@@ -3871,8 +3880,8 @@ def cli_exec(cli_args, extra_args):
|
|
|
3871
3880
|
asyncio.run(update_extensions(cli_args.update))
|
|
3872
3881
|
return ExitCode.SUCCESS
|
|
3873
3882
|
|
|
3874
|
-
g_app.add_allowed_directory(home_llms_path(".agent")) # info for agents, e.g: skills
|
|
3875
3883
|
g_app.add_allowed_directory(os.getcwd()) # add current directory
|
|
3884
|
+
g_app.add_allowed_directory(home_llms_path(".agent")) # info for agents, e.g: skills
|
|
3876
3885
|
g_app.add_allowed_directory(tempfile.gettempdir()) # add temp directory
|
|
3877
3886
|
|
|
3878
3887
|
g_app.extensions = install_extensions()
|