import os from io import BytesIO from agents import Runner, RunConfig from bot.agents_tools.agents_ import client, create_main_agent, memory_creator_agent from database.models import User from database.repositories.user import UserRepository from database.repositories.utils import UtilsRepository async def file_to_context(utils_repo: UtilsRepository, file_name: str, file_bytes: bytes, mem_type: str): vector_store_id = (await utils_repo.get_knowledge_vectore_store_id()) if not vector_store_id: vector_store = await client.vector_stores.create(name="knowledge_base") await utils_repo.add_knowledge_vectore_store_id(vector_store.id) vector_store_id = vector_store.id else: vector_store_id = vector_store_id.id_vector file = await client.files.create( file=(file_name, file_bytes, mem_type), purpose="assistants" ) await client.vector_stores.files.create( vector_store_id=vector_store_id, file_id=file.id ) while True: async for file_ in client.vector_stores.files.list( vector_store_id=vector_store_id, order='desc' ): if file_.id == file.id and file_.status == 'completed': return True if file_.id == file.id and file_.status == 'failed': return False async def delete_knowledge_base(utils_repo: UtilsRepository): is_vector_store = (await utils_repo.get_knowledge_vectore_store_id()) if is_vector_store: vector_store_id = is_vector_store.id_vector else: return await client.vector_stores.delete(vector_store_id=vector_store_id) vector_store = await client.vector_stores.create(name="knowledge_base") await utils_repo.delete_knowledge_vectore_store_id() await utils_repo.add_knowledge_vectore_store_id(vector_store.id) async def save_user_context_txt_file(user_repo: UserRepository, user: User): messages = await user_repo.get_messags(user_id=user.telegram_id) runner = await Runner.run( starting_agent=memory_creator_agent, input=[{'role': message.role, 'content': message.content} for message in messages], run_config=RunConfig( tracing_disabled=False ) ) input_tokens = runner.raw_responses[0].usage.input_tokens output_tokens = runner.raw_responses[0].usage.output_tokens answer = runner.final_output byte_buffer = BytesIO(answer.encode("utf-8")) memory_vector = await user_repo.get_memory_vector(user_id=user.telegram_id) if not memory_vector: vector_store = await client.vector_stores.create(name=f"user_memory_{user.telegram_id}") await user_repo.add_memory_vector(user_id=user.telegram_id, vector_store_id=vector_store.id) vector_store_id = vector_store.id else: vector_store_id = memory_vector.id_vector file = await client.files.create( file=(f'context_{user.telegram_id}.txt', byte_buffer, 'text/plain'), purpose="assistants" ) await client.vector_stores.files.create( vector_store_id=vector_store_id, file_id=file.id ) while True: async for file_ in client.vector_stores.files.list( vector_store_id=vector_store_id, order='desc' ): if file_.id == file.id and file_.status == 'completed': return input_tokens, output_tokens if file_.id == file.id and file_.status == 'failed': return False async def delete_user_memory(user_repo: UserRepository, user: User): memory_vector = await user_repo.get_memory_vector(user_id=user.telegram_id) if memory_vector: await client.vector_stores.delete(vector_store_id=memory_vector.id_vector) await user_repo.delete_memory_vector(user_id=user.telegram_id) images = os.listdir('images') for image in images: if str(user.telegram_id) in image: os.remove(f'images/{image}') async def create_vectore_store(user_repo: UserRepository, user: User): vector_store = await client.vector_stores.create(name=f"user_memory_{user.telegram_id}") await user_repo.add_memory_vector(user_id=user.telegram_id, vector_store_id=vector_store.id) async def transcribe_audio(bytes_audio: bytes): res = await client.audio.transcriptions.create( file=('audio.ogg', bytes_audio), model='whisper-1' ) return res.text async def add_file_to_memory(user_repo: UserRepository, user: User, file_name: str, file_bytes: bytes, mem_type: str): vector_store = await user_repo.get_memory_vector(user_id=user.telegram_id) if not vector_store: vector_store = await client.vector_stores.create(name=f"user_memory_{user.telegram_id}") await user_repo.add_memory_vector(user_id=user.telegram_id, vector_store_id=vector_store.id) vector_store_id = vector_store.id else: vector_store_id = vector_store.id_vector file = await client.files.create( file=(file_name, file_bytes, mem_type), purpose="assistants" ) await client.vector_stores.files.create( vector_store_id=vector_store_id, file_id=file.id ) while True: async for file_ in client.vector_stores.files.list( vector_store_id=vector_store_id, order='desc' ): if file_.id == file.id and file_.status == 'completed': return True if file_.id == file.id and file_.status == 'failed': return False