mirror of
https://github.com/khoaliber/khoj.git
synced 2026-03-09 21:29:11 +00:00
Support webpage command in chat API
- Fallback to use webpage when SERPER not setup and online command was attempted - Do not stop responding if can't retrieve online results. Try to respond without the online context
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Optional
|
from typing import Dict, Optional
|
||||||
|
|
||||||
from langchain.schema import ChatMessage
|
from langchain.schema import ChatMessage
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ def send_message_to_model(messages, api_key, model, response_type="text"):
|
|||||||
def converse(
|
def converse(
|
||||||
references,
|
references,
|
||||||
user_query,
|
user_query,
|
||||||
online_results: Optional[dict] = None,
|
online_results: Optional[Dict[str, Dict]] = None,
|
||||||
conversation_log={},
|
conversation_log={},
|
||||||
model: str = "gpt-3.5-turbo",
|
model: str = "gpt-3.5-turbo",
|
||||||
api_key: Optional[str] = None,
|
api_key: Optional[str] = None,
|
||||||
@@ -141,7 +141,7 @@ def converse(
|
|||||||
completion_func(chat_response=prompts.no_online_results_found.format())
|
completion_func(chat_response=prompts.no_online_results_found.format())
|
||||||
return iter([prompts.no_online_results_found.format()])
|
return iter([prompts.no_online_results_found.format()])
|
||||||
|
|
||||||
if ConversationCommand.Online in conversation_commands:
|
if ConversationCommand.Online in conversation_commands or ConversationCommand.Webpage in conversation_commands:
|
||||||
conversation_primer = (
|
conversation_primer = (
|
||||||
f"{prompts.online_search_conversation.format(online_results=str(online_results))}\n{conversation_primer}"
|
f"{prompts.online_search_conversation.format(online_results=str(online_results))}\n{conversation_primer}"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -14,7 +14,11 @@ from khoj.database.adapters import ConversationAdapters, EntryAdapters, aget_use
|
|||||||
from khoj.database.models import KhojUser
|
from khoj.database.models import KhojUser
|
||||||
from khoj.processor.conversation.prompts import help_message, no_entries_found
|
from khoj.processor.conversation.prompts import help_message, no_entries_found
|
||||||
from khoj.processor.conversation.utils import save_to_conversation_log
|
from khoj.processor.conversation.utils import save_to_conversation_log
|
||||||
from khoj.processor.tools.online_search import search_online
|
from khoj.processor.tools.online_search import (
|
||||||
|
online_search_enabled,
|
||||||
|
read_webpages,
|
||||||
|
search_online,
|
||||||
|
)
|
||||||
from khoj.routers.api import extract_references_and_questions
|
from khoj.routers.api import extract_references_and_questions
|
||||||
from khoj.routers.helpers import (
|
from khoj.routers.helpers import (
|
||||||
ApiUserRateLimiter,
|
ApiUserRateLimiter,
|
||||||
@@ -274,7 +278,7 @@ async def chat(
|
|||||||
compiled_references, inferred_queries, defiltered_query = await extract_references_and_questions(
|
compiled_references, inferred_queries, defiltered_query = await extract_references_and_questions(
|
||||||
request, common, meta_log, q, (n or 5), (d or math.inf), conversation_commands, location
|
request, common, meta_log, q, (n or 5), (d or math.inf), conversation_commands, location
|
||||||
)
|
)
|
||||||
online_results: Dict = dict()
|
online_results: Dict[str, Dict] = {}
|
||||||
|
|
||||||
if conversation_commands == [ConversationCommand.Notes] and not await EntryAdapters.auser_has_entries(user):
|
if conversation_commands == [ConversationCommand.Notes] and not await EntryAdapters.auser_has_entries(user):
|
||||||
no_entries_found_format = no_entries_found.format()
|
no_entries_found_format = no_entries_found.format()
|
||||||
@@ -288,13 +292,23 @@ async def chat(
|
|||||||
conversation_commands.remove(ConversationCommand.Notes)
|
conversation_commands.remove(ConversationCommand.Notes)
|
||||||
|
|
||||||
if ConversationCommand.Online in conversation_commands:
|
if ConversationCommand.Online in conversation_commands:
|
||||||
|
if not online_search_enabled():
|
||||||
|
conversation_commands.remove(ConversationCommand.Online)
|
||||||
|
# If online search is not enabled, try to read webpages directly
|
||||||
|
if ConversationCommand.Webpage not in conversation_commands:
|
||||||
|
conversation_commands.append(ConversationCommand.Webpage)
|
||||||
|
else:
|
||||||
try:
|
try:
|
||||||
online_results = await search_online(defiltered_query, meta_log, location)
|
online_results = await search_online(defiltered_query, meta_log, location)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
return StreamingResponse(
|
logger.warning(f"Error searching online: {e}. Attempting to respond without online results")
|
||||||
iter(["Please set your SERPER_DEV_API_KEY to get started with online searches 🌐"]),
|
|
||||||
media_type="text/event-stream",
|
if ConversationCommand.Webpage in conversation_commands:
|
||||||
status_code=200,
|
try:
|
||||||
|
online_results = await read_webpages(defiltered_query, meta_log, location)
|
||||||
|
except ValueError as e:
|
||||||
|
logger.warning(
|
||||||
|
f"Error directly reading webpages: {e}. Attempting to respond without online results", exc_info=True
|
||||||
)
|
)
|
||||||
|
|
||||||
if ConversationCommand.Image in conversation_commands:
|
if ConversationCommand.Image in conversation_commands:
|
||||||
|
|||||||
@@ -395,7 +395,7 @@ def generate_chat_response(
|
|||||||
q: str,
|
q: str,
|
||||||
meta_log: dict,
|
meta_log: dict,
|
||||||
compiled_references: List[str] = [],
|
compiled_references: List[str] = [],
|
||||||
online_results: Dict[str, Any] = {},
|
online_results: Dict[str, Dict] = {},
|
||||||
inferred_queries: List[str] = [],
|
inferred_queries: List[str] = [],
|
||||||
conversation_commands: List[ConversationCommand] = [ConversationCommand.Default],
|
conversation_commands: List[ConversationCommand] = [ConversationCommand.Default],
|
||||||
user: KhojUser = None,
|
user: KhojUser = None,
|
||||||
|
|||||||
Reference in New Issue
Block a user