You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
5.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import pandas as pd
from langchain.chat_models import ChatOpenAI
from langchain.llms import OpenAI
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
from langchain.agents import create_json_agent, AgentExecutor
from langchain.agents.agent_toolkits import JsonToolkit
import os
OPENAI_API = "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"
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGCHAIN_API_KEY"] = "ls__f7252ae2e7e4433d965ad37d94d63d6d"
project_name = "k-lab-weather"
os.environ["LANGCHAIN_PROJECT"] = "project_name"
BOT_KEY = '6415742729:AAHVyDkHHF57ZsVd9gJjVtXjKE2M9CydzPk'
WELCOME_MSG = """"
Привет! ✨ Мы K-Lab, Команда, занимающаяся разработкой роботов 🤖 и машинным обучением и мы рады видеть тебя в нашей системе управления метеоданными!
Спроси что-нибудь у нашего бота 🙂
"""
# AGW_PORT = 8045
# AGW_HOST = 'localhost'
# AGW_URL = f"http://{AGW_HOST}:{AGW_PORT}/"
AGW_URL = f"https://gw.cg.k-lab.su/"
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[-10:]
except requests.exceptions.RequestException as e:
print('Error fetching data:', e)
return None
def get_sensors_insight() -> str:
"""This tool provides data about the sensors (sensors) of the weather station. Data: lat, lng, height, name, agregator_uuid. Use it to answer questions related to this data. """
data = fetch_get_sensors()
return data
def get_agregators_insight() -> str:
"""This tool provides data on adapters (repeaters that transmit data from sensors to the server) of the weather station. Data: lat, lng, height (altitude above sea level), name, country, city, region, street. Use it to answer questions related to this data."""
data = fetch_get_agregator()
return data
def get_weather_data_history_insight() -> str:
"""This tool provides information about the history of changes in weather data readings. It will return an array of measurements including the following data: Sensor UUID, Agregator UUID, Type (Temperature, Humidity), Value, Time (date string). Use it to answer questions using this data."""
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=4,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
output_parser=output_parser,
project_name=project_name
)
# 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 думает... 🤔")
llm = OpenAI(model_name="text-davinci-003", openai_api_key=OPENAI_API)
msg = llm("Translate the text to English: " + message.text)
request = "You are a system for monitoring data from weather systems. Solve the problem: " + msg + ". for this solution you can use any tool without me but you can run tool only one step."
result = agent_chain(request)
if (result):
final_answer = result['output']
msg = llm("Переведи на красивый русский язык: " + final_answer)
print("AGENT_FINAL: " + final_answer)
print("DAVINCHI_FINAL: " + msg)
bot.reply_to(message, str(msg))
bot.infinity_polling()