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