import json, time from hashlib import sha256 from fastapi import HTTPException from openai import OpenAI import tiktoken from . import log_module, error_map, chat_functions as tools, settings from typing import TYPE_CHECKING if TYPE_CHECKING: from . import model import asyncio encoding = tiktoken.encoding_for_model(settings.GPT_MODEL) def ejecutar(chat: "model.Chat", session: "model.Session"): temp_messages = [msg.model_dump() for msg in chat.messages] try: client = OpenAI( api_key=settings.OPENAI_API_KEY, timeout=30.0, max_retries=3 ) generated = client.chat.completions.create( model=settings.GPT_MODEL, messages=temp_messages, temperature=session.configs.temperature, frequency_penalty=session.configs.frequency_penalty, presence_penalty=session.configs.presence_penalty, tools= tools.functions if session.configs.useTool else None, stream=True, user=sha256(session.gid.encode('UTF-8')).hexdigest() ) return generated except Exception as error: log_module.logger(session.gid).error(repr(error) + " - " + session.gid) raise HTTPException( **error_map.error_table.get(type(error), error_map.error_table["undefined"])) async def streamer(chat: "model.Chat", session: "model.Session", sub_exec:bool = False): response_async = ejecutar(chat, session) if not sub_exec: yield json.dumps({"comando": "status", "status":{"mensaje":"Cargando", "modo": "reemplazar"}}) message = None role = None chunk = next(response_async) role = chunk.choices[0].delta.role if isinstance(chunk.choices[0].delta.content, str): message = chat.new_msg(role, response_async) chat.append(message) else: message = chat.new_func(role, response_async, chunk) if not sub_exec: yield json.dumps({"comando": "status", "status":{"mensaje":"Buscando en google o algo así", "modo": "reemplazar"}}) message.exec(session.gid) chat.append(message) async for r_async in streamer(chat, session, True): yield r_async if not sub_exec: session.update_usage(chat.tokens) log_module.logger(session.gid).info(f"Chat used, tokens: {chat.tokens}") yield json.dumps({"comando":"challenge", "challenge": session.challenge} ) yield json.dumps({"comando":"token", "token": session.create_cookie_token() } ) yield json.dumps({"comando":"mensaje", "mensaje": chat.messages[-1].model_dump()} )