diff options
-rw-r--r-- | continuedev/pyproject.toml | 2 | ||||
-rw-r--r-- | continuedev/src/continuedev/core/autopilot.py | 6 | ||||
-rw-r--r-- | continuedev/src/continuedev/core/context.py | 39 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/meilisearch_server.py | 16 |
4 files changed, 38 insertions, 25 deletions
diff --git a/continuedev/pyproject.toml b/continuedev/pyproject.toml index e328b6cd..a3c058bd 100644 --- a/continuedev/pyproject.toml +++ b/continuedev/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" python = "^3.8.1" fastapi = "^0.95.1" typer = "^0.7.0" -openai = "^0.27.8" +openai = "^0.27.5" boltons = "^23.0.0" pydantic = "^1.10.7" uvicorn = "^0.21.1" diff --git a/continuedev/src/continuedev/core/autopilot.py b/continuedev/src/continuedev/core/autopilot.py index 256f3439..71971ddd 100644 --- a/continuedev/src/continuedev/core/autopilot.py +++ b/continuedev/src/continuedev/core/autopilot.py @@ -81,11 +81,7 @@ class Autopilot(ContinueBaseModel): self.continue_sdk.config.context_providers + [ HighlightedCodeContextProvider(ide=self.ide), FileContextProvider(workspace_dir=self.ide.workspace_directory) - ]) - - logger.debug("Loading index") - create_async_task(self.context_manager.load_index( - self.ide.workspace_directory)) + ], self.ide.workspace_directory) if full_state is not None: self.history = full_state.history diff --git a/continuedev/src/continuedev/core/context.py b/continuedev/src/continuedev/core/context.py index 48c14ed6..db1c770a 100644 --- a/continuedev/src/continuedev/core/context.py +++ b/continuedev/src/continuedev/core/context.py @@ -8,9 +8,10 @@ from pydantic import BaseModel from .main import ChatMessage, ContextItem, ContextItemDescription, ContextItemId -from ..server.meilisearch_server import check_meilisearch_running +from ..server.meilisearch_server import poll_meilisearch_running from ..libs.util.logging import logger from ..libs.util.telemetry import posthog_logger +from ..libs.util.create_async_task import create_async_task SEARCH_INDEX_NAME = "continue_context_items" @@ -140,31 +141,32 @@ class ContextManager: self.context_providers = {} self.provider_titles = set() - async def start(self, context_providers: List[ContextProvider]): + async def start(self, context_providers: List[ContextProvider], workspace_directory: str): """ Starts the context manager. """ + # Use only non-meilisearch-dependent providers until it is loaded self.context_providers = { - prov.title: prov for prov in context_providers} + title: provider for title, provider in self.context_providers.items() if title == "code" + } self.provider_titles = { provider.title for provider in context_providers} - async with Client('http://localhost:7700') as search_client: - meilisearch_running = True + # Start MeiliSearch in the background without blocking + async def start_meilisearch(context_providers): try: - - health = await search_client.health() - if not health.status == "available": - meilisearch_running = False - except: - meilisearch_running = False - - if not meilisearch_running: + await asyncio.wait_for(poll_meilisearch_running(), timeout=20) + self.context_providers = { + prov.title: prov for prov in context_providers} + logger.debug("Loading Meilisearch index...") + await self.load_index(workspace_directory) + logger.debug("Loaded Meilisearch index") + except asyncio.TimeoutError: + logger.warning("MeiliSearch did not start within 5 seconds") logger.warning( "MeiliSearch not running, avoiding any dependent context providers") - self.context_providers = { - title: provider for title, provider in self.context_providers.items() if title == "code" - } + + create_async_task(start_meilisearch(context_providers)) async def load_index(self, workspace_dir: str): for _, provider in self.context_providers.items(): @@ -184,11 +186,14 @@ class ContextManager: if len(documents) > 0: try: async with Client('http://localhost:7700') as search_client: + # First, create the index if it doesn't exist + await search_client.create_index(SEARCH_INDEX_NAME) # The index is currently shared by all workspaces globalSearchIndex = await search_client.get_index(SEARCH_INDEX_NAME) await asyncio.wait_for(asyncio.gather( # Ensure that the index has the correct filterable attributes - globalSearchIndex.update_filterable_attributes(["workspace_dir"]), + globalSearchIndex.update_filterable_attributes( + ["workspace_dir"]), globalSearchIndex.add_documents(documents) ), timeout=5) except Exception as e: diff --git a/continuedev/src/continuedev/server/meilisearch_server.py b/continuedev/src/continuedev/server/meilisearch_server.py index 7f460afc..f47c08ca 100644 --- a/continuedev/src/continuedev/server/meilisearch_server.py +++ b/continuedev/src/continuedev/server/meilisearch_server.py @@ -1,3 +1,4 @@ +import asyncio import os import shutil import subprocess @@ -58,15 +59,26 @@ async def check_meilisearch_running() -> bool: async with Client('http://localhost:7700') as client: try: resp = await client.health() - if resp["status"] != "available": + if resp.status != "available": return False return True - except: + except Exception as e: + logger.debug(e) return False except Exception: return False +async def poll_meilisearch_running(frequency: int = 0.1) -> bool: + """ + Polls MeiliSearch to see if it is running. + """ + while True: + if await check_meilisearch_running(): + return True + await asyncio.sleep(frequency) + + async def start_meilisearch(): """ Starts the MeiliSearch server, wait for it. |