import io import os import time import requests import json from .llms.chat_models import ChatOpenAI from langchain.schema import ( HumanMessage, SystemMessage, AIMessage, ) from typing import ( TYPE_CHECKING, Any, AsyncIterator, Callable, Dict, Iterator, List, Mapping, Optional, Tuple, Type, Union, ) __ALL__ = [ "text_to_text_generation", "title_generation", "text_to_tags", "question_answering", "summarization", ] HOST = "localhost" PORT = os.environ.get("CLLM_SERVICES_PORT", 10056) def setup(host="localhost", port=10056): global HOST, PORT HOST = host PORT = port def text_to_text_generation(text: str, **kwargs): host = kwargs.get("host", HOST) port = kwargs.get("port", PORT) url = f"http://{host}:{port}/text_to_text_generation" data = {"text": text} response = requests.post(url, data=data) return response.json() def question_answering_with_context(context: str, question: str, **kwargs): host = kwargs.get("host", HOST) port = kwargs.get("port", PORT) url = f"http://{host}:{port}/question_answering_with_context" data = {"context": context, "question": question} response = requests.post(url, data=data) return response.json() def openai_chat_model(input_msg: str, **kwargs): chat = ChatOpenAI(model_name="gpt-3.5-turbo-16k") chat_log = [] default_sys_msg = "Your name is ControlLLM, an AI-powered assistant developed by OpenGVLab from Shanghai AI Lab. You need to respond to user requests based on the following information." sys_msg = kwargs.get("sys_msg", default_sys_msg) if sys_msg is not None: chat_log.append(SystemMessage(content=sys_msg)) # history_msgs: list[str] history_msgs = [] if "history_msgs" in kwargs: history_msgs = kwargs.get("history_msgs", []) for item in history_msgs: if isinstance(item[0], (list, tuple)): item[0] = "Received file: " + item[0][0] if isinstance(item[1], (list, tuple)): item[1] = "Generated file: " + item[1][0] if item[0] is not None: chat_log.append(HumanMessage(content=item[0])) if item[1] is not None: chat_log.append(AIMessage(content=item[1])) # chat_log.extend([HumanMessage(content=item[0]), AIMessage(content=item[1])]) if not isinstance(input_msg, str): input_msg = json.dumps(input_msg, ensure_ascii=False) output = chat(chat_log + [HumanMessage(content=input_msg)]) return output def title_generation(text: str, **kwargs): question = "summarize" response = question_answering_with_context(text, question) return response def summarization(text: str, **kwargs): host = kwargs.get("host", HOST) port = kwargs.get("port", PORT) url = f"http://{host}:{port}/summarization" data = {"text": text} response = requests.post(url, data=data) return response.json() def text_to_tags(text: str, **kwargs): host = kwargs.get("host", HOST) port = kwargs.get("port", PORT) url = f"http://{host}:{port}/text_to_tags" data = {"text": text} response = requests.post(url, data=data) return response.json() def get_time(location: str = None, **kwargs): return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) def get_weather(location: str | list, **kwargs): host = kwargs.get("host", HOST) port = kwargs.get("port", PORT) url = f"http://{host}:{port}/get_weather" if isinstance(location, list): t = {"CITY": "", "COUNTRY": ""} for l in location: if l["entity_group"] not in t.keys(): continue if t[l["entity_group"]] == "": t[l["entity_group"]] = l["word"].title() location = ",".join([t["CITY"], t["COUNTRY"]]) data = {"location": location} response = requests.post(url, data=data) return response.json() def summarize_weather_condition(weather: str | list, **kwargs): if isinstance(weather, list): weather = json.dumps(weather, ensure_ascii=False) result = openai_chat_model( f"Please Summarize weather condition and make user better understand it: \n {weather}" ) return result def extract_location(text: str, **kwargs): host = kwargs.get("host", HOST) port = kwargs.get("port", PORT) url = f"http://{host}:{port}/extract_location" data = {"text": text} response = requests.post(url, data=data) return response.json() def sentiment_analysis(text: str, **kwargs): host = kwargs.get("host", HOST) port = kwargs.get("port", PORT) url = f"http://{host}:{port}/sentiment_analysis" data = {"text": text} response = requests.post(url, data=data) return response.json()