diff options
Diffstat (limited to 'continuedev')
-rw-r--r-- | continuedev/src/continuedev/core/autopilot.py | 4 | ||||
-rw-r--r-- | continuedev/src/continuedev/libs/util/edit_config.py | 19 | ||||
-rw-r--r-- | continuedev/src/continuedev/plugins/steps/core/core.py | 49 | ||||
-rw-r--r-- | continuedev/src/continuedev/plugins/steps/setup_model.py | 11 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/gui.py | 10 |
5 files changed, 61 insertions, 32 deletions
diff --git a/continuedev/src/continuedev/core/autopilot.py b/continuedev/src/continuedev/core/autopilot.py index 5f17b4d2..cee7a2f9 100644 --- a/continuedev/src/continuedev/core/autopilot.py +++ b/continuedev/src/continuedev/core/autopilot.py @@ -464,7 +464,9 @@ class Autopilot(ContinueBaseModel): # Update its description async def update_description(): - step.description = await step.describe(self.continue_sdk.models) + description = await step.describe(self.continue_sdk.models) + if description is not None: + step.description = description # Update subscribers with new description await self.update_subscribers() diff --git a/continuedev/src/continuedev/libs/util/edit_config.py b/continuedev/src/continuedev/libs/util/edit_config.py index 7c8ee76f..f4285bc9 100644 --- a/continuedev/src/continuedev/libs/util/edit_config.py +++ b/continuedev/src/continuedev/libs/util/edit_config.py @@ -79,6 +79,8 @@ filtered_attrs = { "llm", } +filtered_attrs_when_new = {"timeout", "prompt_templates"} + def escape_string(string: str) -> str: return string.replace('"', '\\"').replace("'", "\\'") @@ -90,20 +92,27 @@ def display_val(v: Any): return str(v) -def display_llm_class(llm): - args = ", ".join( +def display_llm_class(llm, new: bool = False): + sep = ",\n\t\t\t" + args = sep.join( [ f"{k}={display_val(v)}" for k, v in llm.dict().items() if k not in filtered_attrs and v is not None ] ) - return f"{llm.__class__.__name__}({args})" + return f"{llm.__class__.__name__}(\n\t\t\t{args}\n\t\t)" -def create_obj_node(class_name: str, args: Dict[str, str]) -> redbaron.RedBaron: +def create_obj_node( + class_name: str, args: Dict[str, str], tabs: int = 1 +) -> redbaron.RedBaron: args = [f"{key}={value}" for key, value in args.items()] - return redbaron.RedBaron(f"{class_name}({', '.join(args)})")[0] + t = "\t" * tabs + new_line = "\n\t" + t + sep = "," + new_line + + return redbaron.RedBaron(f"{class_name}({new_line}{sep.join(args)}\n{t})")[0] def create_string_node(string: str) -> redbaron.RedBaron: diff --git a/continuedev/src/continuedev/plugins/steps/core/core.py b/continuedev/src/continuedev/plugins/steps/core/core.py index 7766a887..97235e6f 100644 --- a/continuedev/src/continuedev/plugins/steps/core/core.py +++ b/continuedev/src/continuedev/plugins/steps/core/core.py @@ -183,33 +183,15 @@ class DefaultModelEditCodeStep(Step): summary_prompt: str = "Please give brief a description of the changes made above using markdown bullet points. Be concise:" async def describe(self, models: Models) -> Coroutine[str, None, None]: - if self._previous_contents.strip() == self._new_contents.strip(): - description = "No edits were made" - else: - changes = "\n".join( - difflib.ndiff( - self._previous_contents.splitlines(), - self._new_contents.splitlines(), - ) - ) - description = await models.medium.complete( - dedent( - f"""\ - Diff summary: "{self.user_input}" - - ```diff - {changes} - ``` - - {self.summary_prompt}""" - ) - ) name = await models.medium.complete( f"Write a very short title to describe this requested change (no quotes): '{self.user_input}'. This is the title:" ) self.name = remove_quotes_and_escapes(name) - return f"{remove_quotes_and_escapes(description)}" + if self._previous_contents.strip() == self._new_contents.strip(): + return "No edits were made" + else: + return None async def get_prompt_parts( self, rif: RangeInFileWithContents, sdk: ContinueSDK, full_file_contents: str @@ -821,6 +803,29 @@ Please output the code to be inserted at the cursor in order to fulfill the user self.name = "Generating summary" + changes = "\n".join( + difflib.ndiff( + self._previous_contents.splitlines(), + self._new_contents.splitlines(), + ) + ) + + self.description = "" + async for chunk in sdk.models.medium.stream_complete( + dedent( + f"""\ + Diff summary: "{self.user_input}" + + ```diff + {changes} + ``` + + {self.summary_prompt}""" + ) + ): + self.description += chunk + await sdk.update_ui() + class EditFileStep(Step): filepath: str diff --git a/continuedev/src/continuedev/plugins/steps/setup_model.py b/continuedev/src/continuedev/plugins/steps/setup_model.py index 2e1fdc14..3dae39c2 100644 --- a/continuedev/src/continuedev/plugins/steps/setup_model.py +++ b/continuedev/src/continuedev/plugins/steps/setup_model.py @@ -1,6 +1,8 @@ from ...core.main import Step from ...core.sdk import ContinueSDK from ...libs.util.paths import getConfigFilePath +from ...models.filesystem import RangeInFile +from ...models.main import Range MODEL_CLASS_TO_MESSAGE = { "OpenAI": "Obtain your OpenAI API key from [here](https://platform.openai.com/account/api-keys) and paste it into the `api_key` field at config.models.default.api_key in `config.py`. Then reload the VS Code window for changes to take effect.", @@ -23,3 +25,12 @@ class SetupModelStep(Step): self.description = MODEL_CLASS_TO_MESSAGE.get( self.model_class, "Please finish setting up this model in `config.py`" ) + + config_contents = await sdk.ide.readFile(getConfigFilePath()) + start = config_contents.find("default=") + len("default=") + end = config_contents.find("unused=") - 1 + range = Range.from_indices(config_contents, start, end) + range.end.line -= 1 + await sdk.ide.highlightCode( + RangeInFile(filepath=getConfigFilePath(), range=range) + ) diff --git a/continuedev/src/continuedev/server/gui.py b/continuedev/src/continuedev/server/gui.py index 49541b76..770065ac 100644 --- a/continuedev/src/continuedev/server/gui.py +++ b/continuedev/src/continuedev/server/gui.py @@ -221,6 +221,7 @@ class GUIProtocolServer: ), self.on_error, ) + posthog_logger.capture_event("set_system_message", {"system_message": message}) def set_temperature(self, temperature: float): self.session.autopilot.continue_sdk.config.temperature = temperature @@ -230,6 +231,7 @@ class GUIProtocolServer: ), self.on_error, ) + posthog_logger.capture_event("set_temperature", {"temperature": temperature}) def set_model_for_role_from_index(self, role: str, index: int): async def async_stuff(): @@ -242,7 +244,7 @@ class GUIProtocolServer: await self.session.autopilot.continue_sdk.start_model(models.default) # Set models in config.py - JOINER = ", " + JOINER = ",\n\t\t" models_args = { "unused": f"[{JOINER.join([display_llm_class(llm) for llm in models.unused])}]", ("default" if role == "*" else role): display_llm_class(models.default), @@ -285,9 +287,9 @@ class GUIProtocolServer: if val is None: continue # no pun intended - models_args[role] = display_llm_class(val) + models_args[role] = display_llm_class(val, True) - JOINER = ", " + JOINER = ",\n\t\t" models_args[ "unused" ] = f"[{JOINER.join([display_llm_class(llm) for llm in unused_models])}]" @@ -346,7 +348,7 @@ async def websocket_endpoint( while AppStatus.should_exit is False: message = await websocket.receive_text() logger.debug(f"Received GUI message {message}") - if type(message) is str: + if isinstance(message, str): message = json.loads(message) if "messageType" not in message or "data" not in message: |