summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--py/chat.py2
-rw-r--r--py/complete.py2
-rw-r--r--py/config.py66
-rw-r--r--py/utils.py24
4 files changed, 48 insertions, 46 deletions
diff --git a/py/chat.py b/py/chat.py
index 7cda7c0..9dd4d4e 100644
--- a/py/chat.py
+++ b/py/chat.py
@@ -4,7 +4,7 @@ import vim
plugin_root = vim.eval("s:plugin_root")
vim.command(f"py3file {plugin_root}/py/utils.py")
-prompt = make_prompt(vim.eval("l:prompt"), vim.eval("l:role_prompt"))
+prompt = vim.eval("l:prompt")
config = make_config(vim.eval("l:config"))
config_options = config['options']
config_ui = config['ui']
diff --git a/py/complete.py b/py/complete.py
index 9b63b0b..a7b9569 100644
--- a/py/complete.py
+++ b/py/complete.py
@@ -4,7 +4,7 @@ import vim
plugin_root = vim.eval("s:plugin_root")
vim.command(f"py3file {plugin_root}/py/utils.py")
-prompt = make_prompt(vim.eval("l:prompt"), vim.eval("l:role_prompt"))
+prompt = vim.eval("l:prompt")
config = make_config(vim.eval("l:config"))
config_options = config['options']
config_ui = config['ui']
diff --git a/py/config.py b/py/config.py
index 03eb3ca..7739b27 100644
--- a/py/config.py
+++ b/py/config.py
@@ -3,6 +3,9 @@ import re
import os
import configparser
+def unwrap(input_var):
+ return vim.eval(input_var)
+
def merge_deep_recursive(target, source = {}):
source = source.copy()
for key, value in source.items():
@@ -74,32 +77,55 @@ def parse_role_names(prompt):
roles.append(chunk)
return [raw_role[1:] for raw_role in roles]
-def parse_prompt_and_role_config(instruction, command_type):
- instruction = instruction.strip()
- roles = parse_role_names(instruction)
+def parse_prompt_and_role_config(user_instruction, command_type):
+ user_instruction = user_instruction.strip()
+ roles = parse_role_names(user_instruction)
if not roles:
# does not require role
- return ('', {})
+ return (user_instruction, '', {})
last_role = roles[-1]
+ user_prompt = user_instruction[user_instruction.index(last_role) + len(last_role):].strip() # strip roles
+
role_configs = merge_deep([load_role_config(role) for role in roles])
config = merge_deep([role_configs['config_default'], role_configs['config_' + command_type]])
role_prompt = role_configs['role'].get('prompt', '')
- return role_prompt, config
-
-def make_config(input_var, output_var):
- input_options = vim.eval(input_var)
- config_default = input_options['config_default']
- config_extension = input_options['config_extension']
- instruction = input_options['instruction']
- command_type = input_options['command_type']
-
- role_prompt, role_config = parse_prompt_and_role_config(instruction, command_type)
-
+ return user_prompt, role_prompt, config
+
+def make_selection_prompt(user_selection, user_prompt, role_prompt, selection_boundary):
+ if not user_prompt and not role_prompt:
+ return user_selection
+ elif user_selection:
+ if selection_boundary and selection_boundary not in user_selection:
+ return f"{selection_boundary}\n{user_selection}\n{selection_boundary}"
+ else:
+ return user_selection
+ return ''
+
+def make_prompt(role_prompt, user_prompt, user_selection, selection_boundary):
+ user_prompt = user_prompt.strip()
+ delimiter = ":\n" if user_prompt and user_selection else ""
+ user_selection = make_selection_prompt(user_selection, user_prompt, role_prompt, selection_boundary)
+ prompt = f"{user_prompt}{delimiter}{user_selection}"
+ if not role_prompt:
+ return prompt
+ delimiter = '' if prompt.startswith(':') else ':\n'
+ prompt = f"{role_prompt}{delimiter}{prompt}"
+ return prompt
+
+def make_config_and_prompt(params):
+ config_default = params['config_default']
+ config_extension = params['config_extension']
+ user_instruction = params['user_instruction']
+ user_selection = params['user_selection']
+ command_type = params['command_type']
+
+ user_prompt, role_prompt, role_config = parse_prompt_and_role_config(user_instruction, command_type)
final_config = merge_deep([config_default, config_extension, role_config])
+ selection_boundary = final_config['options']['selection_boundary']
+ prompt = make_prompt(role_prompt, user_prompt, user_selection, selection_boundary)
- output = {}
- output['config'] = final_config
- output['role_prompt'] = role_prompt
- vim.command(f'let {output_var}={output}')
- return output
+ return {
+ 'config': final_config,
+ 'prompt': prompt,
+ }
diff --git a/py/utils.py b/py/utils.py
index fc888ab..ae32bc2 100644
--- a/py/utils.py
+++ b/py/utils.py
@@ -44,30 +44,6 @@ def load_api_key(config_token_file_path):
return (api_key, org_id)
-def strip_roles(prompt):
- chunks = re.split(r'[ :]+', prompt)
- roles = []
- for chunk in chunks:
- if not chunk.startswith("/"):
- break
- roles.append(chunk)
- if not roles:
- return prompt
- last_role = roles[-1]
- return prompt[prompt.index(last_role) + len(last_role):].strip()
-
-def make_prompt(raw_prompt, role_prompt):
- prompt = raw_prompt.strip()
- prompt = strip_roles(prompt)
-
- if not role_prompt:
- return prompt
-
- delim = '' if prompt.startswith(':') else ':\n'
- prompt = role_prompt + delim + prompt
-
- return prompt
-
def make_config(config):
options = config['options']
# initial prompt can be both a string and a list of strings, normalize it to list