~cytrogen/evi-run

ref: 2126525f0d329b7dc1d677fa1c5115335e668ad8 evi-run/bot/utils/funcs_gpt.py -rw-r--r-- 5.4 KiB
2126525f — Bendy Fix undefined name error in config.py 6 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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