mirror of
https://github.com/khoaliber/khoj.git
synced 2026-03-02 21:19:12 +00:00
171 lines
7.5 KiB
Python
171 lines
7.5 KiB
Python
# Standard Packages
|
|
import os
|
|
import json
|
|
from datetime import datetime
|
|
|
|
# External Packages
|
|
import openai
|
|
|
|
# Internal Packages
|
|
from src.utils.constants import empty_escape_sequences
|
|
|
|
|
|
def summarize(text, summary_type, user_query=None, api_key=None, temperature=0.5, max_tokens=100):
|
|
"""
|
|
Summarize user input using OpenAI's GPT
|
|
"""
|
|
# Initialize Variables
|
|
openai.api_key = api_key or os.getenv("OPENAI_API_KEY")
|
|
|
|
# Setup Prompt based on Summary Type
|
|
if summary_type == "chat":
|
|
prompt = f"You are an AI. Summarize the conversation below from your perspective:\n\n{text}\n\nSummarize the conversation from the AI's first-person perspective:"
|
|
elif summary_type == "notes":
|
|
prompt = f"Summarize the below notes about {user_query}:\n\n{text}\n\nSummarize the notes in second person perspective and use past tense:"
|
|
|
|
# Get Response from GPT
|
|
response = openai.Completion.create(
|
|
engine="davinci-instruct-beta-v3",
|
|
prompt=prompt,
|
|
temperature=temperature,
|
|
max_tokens=max_tokens,
|
|
top_p=1,
|
|
frequency_penalty=0.2,
|
|
presence_penalty=0,
|
|
stop="\"\"\"")
|
|
|
|
# Extract, Clean Message from GPT's Response
|
|
story = response['choices'][0]['text']
|
|
return str(story).replace("\n\n", "")
|
|
|
|
|
|
def understand(text, api_key=None, temperature=0.5, max_tokens=100, verbose=0):
|
|
"""
|
|
Understand user input using OpenAI's GPT
|
|
"""
|
|
# Initialize Variables
|
|
openai.api_key = api_key or os.getenv("OPENAI_API_KEY")
|
|
understand_primer = '''
|
|
Objective: Extract intent and trigger emotion information as JSON from each chat message
|
|
|
|
Potential intent types and valid argument values are listed below:
|
|
- intent
|
|
- remember(memory-type, query);
|
|
- memory-type=["companion","notes","ledger","image","music"]
|
|
- search(search-type, query);
|
|
- search-type=["google"]
|
|
- generate(activity, query);
|
|
- activity=["paint","write","chat"]
|
|
- trigger-emotion(emotion)
|
|
- emotion=["happy","confidence","fear","surprise","sadness","disgust","anger","shy","curiosity","calm"]
|
|
|
|
Some examples are given below for reference:
|
|
Q: How are you doing?
|
|
A: { "intent": {"type": "generate", "activity": "chat", "query": "How are you doing?"}, "trigger-emotion": "happy" }
|
|
Q: Do you remember what I told you about my brother Antoine when we were at the beach?
|
|
A: { "intent": {"type": "remember", "memory-type": "companion", "query": "Brother Antoine when we were at the beach"}, "trigger-emotion": "curiosity" }
|
|
Q: what was that fantasy story you told me last time?
|
|
A: { "intent": {"type": "remember", "memory-type": "companion", "query": "fantasy story told last time"}, "trigger-emotion": "curiosity" }
|
|
Q: Let's make some drawings about the stars on a clear full moon night!
|
|
A: { "intent": {"type": "generate", "activity": "paint", "query": "stars on a clear full moon night"}, "trigger-emotion: "happy" }
|
|
Q: Do you know anything about Lebanon cuisine in the 18th century?
|
|
A: { "intent": {"type": "search", "search-type": "google", "query": "lebanon cusine in the 18th century"}, "trigger-emotion; "confidence" }
|
|
Q: Tell me a scary story
|
|
A: { "intent": {"type": "generate", "activity": "write", "query": "A scary story"}, "trigger-emotion": "fear" }
|
|
Q: What fiction book was I reading last week about AI starship?
|
|
A: { "intent": {"type": "remember", "memory-type": "notes", "query": "fiction book about AI starship last week"}, "trigger-emotion": "curiosity" }
|
|
Q: How much did I spend at Subway for dinner last time?
|
|
A: { "intent": {"type": "remember", "memory-type": "ledger", "query": "last Subway dinner"}, "trigger-emotion": "calm" }
|
|
Q: I'm feeling sleepy
|
|
A: { "intent": {"type": "generate", "activity": "chat", "query": "I'm feeling sleepy"}, "trigger-emotion": "calm" }
|
|
Q: What was that popular Sri lankan song that Alex had mentioned?
|
|
A: { "intent": {"type": "remember", "memory-type": "music", "query": "popular Sri lankan song mentioned by Alex"}, "trigger-emotion": "curiosity" }
|
|
Q: You're pretty funny!
|
|
A: { "intent": {"type": "generate", "activity": "chat", "query": "You're pretty funny!"}, "trigger-emotion": "shy" }
|
|
Q: Can you recommend a movie to watch from my notes?
|
|
A: { "intent": {"type": "remember", "memory-type": "notes", "query": "recommend movie to watch"}, "trigger-emotion": "curiosity" }
|
|
Q: When did I go surfing last?
|
|
A: { "intent": {"type": "remember", "memory-type": "notes", "query": "When did I go surfing last"}, "trigger-emotion": "calm" }
|
|
Q: Can you dance for me?
|
|
A: { "intent": {"type": "generate", "activity": "chat", "query": "Can you dance for me?"}, "trigger-emotion": "sad" }'''
|
|
|
|
# Setup Prompt with Understand Primer
|
|
prompt = message_to_prompt(text, understand_primer, start_sequence="\nA:", restart_sequence="\nQ:")
|
|
if verbose > 1:
|
|
print(f"Message -> Prompt: {text} -> {prompt}")
|
|
|
|
# Get Response from GPT
|
|
response = openai.Completion.create(
|
|
engine="davinci",
|
|
prompt=prompt,
|
|
temperature=temperature,
|
|
max_tokens=max_tokens,
|
|
top_p=1,
|
|
frequency_penalty=0.2,
|
|
presence_penalty=0,
|
|
stop=["\n"])
|
|
|
|
# Extract, Clean Message from GPT's Response
|
|
story = str(response['choices'][0]['text'])
|
|
return json.loads(story.strip(empty_escape_sequences))
|
|
|
|
|
|
def converse(text, conversation_history=None, api_key=None, temperature=0.9, max_tokens=150):
|
|
"""
|
|
Converse with user using OpenAI's GPT
|
|
"""
|
|
# Initialize Variables
|
|
openai.api_key = api_key or os.getenv("OPENAI_API_KEY")
|
|
|
|
ai_prompt = "AI:"
|
|
human_prompt = "Human:"
|
|
conversation_primer = f'''
|
|
The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and a very friendly companion.
|
|
|
|
{human_prompt} Hello, who are you?
|
|
{ai_prompt} Hi, I am an AI conversational companion created by OpenAI. How can I help you today?'''
|
|
|
|
# Setup Prompt with Primer or Conversation History
|
|
prompt = message_to_prompt(text, conversation_history or conversation_primer, start_sequence=ai_prompt, restart_sequence=human_prompt)
|
|
|
|
# Get Response from GPT
|
|
response = openai.Completion.create(
|
|
engine="davinci",
|
|
prompt=prompt,
|
|
temperature=temperature,
|
|
max_tokens=max_tokens,
|
|
top_p=1,
|
|
frequency_penalty=0,
|
|
presence_penalty=0.6,
|
|
stop=["\n", "Human:", "AI:"])
|
|
|
|
# Extract, Clean Message from GPT's Response
|
|
story = str(response['choices'][0]['text'])
|
|
return story.strip(empty_escape_sequences)
|
|
|
|
|
|
def message_to_prompt(user_message, conversation_history="", gpt_message=None, start_sequence="\nAI:", restart_sequence="\nHuman:"):
|
|
"""Create prompt for GPT from messages and conversation history"""
|
|
gpt_message = f" {gpt_message}" if gpt_message else ""
|
|
|
|
return f"{conversation_history}{restart_sequence} {user_message}{start_sequence}{gpt_message}"
|
|
|
|
|
|
def message_to_log(user_message, user_message_metadata, gpt_message, conversation_log=[]):
|
|
"""Create json logs from messages, metadata for conversation log"""
|
|
# Create json log from Human's message
|
|
human_log = user_message_metadata
|
|
human_log["message"] = user_message
|
|
human_log["by"] = "Human"
|
|
human_log["created"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
# Create json log from GPT's response
|
|
ai_log = {"message": gpt_message, "by": "AI", "created": datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
|
|
|
|
conversation_log.extend([human_log, ai_log])
|
|
return conversation_log
|
|
|
|
def extract_summaries(metadata):
|
|
"""Extract summaries from metadata"""
|
|
return ''.join(
|
|
[f'\n{session["summary"]}' for session in metadata]) |