summaryrefslogtreecommitdiff
path: root/continuedev
diff options
context:
space:
mode:
Diffstat (limited to 'continuedev')
-rw-r--r--continuedev/src/continuedev/libs/constants/default_config.py6
-rw-r--r--continuedev/src/continuedev/plugins/context_providers/url.py75
2 files changed, 51 insertions, 30 deletions
diff --git a/continuedev/src/continuedev/libs/constants/default_config.py b/continuedev/src/continuedev/libs/constants/default_config.py
index e2b033b7..fc696dfc 100644
--- a/continuedev/src/continuedev/libs/constants/default_config.py
+++ b/continuedev/src/continuedev/libs/constants/default_config.py
@@ -132,7 +132,11 @@ config = ContinueConfig(
# )
SearchContextProvider(),
DiffContextProvider(),
- URLContextProvider()
+ URLContextProvider(
+ commonly_referenced_urls = [
+ # Add any common urls you reference here so they appear in auto complete
+ ]
+ )
],
# Policies hold the main logic that decides which Step to take next
diff --git a/continuedev/src/continuedev/plugins/context_providers/url.py b/continuedev/src/continuedev/plugins/context_providers/url.py
index 32c1d69c..1fc2c38f 100644
--- a/continuedev/src/continuedev/plugins/context_providers/url.py
+++ b/continuedev/src/continuedev/plugins/context_providers/url.py
@@ -1,3 +1,4 @@
+
from typing import List, Optional
from .util import remove_meilisearch_disallowed_chars
@@ -8,37 +9,46 @@ from ...core.context import ContextProvider
class URLContextProvider(ContextProvider):
title = "url"
- url: Optional[str] = None
- display_name: Optional[str] = None
- URL_CONTEXT_ITEM_ID = "url"
-
- @property
- def optional_url_item_id(self) -> str:
- return remove_meilisearch_disallowed_chars(self.url)
-
- @property
- def optional_url_item(self) -> ContextItem:
- cp = self.BASE_CONTEXT_ITEM.copy()
- if self.display_name:
- cp.description.name = self.display_name
- cp.description.description = f"Contents of {self.url}"
- cp.description.id.item_id = self.optional_url_item_id
-
- return cp
+ # Allows users to provide a list of urls that will
+ commonly_referenced_urls: List[str] = []
+
+ # There is only a single dynamic url context item, so it has a static id
+ DYNAMIC_URL_CONTEXT_ITEM_ID = "url"
+ # This is a template dynamic item that will generate context item on demand
+ # when get item is called
@property
- def BASE_CONTEXT_ITEM(self):
+ def DYNAMIC_CONTEXT_ITEM(self):
return ContextItem(
content="",
description=ContextItemDescription(
- name="URL",
+ name="Dynamic URL",
description="Reference the contents of a webpage (e.g. '@url https://www.w3schools.com/python/python_ref_functions.asp')",
id=ContextItemId(
provider_title=self.title,
- item_id=self.URL_CONTEXT_ITEM_ID
+ item_id=self.DYNAMIC_URL_CONTEXT_ITEM_ID
)
)
)
+
+ # These are staticaly configured items, they will be regenerated
+ # each time they are accessed
+ @property
+ def static_url_context_items_from_config(self) -> List[ContextItem]:
+ return [
+ ContextItem(
+ content=self._get_url_text_contents(url),
+ description=ContextItemDescription(
+ name="Static URL",
+ description=f"Contents of {url}",
+ id=ContextItemId(
+ provider_title=self.title,
+ item_id=remove_meilisearch_disallowed_chars(url)
+ )
+ )
+ )
+ for url in self.commonly_referenced_urls
+ ]
def _get_url_text_contents(self, url: str):
from bs4 import BeautifulSoup
@@ -49,25 +59,32 @@ class URLContextProvider(ContextProvider):
return soup.get_text()
async def provide_context_items(self, workspace_dir: str) -> List[ContextItem]:
- items = [self.BASE_CONTEXT_ITEM]
- if self.url:
- items.append(self.optional_url_item)
+ items = [self.DYNAMIC_CONTEXT_ITEM]
+ items.extend(self.static_url_context_items_from_config)
return items
async def get_item(self, id: ContextItemId, query: str) -> ContextItem:
- if id.item_id == self.optional_url_item_id:
- item = self.optional_url_item
- item.content = self._get_url_text_contents(self.url)
- return item
+ static_items = self.static_url_context_items_from_config
+
+ # Check if the item is a static item
+ matching_static_item = next((item for item in static_items if item.description.id.item_id == id.item_id), None)
+ if matching_static_item:
+ matching_static_item.description.name = url.replace(
+ "https://", "").replace("http://", "")
+ return matching_static_item
- if not id.item_id == self.URL_CONTEXT_ITEM_ID:
+ # Check if the item is the dynamic item
+ if not id.item_id == self.DYNAMIC_URL_CONTEXT_ITEM_ID:
raise Exception("Invalid item id")
+ # Generate the dynamic item
url = query.lstrip("url ").strip()
+ if url is None or url == "":
+ return None
content = self._get_url_text_contents(url)
- ctx_item = self.BASE_CONTEXT_ITEM.copy()
+ ctx_item = self.DYNAMIC_CONTEXT_ITEM.copy()
ctx_item.content = content
ctx_item.description.name = url.replace(
"https://", "").replace("http://", "")