diff --git a/.github/actions/setup-env/action.yml b/.github/actions/setup-env/action.yml index 795d52bd..b39f4b18 100644 --- a/.github/actions/setup-env/action.yml +++ b/.github/actions/setup-env/action.yml @@ -16,7 +16,6 @@ runs: - name: Setup mambaforge and development environment uses: conda-incubator/setup-miniconda@v3 with: - miniforge-variant: Mambaforge miniforge-version: latest activate-environment: ragna-deploy-dev @@ -57,13 +56,6 @@ runs: shell: bash -el {0} run: playwright install - - name: Install dev dependencies - shell: bash -el {0} - run: | - pip install \ - git+https://github.com/bokeh/bokeh-fastapi.git@main \ - git+https://github.com/holoviz/panel@7377c9e99bef0d32cbc65e94e908e365211f4421 - - name: Install ragna shell: bash -el {0} run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 611f5e13..1fd5080f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -38,9 +38,7 @@ jobs: matrix: os: - ubuntu-latest - # FIXME - # Building panel from source on Windows does not work through pip - # - windows-latest + - windows-latest - macos-latest python-version: ["3.10"] include: @@ -81,65 +79,64 @@ jobs: uses: pmeier/pytest-results-action@v0.3.0 with: path: test-results.xml - - pytest-ui: - strategy: - matrix: - os: - - ubuntu-latest - - windows-latest - - macos-latest - browser: - - chromium - - firefox - python-version: - - "3.10" - - "3.10" - - "3.12" - exclude: - - python-version: "3.11" - os: windows-latest - - python-version: "3.12" - os: windows-latest - - python-version: "3.11" - os: macos-latest - - python-version: "3.12" - os: macos-latest - include: - - browser: webkit - os: macos-latest - python-version: "3.10" - - fail-fast: false - - runs-on: ${{ matrix.os }} - - defaults: - run: - shell: bash -el {0} - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup environment - uses: ./.github/actions/setup-env - with: - python-version: ${{ matrix.python-version }} - - - name: Run unit tests - id: tests - run: | - pytest tests/deploy/ui \ - --browser ${{ matrix.browser }} \ - --video=retain-on-failure - - - name: Upload playwright video - if: failure() - uses: actions/upload-artifact@v4 - with: - name: - playwright-${{ matrix.os }}-${{ matrix.python-version}}-${{ github.run_id }} - path: test-results +# pytest-ui: +# strategy: +# matrix: +# os: +# - ubuntu-latest +# - windows-latest +# - macos-latest +# browser: +# - chromium +# - firefox +# python-version: +# - "3.10" +# - "3.10" +# - "3.12" +# exclude: +# - python-version: "3.11" +# os: windows-latest +# - python-version: "3.12" +# os: windows-latest +# - python-version: "3.11" +# os: macos-latest +# - python-version: "3.12" +# os: macos-latest +# include: +# - browser: webkit +# os: macos-latest +# python-version: "3.10" +# +# fail-fast: false +# +# runs-on: ${{ matrix.os }} +# +# defaults: +# run: +# shell: bash -el {0} +# +# steps: +# - name: Checkout repository +# uses: actions/checkout@v4 +# with: +# fetch-depth: 0 +# +# - name: Setup environment +# uses: ./.github/actions/setup-env +# with: +# python-version: ${{ matrix.python-version }} +# +# - name: Run unit tests +# id: tests +# run: | +# pytest tests/deploy/ui \ +# --browser ${{ matrix.browser }} \ +# --video=retain-on-failure +# +# - name: Upload playwright video +# if: failure() +# uses: actions/upload-artifact@v4 +# with: +# name: +# playwright-${{ matrix.os }}-${{ matrix.python-version}}-${{ github.run_id }} +# path: test-results diff --git a/pyproject.toml b/pyproject.toml index f44c823f..67ffe501 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,21 +15,22 @@ authors = [ readme = "README.md" classifiers = [ "Development Status :: 4 - Beta", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", ] requires-python = ">=3.10" dependencies = [ "aiofiles", + # Remove this and instead depend on panel[fastapi] + # after https://github.com/holoviz/panel/pull/7495 is released + "bokeh_fastapi==0.1.1", "emoji", "eval_type_backport; python_version<'3.10'", "fastapi", "httpx", "packaging", - # FIXME: pin them to released versions - "bokeh-fastapi", - "panel", + "panel==1.5.4", "pydantic>=2", "pydantic-core", "pydantic-settings>=2", diff --git a/ragna/core/_components.py b/ragna/core/_components.py index ecec015b..a4d3e519 100644 --- a/ragna/core/_components.py +++ b/ragna/core/_components.py @@ -1,11 +1,11 @@ from __future__ import annotations import abc -import datetime import enum import functools import inspect import uuid +from datetime import datetime, timezone from typing import ( AsyncIterable, AsyncIterator, @@ -185,7 +185,7 @@ def __init__( role: MessageRole = MessageRole.SYSTEM, sources: Optional[list[Source]] = None, id: Optional[uuid.UUID] = None, - timestamp: Optional[datetime.datetime] = None, + timestamp: Optional[datetime] = None, ) -> None: if isinstance(content, str): self._content: str = content @@ -200,7 +200,7 @@ def __init__( self.id = id if timestamp is None: - timestamp = datetime.datetime.utcnow() + timestamp = datetime.now(timezone.utc) self.timestamp = timestamp async def __aiter__(self) -> AsyncIterator[str]: diff --git a/ragna/deploy/_core.py b/ragna/deploy/_core.py index 44c672a8..65cca3cd 100644 --- a/ragna/deploy/_core.py +++ b/ragna/deploy/_core.py @@ -2,12 +2,15 @@ import threading import time import webbrowser +from pathlib import Path from typing import AsyncContextManager, AsyncIterator, Callable, Optional, cast import httpx +import panel.io.fastapi from fastapi import FastAPI, Request, status from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse, Response +from fastapi.staticfiles import StaticFiles import ragna from ragna.core import RagnaException @@ -79,8 +82,14 @@ def server_available() -> bool: app.include_router(make_api_router(engine), prefix="/api") if ui: - panel_app = make_ui_app(engine) - panel_app.serve_with_fastapi(app, endpoint="/ui") + ui_app = make_ui_app(engine) + panel.io.fastapi.add_applications({"/ui": ui_app.index_page}, app=app) + for dir in ["css", "imgs"]: + app.mount( + f"/{dir}", + StaticFiles(directory=str(Path(__file__).parent / "_ui" / dir)), + name=dir, + ) @app.get("/", include_in_schema=False) async def base_redirect() -> Response: diff --git a/ragna/deploy/_engine.py b/ragna/deploy/_engine.py index 631ba5f0..6df48460 100644 --- a/ragna/deploy/_engine.py +++ b/ragna/deploy/_engine.py @@ -40,7 +40,7 @@ def _get_component_json_schema( json_schema = component._protocol_model().model_json_schema() # FIXME: there is likely a better way to exclude certain fields builtin in # pydantic - for special_param in SpecialChatParams.model_fields: + for special_param in SpecialChatParams.__pydantic_fields__: if ( "properties" in json_schema and special_param in json_schema["properties"] diff --git a/ragna/deploy/_ui/api_wrapper.py b/ragna/deploy/_ui/api_wrapper.py index 6ee2f8a3..9dcc6b16 100644 --- a/ragna/deploy/_ui/api_wrapper.py +++ b/ragna/deploy/_ui/api_wrapper.py @@ -30,8 +30,8 @@ async def answer(self, chat_id, prompt): ): yield self.improve_message(message.model_dump(mode="json")) - async def get_components(self): - return self._engine.get_components().model_dump(mode="json") + def get_components(self): + return self._engine.get_components() async def start_and_prepare( self, name, documents, source_storage, assistant, params diff --git a/ragna/deploy/_ui/app.py b/ragna/deploy/_ui/app.py index 052ff36d..4163c378 100644 --- a/ragna/deploy/_ui/app.py +++ b/ragna/deploy/_ui/app.py @@ -1,10 +1,5 @@ -from pathlib import Path -from typing import cast - import panel as pn import param -from fastapi import FastAPI -from fastapi.staticfiles import StaticFiles from ragna.deploy._engine import Engine @@ -83,61 +78,6 @@ def index_page(self): def health_page(self): return pn.pane.HTML("

