diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 132b5f1df010..420d6bb1ba08 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -14,12 +14,10 @@ build: - asdf install uv latest - asdf global uv latest - uv venv - - cd docs && UV_INDEX_STRATEGY=unsafe-first-match uv pip install -r requirements.lock + - uv pip install ./core + - grep -v '^quivr-core' docs/requirements.lock > /tmp/requirements-filtered.lock && cd docs && UV_INDEX_STRATEGY=unsafe-first-match uv pip install -r /tmp/requirements-filtered.lock - cd docs/ && ls -la && NO_COLOR=1 ../.venv/bin/mkdocs build --strict --site-dir $READTHEDOCS_OUTPUT/html --config-file mkdocs.yml - - mkdocs: - configuration: backend/docs/mkdocs.yml - + configuration: docs/mkdocs.yml diff --git a/core/quivr_core/llm/llm_endpoint.py b/core/quivr_core/llm/llm_endpoint.py index 524e4d5bc9fe..55f4aee162b0 100644 --- a/core/quivr_core/llm/llm_endpoint.py +++ b/core/quivr_core/llm/llm_endpoint.py @@ -291,6 +291,16 @@ def from_config(cls, config: LLMEndpointConfig = LLMEndpointConfig()): max_tokens=config.max_output_tokens, temperature=config.temperature, ) + elif config.supplier == DefaultModelSuppliers.AVIAN: + _llm = ChatOpenAI( + model=config.model, + api_key=SecretStr(config.llm_api_key) + if config.llm_api_key + else None, + base_url=config.llm_base_url or "https://api.avian.io/v1", + max_completion_tokens=config.max_output_tokens, + temperature=config.temperature, + ) else: _llm = ChatOpenAI( diff --git a/core/quivr_core/rag/entities/config.py b/core/quivr_core/rag/entities/config.py index ad9b38366a89..c948ceaa8248 100644 --- a/core/quivr_core/rag/entities/config.py +++ b/core/quivr_core/rag/entities/config.py @@ -75,6 +75,7 @@ class DefaultModelSuppliers(str, Enum): MISTRAL = "mistral" GROQ = "groq" GEMINI = "gemini" + AVIAN = "avian" class LLMConfig(QuivrBaseConfig): @@ -275,6 +276,24 @@ class LLMModelConfig: tokenizer_hub="Quivr/gemini-tokenizer", ), }, + DefaultModelSuppliers.AVIAN: { + "deepseek/deepseek-v3.2": LLMConfig( + max_context_tokens=164000, + max_output_tokens=65000, + ), + "moonshotai/kimi-k2.5": LLMConfig( + max_context_tokens=131000, + max_output_tokens=8192, + ), + "z-ai/glm-5": LLMConfig( + max_context_tokens=131000, + max_output_tokens=16384, + ), + "minimax/minimax-m2.5": LLMConfig( + max_context_tokens=1000000, + max_output_tokens=1000000, + ), + }, } @classmethod diff --git a/core/tests/test_llm_endpoint.py b/core/tests/test_llm_endpoint.py index c26570591a0d..58fb74d770d5 100644 --- a/core/tests/test_llm_endpoint.py +++ b/core/tests/test_llm_endpoint.py @@ -3,7 +3,7 @@ import pytest from langchain_core.language_models import FakeListChatModel from pydantic import ValidationError -from quivr_core.rag.entities.config import LLMEndpointConfig +from quivr_core.rag.entities.config import DefaultModelSuppliers, LLMEndpointConfig from quivr_core.llm import LLMEndpoint @@ -46,3 +46,21 @@ def test_llm_endpoint_constructor(): ) assert not llm_endpoint.supports_func_calling() + + +@pytest.mark.base +def test_llm_endpoint_avian(): + from langchain_openai import ChatOpenAI + + config = LLMEndpointConfig( + supplier=DefaultModelSuppliers.AVIAN, + model="deepseek/deepseek-v3.2", + llm_api_key="test", + ) + llm = LLMEndpoint.from_config(config) + + assert llm.supports_func_calling() + assert isinstance(llm._llm, ChatOpenAI) + assert llm._llm.openai_api_base == "https://api.avian.io/v1" + assert config.max_output_tokens == 65000 + assert config.max_context_tokens <= 164000 diff --git a/docs/requirements-dev.lock b/docs/requirements-dev.lock index e35705e2d5b4..b144006b6b4c 100644 --- a/docs/requirements-dev.lock +++ b/docs/requirements-dev.lock @@ -217,7 +217,7 @@ mdit-py-plugins==0.4.1 # via jupytext mdurl==0.1.2 # via markdown-it-py -megaparse-sdk==0.1.10 +megaparse-sdk==0.1.11 # via quivr-core mergedeep==1.3.4 # via mkdocs diff --git a/docs/requirements.lock b/docs/requirements.lock index e35705e2d5b4..b144006b6b4c 100644 --- a/docs/requirements.lock +++ b/docs/requirements.lock @@ -217,7 +217,7 @@ mdit-py-plugins==0.4.1 # via jupytext mdurl==0.1.2 # via markdown-it-py -megaparse-sdk==0.1.10 +megaparse-sdk==0.1.11 # via quivr-core mergedeep==1.3.4 # via mkdocs