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