Ok

") - def add_panel_app(self, server, panel_app_fn, endpoint): - # FIXME: this code will ultimately be distributed as part of panel - from functools import partial - - import panel as pn - from bokeh.application import Application - from bokeh.application.handlers.function import FunctionHandler - from bokeh_fastapi import BokehFastAPI - from bokeh_fastapi.handler import WSHandler - from fastapi.responses import FileResponse - from panel.io.document import extra_socket_handlers - from panel.io.resources import COMPONENT_PATH - from panel.io.server import ComponentResourceHandler - from panel.io.state import set_curdoc - - def dispatch_fastapi(conn, events=None, msg=None): - if msg is None: - msg = conn.protocol.create("PATCH-DOC", events) - return [conn._socket.send_message(msg)] - - extra_socket_handlers[WSHandler] = dispatch_fastapi - - def panel_app(doc): - doc.on_event("document_ready", partial(pn.state._schedule_on_load, doc)) - - with set_curdoc(doc): - panel_app = panel_app_fn() - panel_app.server_doc(doc) - - handler = FunctionHandler(panel_app) - application = Application(handler) - - BokehFastAPI({endpoint: application}, server=server) - - @server.get( - f"/{COMPONENT_PATH.rstrip('/')}" + "/{path:path}", include_in_schema=False - ) - def get_component_resource(path: str): - # ComponentResourceHandler.parse_url_path only ever accesses - # self._resource_attrs, which fortunately is a class attribute. Thus, we can - # get away with using the method without actually instantiating the class - self_ = cast(ComponentResourceHandler, ComponentResourceHandler) - resolved_path = ComponentResourceHandler.parse_url_path(self_, path) - return FileResponse(resolved_path) - - def serve_with_fastapi(self, app: FastAPI, endpoint: str): - self.add_panel_app(app, self.index_page, endpoint) - - for dir in ["css", "imgs"]: - app.mount( - f"/{dir}", - StaticFiles(directory=str(Path(__file__).parent / dir)), - name=dir, - ) - def app(engine: Engine) -> App: return App(engine) diff --git a/ragna/deploy/_ui/central_view.py b/ragna/deploy/_ui/central_view.py index 644e3a06..81ac9072 100644 --- a/ragna/deploy/_ui/central_view.py +++ b/ragna/deploy/_ui/central_view.py @@ -368,11 +368,7 @@ def header(self): ) chat_documents_pills = [] - if ( - self.current_chat is not None - and "metadata" in self.current_chat - and "documents" in self.current_chat - ): + if self.current_chat is not None: doc_names = [d["name"] for d in self.current_chat["documents"]] # FIXME: Instead of setting a hard limit of 20 documents here, this should diff --git a/ragna/deploy/_ui/css/chat_interface/card.css b/ragna/deploy/_ui/css/chat_interface/chatinterface.css similarity index 100% rename from ragna/deploy/_ui/css/chat_interface/card.css rename to ragna/deploy/_ui/css/chat_interface/chatinterface.css diff --git a/ragna/deploy/_ui/css/modal_configuration/fileinput.css b/ragna/deploy/_ui/css/modal_configuration/fileinput.css new file mode 100644 index 00000000..6807a6c1 --- /dev/null +++ b/ragna/deploy/_ui/css/modal_configuration/fileinput.css @@ -0,0 +1,5 @@ +:host(.file-input) .bk-input { + height: 80px; + border: var(--accent-color) dashed 2px; + border-radius: 10px; +} diff --git a/ragna/deploy/_ui/modal_configuration.py b/ragna/deploy/_ui/modal_configuration.py index a8bb44e7..53ecb756 100644 --- a/ragna/deploy/_ui/modal_configuration.py +++ b/ragna/deploy/_ui/modal_configuration.py @@ -87,8 +87,11 @@ def __init__(self, api_wrapper, **params): self.chat_name_input = pn.widgets.TextInput.from_param( self.param.chat_name, ) - # FIXME: accept - self.document_uploader = pn.widgets.FileInput(multiple=True) + self.document_uploader = pn.widgets.FileInput( + multiple=True, + css_classes=["file-input"], + accept=",".join(self.api_wrapper.get_components().documents), + ) # Most widgets (including those that use from_param) should be placed after the super init call self.cancel_button = pn.widgets.Button( @@ -182,19 +185,19 @@ async def model_section(self): # prevents re-rendering the section if self.config is None: # Retrieve the components from the API and build a config object - components = await self.api_wrapper.get_components() + components = self.api_wrapper.get_components() # TODO : use the components to set up the default values for the various params config = ChatConfig() - config.allowed_documents = components["documents"] + config.allowed_documents = components.documents - assistants = [component["title"] for component in components["assistants"]] + assistants = [assistant["title"] for assistant in components.assistants] config.param.assistant_name.objects = assistants config.assistant_name = assistants[0] source_storages = [ - component["title"] for component in components["source_storages"] + source_storage["title"] for source_storage in components.source_storages ] config.param.source_storage_name.objects = source_storages config.source_storage_name = source_storages[0] @@ -202,7 +205,6 @@ async def model_section(self): # Now that the config object is set, we can assign it to the param. # This will trigger the update of the advanced_config_ui section self.config = config - self.document_uploader.allowed_documents = config.allowed_documents return pn.Row( pn.Column( diff --git a/ragna/deploy/_ui/styles.py b/ragna/deploy/_ui/styles.py index 793b4ca6..44bb1c4e 100644 --- a/ragna/deploy/_ui/styles.py +++ b/ragna/deploy/_ui/styles.py @@ -37,10 +37,10 @@ "central_view": [pn.Column, pn.Row, pn.pane.HTML], "chat_interface": [ pn.widgets.TextInput, - pn.layout.Card, pn.pane.Markdown, pn.widgets.button.Button, pn.Column, + pn.chat.ChatInterface, ], "right_sidebar": [pn.widgets.Button, pn.Column, pn.pane.Markdown], "left_sidebar": [pn.widgets.Button, pn.pane.HTML, pn.Column], @@ -50,6 +50,7 @@ pn.layout.Card, pn.Row, pn.widgets.Button, + pn.widgets.FileInput, ], } diff --git a/requirements-docker.lock b/requirements-docker.lock index 0010d3c0..14264c8e 100644 --- a/requirements-docker.lock +++ b/requirements-docker.lock @@ -4,85 +4,82 @@ # # pip-compile --extra=all --output-file=requirements-docker.lock --strip-extras pyproject.toml # -aiofiles==23.2.1 +aiofiles==24.1.0 # via Ragna (pyproject.toml) -annotated-types==0.6.0 +annotated-types==0.7.0 # via pydantic -anyio==4.2.0 +anyio==4.7.0 # via # httpx # starlette # watchfiles -asgiref==3.7.2 +asgiref==3.8.1 # via opentelemetry-instrumentation-asgi -attrs==23.2.0 - # via lancedb backoff==2.2.1 - # via - # opentelemetry-exporter-otlp-proto-common - # opentelemetry-exporter-otlp-proto-grpc - # posthog -bcrypt==4.1.2 + # via posthog +bcrypt==4.2.1 # via chromadb -bleach==6.1.0 +bleach==6.2.0 # via panel -bokeh==3.4.1 - # via panel -build==1.0.3 - # via chromadb -cachetools==5.3.2 +bokeh==3.6.2 # via - # google-auth - # lancedb -certifi==2023.11.17 + # bokeh-fastapi + # panel +bokeh-fastapi==0.1.1 + # via Ragna (pyproject.toml) +build==1.2.2.post1 + # via chromadb +cachetools==5.5.0 + # via google-auth +certifi==2024.8.30 # via # httpcore # httpx # kubernetes - # pulsar-client # requests -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 # via requests -chroma-hnswlib==0.7.3 +chroma-hnswlib==0.7.6 # via chromadb -chromadb==0.4.22 +chromadb==0.5.23 # via Ragna (pyproject.toml) click==8.1.7 # via - # lancedb # typer # uvicorn coloredlogs==15.0.1 # via onnxruntime -contourpy==1.2.0 +contourpy==1.3.1 # via bokeh -decorator==5.1.1 - # via retry -deprecated==1.2.14 +deprecated==1.2.15 # via # opentelemetry-api # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-semantic-conventions deprecation==2.1.0 # via lancedb -emoji==2.9.0 +durationpy==0.9 + # via kubernetes +emoji==2.14.0 # via Ragna (pyproject.toml) -fastapi==0.109.0 +fastapi==0.115.6 # via # Ragna (pyproject.toml) + # bokeh-fastapi # chromadb -filelock==3.13.1 +filelock==3.16.1 # via huggingface-hub -flatbuffers==23.5.26 +flatbuffers==24.3.25 # via onnxruntime -fsspec==2023.12.2 +fsspec==2024.10.0 # via huggingface-hub -google-auth==2.26.2 +google-auth==2.36.0 # via kubernetes -googleapis-common-protos==1.62.0 +googleapis-common-protos==1.66.0 # via opentelemetry-exporter-otlp-proto-grpc -greenlet==3.0.3 +greenlet==3.1.1 # via sqlalchemy -grpcio==1.60.0 +grpcio==1.68.1 # via # chromadb # opentelemetry-exporter-otlp-proto-grpc @@ -90,61 +87,63 @@ h11==0.14.0 # via # httpcore # uvicorn -httpcore==1.0.2 +httpcore==1.0.7 # via httpx -httptools==0.6.1 +httptools==0.6.4 # via uvicorn -httpx==0.26.0 - # via Ragna (pyproject.toml) +httpx==0.28.1 + # via + # Ragna (pyproject.toml) + # chromadb httpx-sse==0.4.0 # via Ragna (pyproject.toml) -huggingface-hub==0.20.2 +huggingface-hub==0.26.5 # via tokenizers humanfriendly==10.0 # via coloredlogs -idna==3.6 +idna==3.10 # via # anyio # httpx # requests -ijson==3.2.3 +ijson==3.3.0 # via Ragna (pyproject.toml) -importlib-metadata==6.11.0 +importlib-metadata==8.5.0 # via opentelemetry-api -importlib-resources==6.1.1 +importlib-resources==6.4.5 # via chromadb -jinja2==3.1.3 +jinja2==3.1.4 # via bokeh -kubernetes==29.0.0 +kubernetes==31.0.0 # via chromadb -lancedb==0.4.4 +lancedb==0.17.0 # via Ragna (pyproject.toml) -linkify-it-py==2.0.2 +linkify-it-py==2.0.3 # via panel -lxml==5.1.0 +lxml==5.3.0 # via # python-docx # python-pptx -markdown==3.5.2 +markdown==3.7 # via panel markdown-it-py==3.0.0 # via # mdit-py-plugins # panel # rich -markupsafe==2.1.3 +markupsafe==3.0.2 # via jinja2 -mdit-py-plugins==0.4.0 +mdit-py-plugins==0.4.2 # via panel mdurl==0.1.2 # via markdown-it-py -mmh3==4.1.0 +mmh3==5.0.1 # via chromadb monotonic==1.6 # via posthog mpmath==1.3.0 # via sympy -numpy==1.26.3 +numpy==2.2.0 # via # bokeh # chroma-hnswlib @@ -152,15 +151,14 @@ numpy==1.26.3 # contourpy # onnxruntime # pandas - # pyarrow # pylance oauthlib==3.2.2 # via # kubernetes # requests-oauthlib -onnxruntime==1.19.0 +onnxruntime==1.20.1 # via chromadb -opentelemetry-api==1.22.0 +opentelemetry-api==1.28.2 # via # chromadb # opentelemetry-exporter-otlp-proto-grpc @@ -168,204 +166,200 @@ opentelemetry-api==1.22.0 # opentelemetry-instrumentation-asgi # opentelemetry-instrumentation-fastapi # opentelemetry-sdk -opentelemetry-exporter-otlp-proto-common==1.22.0 + # opentelemetry-semantic-conventions +opentelemetry-exporter-otlp-proto-common==1.28.2 # via opentelemetry-exporter-otlp-proto-grpc -opentelemetry-exporter-otlp-proto-grpc==1.22.0 +opentelemetry-exporter-otlp-proto-grpc==1.28.2 # via chromadb -opentelemetry-instrumentation==0.43b0 +opentelemetry-instrumentation==0.49b2 # via # opentelemetry-instrumentation-asgi # opentelemetry-instrumentation-fastapi -opentelemetry-instrumentation-asgi==0.43b0 +opentelemetry-instrumentation-asgi==0.49b2 # via opentelemetry-instrumentation-fastapi -opentelemetry-instrumentation-fastapi==0.43b0 +opentelemetry-instrumentation-fastapi==0.49b2 # via chromadb -opentelemetry-proto==1.22.0 +opentelemetry-proto==1.28.2 # via # opentelemetry-exporter-otlp-proto-common # opentelemetry-exporter-otlp-proto-grpc -opentelemetry-sdk==1.22.0 +opentelemetry-sdk==1.28.2 # via # chromadb # opentelemetry-exporter-otlp-proto-grpc -opentelemetry-semantic-conventions==0.43b0 +opentelemetry-semantic-conventions==0.49b2 # via + # opentelemetry-instrumentation # opentelemetry-instrumentation-asgi # opentelemetry-instrumentation-fastapi # opentelemetry-sdk -opentelemetry-util-http==0.43b0 +opentelemetry-util-http==0.49b2 # via # opentelemetry-instrumentation-asgi # opentelemetry-instrumentation-fastapi -overrides==7.4.0 +orjson==3.10.12 + # via chromadb +overrides==7.7.0 # via # chromadb # lancedb -packaging==23.2 +packaging==24.2 # via # Ragna (pyproject.toml) # bokeh # build # deprecation # huggingface-hub + # lancedb # onnxruntime -pandas==2.1.4 + # opentelemetry-instrumentation + # panel +pandas==2.2.3 # via # bokeh # panel -panel==1.4.4 +panel==1.5.4 # via Ragna (pyproject.toml) param==2.1.1 # via # panel # pyviz-comms -pillow==10.2.0 +pillow==11.0.0 # via # bokeh # python-pptx -posthog==3.3.1 +posthog==3.7.4 # via chromadb prompt-toolkit==3.0.36 # via questionary -protobuf==4.25.2 +protobuf==5.29.1 # via # googleapis-common-protos # onnxruntime # opentelemetry-proto -pulsar-client==3.4.0 - # via chromadb -py==1.11.0 - # via retry -pyarrow==14.0.2 +pyarrow==18.1.0 # via # Ragna (pyproject.toml) # pylance -pyasn1==0.5.1 +pyasn1==0.6.1 # via # pyasn1-modules # rsa -pyasn1-modules==0.3.0 +pyasn1-modules==0.4.1 # via google-auth -pydantic==2.5.3 +pydantic==2.10.3 # via # Ragna (pyproject.toml) # chromadb # fastapi # lancedb # pydantic-settings -pydantic-core==2.14.6 +pydantic-core==2.27.1 # via # Ragna (pyproject.toml) # pydantic -pydantic-settings==2.1.0 +pydantic-settings==2.6.1 # via Ragna (pyproject.toml) -pygments==2.17.2 +pygments==2.18.0 # via rich -pyjwt==2.8.0 +pyjwt==2.10.1 # via Ragna (pyproject.toml) -pylance==0.9.6 +pylance==0.20.0 # via lancedb -pymupdf==1.23.15 +pymupdf==1.25.0 # via Ragna (pyproject.toml) -pymupdfb==1.23.9 - # via pymupdf pypika==0.48.9 # via chromadb -pyproject-hooks==1.0.0 +pyproject-hooks==1.2.0 # via build -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via # kubernetes # pandas # posthog -python-docx==1.1.0 +python-docx==1.1.2 # via Ragna (pyproject.toml) -python-dotenv==1.0.0 +python-dotenv==1.0.1 # via # pydantic-settings # uvicorn -python-multipart==0.0.6 +python-multipart==0.0.19 # via Ragna (pyproject.toml) -python-pptx==0.6.23 +python-pptx==1.0.2 # via Ragna (pyproject.toml) -pytz==2023.3.post1 +pytz==2024.2 # via pandas -pyviz-comms==3.0.1 +pyviz-comms==3.0.3 # via panel -pyyaml==6.0.1 +pyyaml==6.0.2 # via # bokeh # chromadb # huggingface-hub # kubernetes - # lancedb # uvicorn questionary==2.0.1 # via Ragna (pyproject.toml) -ratelimiter==1.2.0.post0 - # via lancedb -regex==2023.12.25 +regex==2024.11.6 # via tiktoken -requests==2.31.0 +requests==2.32.3 # via - # chromadb # huggingface-hub # kubernetes - # lancedb # panel # posthog # requests-oauthlib # tiktoken -requests-oauthlib==1.3.1 +requests-oauthlib==2.0.0 # via kubernetes -retry==0.9.2 - # via lancedb -rich==13.7.0 - # via Ragna (pyproject.toml) +rich==13.9.4 + # via + # Ragna (pyproject.toml) + # chromadb + # typer rsa==4.9 # via google-auth -semver==3.0.2 - # via lancedb -six==1.16.0 +shellingham==1.5.4 + # via typer +six==1.17.0 # via - # bleach # kubernetes # posthog # python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -sqlalchemy==2.0.25 +sniffio==1.3.1 + # via anyio +sqlalchemy==2.0.36 # via Ragna (pyproject.toml) -starlette==0.35.1 +starlette==0.41.3 # via # Ragna (pyproject.toml) + # bokeh-fastapi # fastapi -sympy==1.12 +sympy==1.13.3 # via onnxruntime -tenacity==8.2.3 +tenacity==9.0.0 # via chromadb -tiktoken==0.5.2 +tiktoken==0.8.0 # via Ragna (pyproject.toml) -tokenizers==0.15.0 +tokenizers==0.20.3 # via chromadb -tomlkit==0.12.3 +tomlkit==0.13.2 # via Ragna (pyproject.toml) -tornado==6.4 +tornado==6.4.2 # via bokeh -tqdm==4.66.1 +tqdm==4.67.1 # via # chromadb # huggingface-hub # lancedb # panel -typer==0.9.0 +typer==0.15.1 # via # Ragna (pyproject.toml) # chromadb -typing-extensions==4.9.0 +typing-extensions==4.12.2 # via + # anyio # chromadb # fastapi # huggingface-hub @@ -374,44 +368,40 @@ typing-extensions==4.9.0 # pydantic # pydantic-core # python-docx + # python-pptx # sqlalchemy # typer -tzdata==2023.4 +tzdata==2024.2 # via pandas -uc-micro-py==1.0.2 +uc-micro-py==1.0.3 # via linkify-it-py -urllib3==2.1.0 +urllib3==2.2.3 # via # kubernetes # requests -uvicorn==0.26.0 +uvicorn==0.32.1 # via # Ragna (pyproject.toml) # chromadb -uvloop==0.19.0 +uvloop==0.21.0 # via uvicorn -watchfiles==0.21.0 +watchfiles==1.0.3 # via uvicorn wcwidth==0.2.13 # via prompt-toolkit webencodings==0.5.1 # via bleach -websocket-client==1.7.0 +websocket-client==1.8.0 # via kubernetes -websockets==12.0 +websockets==14.1 # via uvicorn -wrapt==1.16.0 +wrapt==1.17.0 # via # deprecated # opentelemetry-instrumentation -xlsxwriter==3.1.9 +xlsxwriter==3.2.0 # via python-pptx -xyzservices==2023.10.1 - # via - # bokeh - # panel -zipp==3.17.0 +xyzservices==2024.9.0 + # via bokeh +zipp==3.21.0 # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# setuptools