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