mirror of
https://github.com/khoaliber/khoj.git
synced 2026-03-02 13:18:18 +00:00
Drop help, summarize and automation /slash commands from chat api
Clean non useful slash commands to make chat API more maintanable. - App version, chat model via /help is visible in other parts of the UX. Asking help questions with site:docs.khoj.dev filter isn't used or known to folks - /summarize is esoterically tuned. Should be rewritten if add back. It wasn't being used by /research already - Automations can be configured via UX. It wasn't being shown in UX already
This commit is contained in:
@@ -1055,108 +1055,6 @@ async def chat(
|
|||||||
if state.verbose > 1:
|
if state.verbose > 1:
|
||||||
logger.debug(f'Researched Results: {"".join(r.summarizedResult for r in research_results)}')
|
logger.debug(f'Researched Results: {"".join(r.summarizedResult for r in research_results)}')
|
||||||
|
|
||||||
used_slash_summarize = conversation_commands == [ConversationCommand.Summarize]
|
|
||||||
# Skip trying to summarize if
|
|
||||||
if (
|
|
||||||
# summarization intent was inferred
|
|
||||||
ConversationCommand.Summarize in conversation_commands
|
|
||||||
# and not triggered via slash command
|
|
||||||
and not used_slash_summarize
|
|
||||||
# but we can't actually summarize
|
|
||||||
and len(file_filters) == 0
|
|
||||||
):
|
|
||||||
conversation_commands.remove(ConversationCommand.Summarize)
|
|
||||||
elif ConversationCommand.Summarize in conversation_commands:
|
|
||||||
response_log = ""
|
|
||||||
agent_has_entries = await EntryAdapters.aagent_has_entries(agent)
|
|
||||||
if len(file_filters) == 0 and not agent_has_entries:
|
|
||||||
response_log = "No files selected for summarization. Please add files using the section on the left."
|
|
||||||
async for result in send_llm_response(response_log, tracer.get("usage")):
|
|
||||||
yield result
|
|
||||||
else:
|
|
||||||
async for response in generate_summary_from_files(
|
|
||||||
q=q,
|
|
||||||
user=user,
|
|
||||||
file_filters=file_filters,
|
|
||||||
chat_history=conversation.messages,
|
|
||||||
query_images=uploaded_images,
|
|
||||||
agent=agent,
|
|
||||||
send_status_func=partial(send_event, ChatEvent.STATUS),
|
|
||||||
query_files=attached_file_context,
|
|
||||||
tracer=tracer,
|
|
||||||
):
|
|
||||||
if isinstance(response, dict) and ChatEvent.STATUS in response:
|
|
||||||
yield response[ChatEvent.STATUS]
|
|
||||||
else:
|
|
||||||
if isinstance(response, str):
|
|
||||||
response_log = response
|
|
||||||
async for result in send_llm_response(response, tracer.get("usage")):
|
|
||||||
yield result
|
|
||||||
|
|
||||||
summarized_document = FileAttachment(
|
|
||||||
name="Summarized Document",
|
|
||||||
content=response_log,
|
|
||||||
type="text/plain",
|
|
||||||
size=len(response_log.encode("utf-8")),
|
|
||||||
)
|
|
||||||
|
|
||||||
async for result in send_event(ChatEvent.GENERATED_ASSETS, {"files": [summarized_document.model_dump()]}):
|
|
||||||
yield result
|
|
||||||
|
|
||||||
generated_files.append(summarized_document)
|
|
||||||
|
|
||||||
custom_filters = []
|
|
||||||
if conversation_commands == [ConversationCommand.Help]:
|
|
||||||
if not q:
|
|
||||||
chat_model = await ConversationAdapters.aget_user_chat_model(user)
|
|
||||||
if chat_model == None:
|
|
||||||
chat_model = await ConversationAdapters.aget_default_chat_model(user)
|
|
||||||
model_type = chat_model.model_type
|
|
||||||
formatted_help = help_message.format(model=model_type, version=state.khoj_version, device=get_device())
|
|
||||||
async for result in send_llm_response(formatted_help, tracer.get("usage")):
|
|
||||||
yield result
|
|
||||||
return
|
|
||||||
# Adding specification to search online specifically on khoj.dev pages.
|
|
||||||
custom_filters.append("site:khoj.dev")
|
|
||||||
conversation_commands.append(ConversationCommand.Online)
|
|
||||||
|
|
||||||
if ConversationCommand.Automation in conversation_commands:
|
|
||||||
try:
|
|
||||||
automation, crontime, query_to_run, subject = await create_automation(
|
|
||||||
q, timezone, user, request.url, chat_history, tracer=tracer
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error scheduling task {q} for {user.email}: {e}")
|
|
||||||
error_message = f"Unable to create automation. Ensure the automation doesn't already exist."
|
|
||||||
async for result in send_llm_response(error_message, tracer.get("usage")):
|
|
||||||
yield result
|
|
||||||
return
|
|
||||||
|
|
||||||
llm_response = construct_automation_created_message(automation, crontime, query_to_run, subject)
|
|
||||||
# Trigger task to save conversation to DB
|
|
||||||
asyncio.create_task(
|
|
||||||
save_to_conversation_log(
|
|
||||||
q,
|
|
||||||
llm_response,
|
|
||||||
user,
|
|
||||||
chat_history,
|
|
||||||
user_message_time,
|
|
||||||
intent_type="automation",
|
|
||||||
client_application=request.user.client_app,
|
|
||||||
conversation_id=conversation_id,
|
|
||||||
inferred_queries=[query_to_run],
|
|
||||||
automation_id=automation.id,
|
|
||||||
query_images=uploaded_images,
|
|
||||||
train_of_thought=train_of_thought,
|
|
||||||
raw_query_files=raw_query_files,
|
|
||||||
tracer=tracer,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
# Send LLM Response
|
|
||||||
async for result in send_llm_response(llm_response, tracer.get("usage")):
|
|
||||||
yield result
|
|
||||||
return
|
|
||||||
|
|
||||||
# Gather Context
|
# Gather Context
|
||||||
## Extract Document References
|
## Extract Document References
|
||||||
if not ConversationCommand.Research in conversation_commands:
|
if not ConversationCommand.Research in conversation_commands:
|
||||||
@@ -1216,7 +1114,7 @@ async def chat(
|
|||||||
location,
|
location,
|
||||||
user,
|
user,
|
||||||
partial(send_event, ChatEvent.STATUS),
|
partial(send_event, ChatEvent.STATUS),
|
||||||
custom_filters,
|
custom_filters=[],
|
||||||
max_online_searches=3,
|
max_online_searches=3,
|
||||||
query_images=uploaded_images,
|
query_images=uploaded_images,
|
||||||
query_files=attached_file_context,
|
query_files=attached_file_context,
|
||||||
|
|||||||
@@ -249,8 +249,6 @@ def get_next_url(request: Request) -> str:
|
|||||||
def get_conversation_command(query: str) -> ConversationCommand:
|
def get_conversation_command(query: str) -> ConversationCommand:
|
||||||
if query.startswith("/notes"):
|
if query.startswith("/notes"):
|
||||||
return ConversationCommand.Notes
|
return ConversationCommand.Notes
|
||||||
elif query.startswith("/help"):
|
|
||||||
return ConversationCommand.Help
|
|
||||||
elif query.startswith("/general"):
|
elif query.startswith("/general"):
|
||||||
return ConversationCommand.General
|
return ConversationCommand.General
|
||||||
elif query.startswith("/online"):
|
elif query.startswith("/online"):
|
||||||
@@ -261,8 +259,6 @@ def get_conversation_command(query: str) -> ConversationCommand:
|
|||||||
return ConversationCommand.Image
|
return ConversationCommand.Image
|
||||||
elif query.startswith("/automated_task"):
|
elif query.startswith("/automated_task"):
|
||||||
return ConversationCommand.AutomatedTask
|
return ConversationCommand.AutomatedTask
|
||||||
elif query.startswith("/summarize"):
|
|
||||||
return ConversationCommand.Summarize
|
|
||||||
elif query.startswith("/diagram"):
|
elif query.startswith("/diagram"):
|
||||||
return ConversationCommand.Diagram
|
return ConversationCommand.Diagram
|
||||||
elif query.startswith("/code"):
|
elif query.startswith("/code"):
|
||||||
@@ -392,9 +388,6 @@ async def aget_data_sources_and_output_format(
|
|||||||
agent_outputs = agent.output_modes if agent else []
|
agent_outputs = agent.output_modes if agent else []
|
||||||
|
|
||||||
for output, description in mode_descriptions_for_llm.items():
|
for output, description in mode_descriptions_for_llm.items():
|
||||||
# Do not allow tasks to schedule another task
|
|
||||||
if is_task and output == ConversationCommand.Automation:
|
|
||||||
continue
|
|
||||||
output_options[output.value] = description
|
output_options[output.value] = description
|
||||||
if len(agent_outputs) == 0 or output.value in agent_outputs:
|
if len(agent_outputs) == 0 or output.value in agent_outputs:
|
||||||
output_options_str += f'- "{output.value}": "{description}"\n'
|
output_options_str += f'- "{output.value}": "{description}"\n'
|
||||||
|
|||||||
@@ -273,7 +273,6 @@ async def research(
|
|||||||
code_results: Dict = dict()
|
code_results: Dict = dict()
|
||||||
document_results: List[Dict[str, str]] = []
|
document_results: List[Dict[str, str]] = []
|
||||||
operator_results: OperatorRun = None
|
operator_results: OperatorRun = None
|
||||||
summarize_files: str = ""
|
|
||||||
this_iteration = ResearchIteration(tool=None, query=query)
|
this_iteration = ResearchIteration(tool=None, query=query)
|
||||||
|
|
||||||
async for result in apick_next_tool(
|
async for result in apick_next_tool(
|
||||||
@@ -473,40 +472,13 @@ async def research(
|
|||||||
this_iteration.warning = f"Error operating browser: {e}"
|
this_iteration.warning = f"Error operating browser: {e}"
|
||||||
logger.error(this_iteration.warning, exc_info=True)
|
logger.error(this_iteration.warning, exc_info=True)
|
||||||
|
|
||||||
elif this_iteration.tool == ConversationCommand.Summarize:
|
|
||||||
try:
|
|
||||||
async for result in generate_summary_from_files(
|
|
||||||
this_iteration.query,
|
|
||||||
user,
|
|
||||||
file_filters,
|
|
||||||
construct_tool_chat_history(previous_iterations, ConversationCommand.Summarize),
|
|
||||||
query_images=query_images,
|
|
||||||
agent=agent,
|
|
||||||
send_status_func=send_status_func,
|
|
||||||
query_files=query_files,
|
|
||||||
):
|
|
||||||
if isinstance(result, dict) and ChatEvent.STATUS in result:
|
|
||||||
yield result[ChatEvent.STATUS]
|
|
||||||
else:
|
|
||||||
summarize_files = result # type: ignore
|
|
||||||
except Exception as e:
|
|
||||||
this_iteration.warning = f"Error summarizing files: {e}"
|
|
||||||
logger.error(this_iteration.warning, exc_info=True)
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# No valid tools. This is our exit condition.
|
# No valid tools. This is our exit condition.
|
||||||
current_iteration = MAX_ITERATIONS
|
current_iteration = MAX_ITERATIONS
|
||||||
|
|
||||||
current_iteration += 1
|
current_iteration += 1
|
||||||
|
|
||||||
if (
|
if document_results or online_results or code_results or operator_results or this_iteration.warning:
|
||||||
document_results
|
|
||||||
or online_results
|
|
||||||
or code_results
|
|
||||||
or operator_results
|
|
||||||
or summarize_files
|
|
||||||
or this_iteration.warning
|
|
||||||
):
|
|
||||||
results_data = f"\n<iteration>{current_iteration}\n<tool>{this_iteration.tool}</tool>\n<query>{this_iteration.query}</query>\n<results>"
|
results_data = f"\n<iteration>{current_iteration}\n<tool>{this_iteration.tool}</tool>\n<query>{this_iteration.query}</query>\n<results>"
|
||||||
if document_results:
|
if document_results:
|
||||||
results_data += f"\n<document_references>\n{yaml.dump(document_results, allow_unicode=True, sort_keys=False, default_flow_style=False)}\n</document_references>"
|
results_data += f"\n<document_references>\n{yaml.dump(document_results, allow_unicode=True, sort_keys=False, default_flow_style=False)}\n</document_references>"
|
||||||
@@ -518,8 +490,6 @@ async def research(
|
|||||||
results_data += (
|
results_data += (
|
||||||
f"\n<browser_operator_results>\n{operator_results.response}\n</browser_operator_results>"
|
f"\n<browser_operator_results>\n{operator_results.response}\n</browser_operator_results>"
|
||||||
)
|
)
|
||||||
if summarize_files:
|
|
||||||
results_data += f"\n<summarized_files>\n{yaml.dump(summarize_files, allow_unicode=True, sort_keys=False, default_flow_style=False)}\n</summarized_files>"
|
|
||||||
if this_iteration.warning:
|
if this_iteration.warning:
|
||||||
results_data += f"\n<warning>\n{this_iteration.warning}\n</warning>"
|
results_data += f"\n<warning>\n{this_iteration.warning}\n</warning>"
|
||||||
results_data += "\n</results>\n</iteration>"
|
results_data += "\n</results>\n</iteration>"
|
||||||
|
|||||||
@@ -338,15 +338,12 @@ class ConversationCommand(str, Enum):
|
|||||||
Default = "default"
|
Default = "default"
|
||||||
General = "general"
|
General = "general"
|
||||||
Notes = "notes"
|
Notes = "notes"
|
||||||
Help = "help"
|
|
||||||
Online = "online"
|
Online = "online"
|
||||||
Webpage = "webpage"
|
Webpage = "webpage"
|
||||||
Code = "code"
|
Code = "code"
|
||||||
Image = "image"
|
Image = "image"
|
||||||
Text = "text"
|
Text = "text"
|
||||||
Automation = "automation"
|
|
||||||
AutomatedTask = "automated_task"
|
AutomatedTask = "automated_task"
|
||||||
Summarize = "summarize"
|
|
||||||
Diagram = "diagram"
|
Diagram = "diagram"
|
||||||
Research = "research"
|
Research = "research"
|
||||||
Operator = "operator"
|
Operator = "operator"
|
||||||
@@ -360,9 +357,6 @@ command_descriptions = {
|
|||||||
ConversationCommand.Webpage: "Get information from webpage suggested by you.",
|
ConversationCommand.Webpage: "Get information from webpage suggested by you.",
|
||||||
ConversationCommand.Code: "Run Python code to parse information, run complex calculations, create documents and charts.",
|
ConversationCommand.Code: "Run Python code to parse information, run complex calculations, create documents and charts.",
|
||||||
ConversationCommand.Image: "Generate illustrative, creative images by describing your imagination in words.",
|
ConversationCommand.Image: "Generate illustrative, creative images by describing your imagination in words.",
|
||||||
ConversationCommand.Automation: "Automatically run your query at a specified time or interval.",
|
|
||||||
ConversationCommand.Help: "Get help with how to use or setup Khoj from the documentation",
|
|
||||||
ConversationCommand.Summarize: "Get help with a question pertaining to an entire document.",
|
|
||||||
ConversationCommand.Diagram: "Draw a flowchart, diagram, or any other visual representation best expressed with primitives like lines, rectangles, and text.",
|
ConversationCommand.Diagram: "Draw a flowchart, diagram, or any other visual representation best expressed with primitives like lines, rectangles, and text.",
|
||||||
ConversationCommand.Research: "Do deep research on a topic. This will take longer than usual, but give a more detailed, comprehensive answer.",
|
ConversationCommand.Research: "Do deep research on a topic. This will take longer than usual, but give a more detailed, comprehensive answer.",
|
||||||
ConversationCommand.Operator: "Operate and perform tasks using a computer.",
|
ConversationCommand.Operator: "Operate and perform tasks using a computer.",
|
||||||
|
|||||||
Reference in New Issue
Block a user