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()