diff --git a/.gitignore b/.gitignore index f4dde42..049f06b 100644 --- a/.gitignore +++ b/.gitignore @@ -156,3 +156,4 @@ dmypy.json /poetry.lock /tilellm/modules/pdf_ocr/PDF_GRAPHRAG_INTEGRATION_PROPOSAL.md /tilellm/modules/pdf_ocr/PDF_OCR_IMPLEMENTATION_STATUS.md +*vscode* \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0114a5f --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +COMPOSE_FILE := ./docker/docker-compose.yml +ENV_FILE := ./docker/.env +PROFILE ?= app-base + +.PHONY: up down restart ps logs logs-app logs-redis + +up: + docker compose --env-file $(ENV_FILE) -f $(COMPOSE_FILE) --profile $(PROFILE) up --build -d + +down: + docker compose --env-file $(ENV_FILE) -f $(COMPOSE_FILE) --profile $(PROFILE) down + +restart: down up + +ps: + docker compose --env-file $(ENV_FILE) -f $(COMPOSE_FILE) --profile $(PROFILE) ps + +logs: + docker compose --env-file $(ENV_FILE) -f $(COMPOSE_FILE) --profile $(PROFILE) logs -f + +logs-app: + docker compose --env-file $(ENV_FILE) -f $(COMPOSE_FILE) logs -f app-base app-graph app-ocr app-all + +logs-redis: + docker compose --env-file $(ENV_FILE) -f $(COMPOSE_FILE) logs -f redis diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 62de909..9114e7f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -54,11 +54,11 @@ services: - ENABLE_PROFILER=${ENABLE_PROFILER} - ENABLE_GRAPHRAG_FALKOR=${ENABLE_GRAPHRAG_FALKOR} - FALKORDB_URI=${FALKORDB_URI} - - FALKORDB_MAX_CONNECTIONS="${FALKORDB_MAX_CONNECTIONS} + - FALKORDB_MAX_CONNECTIONS=${FALKORDB_MAX_CONNECTIONS} - FALKORDB_SOCKET_TIMEOUT=${FALKORDB_SOCKET_TIMEOUT} - FALKORDB_SOCKET_CONNECT_TIMEOUT=${FALKORDB_SOCKET_CONNECT_TIMEOUT} - FALKORDB_SOCKET_KEEPALIVE=${FALKORDB_SOCKET_KEEPALIVE} - - FALKORDB_RETRY_ON_TIMEOUT="${FALKORDB_RETRY_ON_TIMEOUT} + - FALKORDB_RETRY_ON_TIMEOUT=${FALKORDB_RETRY_ON_TIMEOUT} - ENABLE_GRAPHRAG=${ENABLE_GRAPHRAG} - ENABLE_PDF_OCR=${ENABLE_PDF_OCR} - ENABLE_CONVERSION=${ENABLE_CONVERSION} @@ -88,11 +88,11 @@ services: - ENABLE_GRAPHRAG=${ENABLE_GRAPHRAG} - ENABLE_GRAPHRAG_FALKOR=${ENABLE_GRAPHRAG_FALKOR} - FALKORDB_URI=${FALKORDB_URI} - - FALKORDB_MAX_CONNECTIONS="${FALKORDB_MAX_CONNECTIONS} + - FALKORDB_MAX_CONNECTIONS=${FALKORDB_MAX_CONNECTIONS} - FALKORDB_SOCKET_TIMEOUT=${FALKORDB_SOCKET_TIMEOUT} - FALKORDB_SOCKET_CONNECT_TIMEOUT=${FALKORDB_SOCKET_CONNECT_TIMEOUT} - FALKORDB_SOCKET_KEEPALIVE=${FALKORDB_SOCKET_KEEPALIVE} - - FALKORDB_RETRY_ON_TIMEOUT="${FALKORDB_RETRY_ON_TIMEOUT} + - FALKORDB_RETRY_ON_TIMEOUT=${FALKORDB_RETRY_ON_TIMEOUT} - ENABLE_PDF_OCR=${ENABLE_PDF_OCR} - ENABLE_CONVERSION=${ENABLE_CONVERSION} - ENABLE_TOOLS_REGISTRY=${ENABLE_TOOLS_REGISTRY} @@ -129,11 +129,11 @@ services: - ENABLE_GRAPHRAG=${ENABLE_GRAPHRAG} - ENABLE_GRAPHRAG_FALKOR=${ENABLE_GRAPHRAG_FALKOR} - FALKORDB_URI=${FALKORDB_URI} - - FALKORDB_MAX_CONNECTIONS="${FALKORDB_MAX_CONNECTIONS} + - FALKORDB_MAX_CONNECTIONS=${FALKORDB_MAX_CONNECTIONS} - FALKORDB_SOCKET_TIMEOUT=${FALKORDB_SOCKET_TIMEOUT} - FALKORDB_SOCKET_CONNECT_TIMEOUT=${FALKORDB_SOCKET_CONNECT_TIMEOUT} - FALKORDB_SOCKET_KEEPALIVE=${FALKORDB_SOCKET_KEEPALIVE} - - FALKORDB_RETRY_ON_TIMEOUT="${FALKORDB_RETRY_ON_TIMEOUT} + - FALKORDB_RETRY_ON_TIMEOUT=${FALKORDB_RETRY_ON_TIMEOUT} - ENABLE_PDF_OCR=${ENABLE_PDF_OCR} - ENABLE_CONVERSION=${ENABLE_CONVERSION} - ENABLE_TOOLS_REGISTRY=${ENABLE_TOOLS_REGISTRY} diff --git a/tilellm/__main__.py b/tilellm/__main__.py index fb48547..c6f0afe 100644 --- a/tilellm/__main__.py +++ b/tilellm/__main__.py @@ -14,6 +14,7 @@ from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from fastapi_cprofile.profiler import CProfileMiddleware from fastapi.responses import JSONResponse +from pydantic import BaseModel import asyncio from redis.asyncio import Redis, from_url @@ -35,7 +36,14 @@ RepositoryDescNamespaceResult, RepositoryItems, SimpleAnswer, RepositoryEngine, RetrievalChunksResult) from tilellm.models.schemas.general_schemas import AsyncTaskResponse -from tilellm.modules.knowledge_graph.models.schemas import TaskPollResponse +try: + from tilellm.modules.knowledge_graph.models.schemas import TaskPollResponse +except ImportError: + class TaskPollResponse(BaseModel): + task_id: str + status: str + result: dict | None = None + error: str | None = None try: from tilellm.modules.task_executor.tasks import task_scrape_item_single diff --git a/tilellm/models/llm.py b/tilellm/models/llm.py index 234af87..5c47839 100644 --- a/tilellm/models/llm.py +++ b/tilellm/models/llm.py @@ -94,7 +94,7 @@ class QuestionAnswer(BaseModel): tags: Optional[Union[str, List[str]]] = None llm: Optional[str] = Field(default="openai") gptkey: Optional[SecretStr] = "sk" - model: Union[str, LlmEmbeddingModel] = Field(default="gpt-3.5-turbo") + model: Union[str, LlmEmbeddingModel] = Field(default="gpt-4.1-nano") sparse_encoder: Union[str, "TEIConfig", None] = Field(default="splade") #bge-m3 temperature: float = Field(default=0.0) top_k: int = Field(default=5) diff --git a/tilellm/store/pinecone/pinecone_repository_base.py b/tilellm/store/pinecone/pinecone_repository_base.py index a5e5718..aee92d6 100644 --- a/tilellm/store/pinecone/pinecone_repository_base.py +++ b/tilellm/store/pinecone/pinecone_repository_base.py @@ -1,5 +1,6 @@ import uuid from abc import abstractmethod +import os import time import asyncio @@ -119,13 +120,15 @@ async def _create_index_if_not_exists(self): logger.info(f'Creating new index {self.engine.index_name}...') try: if self.engine.type == "serverless": + serverless_cloud = os.environ.get("PINECONE_SERVERLESS_CLOUD", "aws") + serverless_region = os.environ.get("PINECONE_SERVERLESS_REGION", "us-east-1") await self._pc_client.create_index( name=self.engine.index_name, dimension=self.emb_dimension, metric=self.engine.metric, spec=pinecone.ServerlessSpec( - cloud="aws", - region="us-west-2" + cloud=serverless_cloud, + region=serverless_region ) ) else: # Pod type @@ -815,11 +818,13 @@ async def create_index_instance(engine, embeddings, emb_dimension) -> PineconeVe logger.debug(f'Create index {engine.index_name} and embeddings ...') if engine.type == "serverless": #os.environ.get("PINECONE_TYPE") == "serverless": + serverless_cloud = os.environ.get("PINECONE_SERVERLESS_CLOUD", "aws") + serverless_region = os.environ.get("PINECONE_SERVERLESS_REGION", "us-east-1") await pc.create_index(engine.index_name, # const.PINECONE_INDEX, dimension=emb_dimension, metric=engine.metric, - spec=pinecone.ServerlessSpec(cloud="aws", - region="us-west-2" + spec=pinecone.ServerlessSpec(cloud=serverless_cloud, + region=serverless_region ) ) else: @@ -953,4 +958,3 @@ async def _create_vector_store_instance(engine, embeddings, emb_dimension) -> Ca -