subashpoudel's picture
Refined chatbot
6f57d05
import requests
from langchain_core.messages import SystemMessage , HumanMessage , FunctionMessage
from .state import State
from .schemas import ResponseFormatter , InfluencerNames
from .prompts import chatbot_prompt , get_inf_name_prompt
from .utils import generate_api_knowledge
from src.genai.utils.models_loader import llm_gpt
class ChatbotNode:
def __init__(self):
self.llm = llm_gpt
def run(self, state:State):
print('Message:',state['messages'])
# state['messages'][-1].content = process_query(state['messages'][-1].content)
template = chatbot_prompt()
knowledge_base = generate_api_knowledge('https://reveltrends.vercel.app')
messages = [SystemMessage(content=template),
FunctionMessage(name='analytics_chatbot',content=str(knowledge_base)),
] + state["messages"]
if len(state['messages'])>11:
state["messages"] = state["messages"][-9:]
print('Messages:', state['messages'])
print(len(state['messages']))
result = self.llm.with_structured_output(ResponseFormatter, method='function_calling').invoke(messages)
print('The result is:',result)
return {
"messages": [{"role": "assistant", "content": f'''The endpoint is: {result.endpoint}. The parameters are: {result.parameters}'''}],
"endpoint": result.endpoint,
"method": result.method,
"parameters": result.parameters,
}
class FetchDataNode:
def __init__(self):
self.llm = llm_gpt
self.base_url = 'https://reveltrends.vercel.app'
self.headers = {
"Authorization": "Bearer YOUR_API_KEY", # replace with your API key if needed
"Content-Type": "application/json"
}
def run(self, state:State):
print('Entered to fetch data')
url = f'''{self.base_url}{state['endpoint']}'''
if state['method'] == 'GET':
response = requests.get(url, params=state['parameters'],headers=self.headers)
elif state['endpoint'] == '/api/v1/compare/':
print('Condition satisfied')
messages = [SystemMessage(content=get_inf_name_prompt()),
HumanMessage(content=f'''The dictionary of parameters is: {state['parameters']}''')]
response=llm_gpt.with_structured_output(InfluencerNames).invoke(messages)
payload = {
"usernames": response.names,
"freq": state['parameters']['frequency']
}
print('The payload is:',payload)
headers = {
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
return {'response':response.json()}