|
|
|
|
import pandas as pd
|
|
|
|
|
from langchain.chat_models import ChatOpenAI
|
|
|
|
|
from langchain.agents import initialize_agent, AgentType, AgentOutputParser
|
|
|
|
|
from typing import List, Union
|
|
|
|
|
from langchain.schema import AgentAction, AgentFinish, OutputParserException
|
|
|
|
|
from langchain.tools.base import StructuredTool
|
|
|
|
|
from typing import Optional
|
|
|
|
|
import requests
|
|
|
|
|
import telebot
|
|
|
|
|
|
|
|
|
|
OPENAI_API = "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"
|
|
|
|
|
|
|
|
|
|
BOT_KEY = '6415742729:AAHVyDkHHF57ZsVd9gJjVtXjKE2M9CydzPk'
|
|
|
|
|
|
|
|
|
|
WELCOME_MSG = """"
|
|
|
|
|
Привет! ✨ Мы K-Lab, Команда, занимающаяся разработкой роботов 🤖 и машинным обучением и мы рады видеть тебя в нашей системе управления метеоданными!
|
|
|
|
|
Спроси что-нибудь у нашего бота 🙂
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# Weather AGW
|
|
|
|
|
AGW_PORT = 8045
|
|
|
|
|
AGW_HOST = 'localhost'
|
|
|
|
|
AGW_URL = f"http://{AGW_HOST}:{AGW_PORT}/"
|
|
|
|
|
|
|
|
|
|
bot = telebot.TeleBot(BOT_KEY)
|
|
|
|
|
|
|
|
|
|
def fetch_get_sensors(params={}):
|
|
|
|
|
try:
|
|
|
|
|
response = requests.post(AGW_URL + 'api/v1/sensors/get-with-params', json=params)
|
|
|
|
|
response.raise_for_status()
|
|
|
|
|
data = response.json()
|
|
|
|
|
return data
|
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
|
|
|
print('Error fetching data:', e)
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def fetch_get_agregator(params={}):
|
|
|
|
|
try:
|
|
|
|
|
response = requests.post(AGW_URL + 'api/v1/agregator/get-with-params', json=params)
|
|
|
|
|
response.raise_for_status()
|
|
|
|
|
data = response.json()
|
|
|
|
|
return data
|
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
|
|
|
print('Error fetching data:', e)
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def fetch_get_weather_data(params={}):
|
|
|
|
|
try:
|
|
|
|
|
response = requests.get(AGW_URL + 'api/v1/measures/get-for-ai')
|
|
|
|
|
response.raise_for_status()
|
|
|
|
|
data = response.json()
|
|
|
|
|
return data
|
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
|
|
|
print('Error fetching data:', e)
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def get_sensors_insight() -> str:
|
|
|
|
|
"""Tool that using for get meteo weather sensors"""
|
|
|
|
|
data = fetch_get_sensors()
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
def get_agregators_insight() -> str:
|
|
|
|
|
"""Tool that using for get meteo weather sensors"""
|
|
|
|
|
data = fetch_get_agregator()
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
def get_weather_data_history_insight() -> str:
|
|
|
|
|
"""Tool that using for get meteo weather history from sensors using in the meteo system"""
|
|
|
|
|
data = fetch_get_weather_data()
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
sensors_insights_tool = StructuredTool.from_function(get_sensors_insight)
|
|
|
|
|
agregators_insights_tool = StructuredTool.from_function(get_agregators_insight)
|
|
|
|
|
weather_history_insights_tool = StructuredTool.from_function(get_weather_data_history_insight)
|
|
|
|
|
|
|
|
|
|
chat = ChatOpenAI(model_name="gpt-3.5-turbo-16k", temperature=0.2, openai_api_key=OPENAI_API)
|
|
|
|
|
|
|
|
|
|
tools = [sensors_insights_tool, agregators_insights_tool, weather_history_insights_tool]
|
|
|
|
|
|
|
|
|
|
class CustomOutputParser(AgentOutputParser):
|
|
|
|
|
def parse(self, llm_output: str) -> Union[AgentAction, AgentFinish]:
|
|
|
|
|
# Check if agent should finish
|
|
|
|
|
if "Final Answer:" in llm_output:
|
|
|
|
|
final_answer = llm_output.split("Final Answer:")[-1].strip()
|
|
|
|
|
print("final is - " + final_answer)
|
|
|
|
|
return AgentFinish(
|
|
|
|
|
return_values={"output": final_answer},
|
|
|
|
|
log=llm_output,
|
|
|
|
|
)
|
|
|
|
|
# Parse out the action and action input
|
|
|
|
|
regex = r"Action\s*\d*\s*:(.*?)\nAction\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)"
|
|
|
|
|
match = re.search(regex, llm_output, re.DOTALL)
|
|
|
|
|
if not match:
|
|
|
|
|
raise ValueError(f"Could not parse LLM output: `{llm_output}`")
|
|
|
|
|
action = match.group(1).strip()
|
|
|
|
|
action_input = match.group(2)
|
|
|
|
|
# Return the action and action input
|
|
|
|
|
return AgentAction(
|
|
|
|
|
tool=action, tool_input=action_input.strip(" ").strip('"'), log=llm_output
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
output_parser = CustomOutputParser()
|
|
|
|
|
|
|
|
|
|
agent_chain = initialize_agent(
|
|
|
|
|
tools,
|
|
|
|
|
chat,
|
|
|
|
|
max_iterations=3,
|
|
|
|
|
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
|
|
|
|
|
verbose=True,
|
|
|
|
|
output_parser=output_parser
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# print(get_weather_data_history_insight())
|
|
|
|
|
|
|
|
|
|
@bot.message_handler(commands=['start', 'hello'])
|
|
|
|
|
def send_welcome(message):
|
|
|
|
|
bot.reply_to(message, WELCOME_MSG)
|
|
|
|
|
|
|
|
|
|
@bot.message_handler(func=lambda msg: True)
|
|
|
|
|
def echo_all(message):
|
|
|
|
|
user_id = message.from_user.id
|
|
|
|
|
print(message.text)
|
|
|
|
|
bot.reply_to(message, "AI думает... 🤔")
|
|
|
|
|
|
|
|
|
|
result = agent_chain(message.text)
|
|
|
|
|
if (result):
|
|
|
|
|
final_answer = result['output']
|
|
|
|
|
print(final_answer)
|
|
|
|
|
|
|
|
|
|
bot.reply_to(message, str(final_answer))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bot.infinity_polling()
|