Добро пожаловать в репозиторий LLMChat, полную реализацию сервера API, построенного с Python Fastapi, и красивый фронт, питаемый Flutter. Этот проект предназначен для обеспечения бесшовного чата с расширенными моделями CHATGPT и другими моделями LLM. ? Предлагая современную инфраструктуру, которая может быть легко расширена, когда становятся доступны мультимодальные функции GPT-4. Наслаждайтесь своим пребыванием!
mobile , так и PC среды.Markdown также поддерживается, поэтому вы можете использовать его для форматирования своих сообщений.Вы можете использовать поисковую систему DuckDuckgo, чтобы найти соответствующую информацию в Интернете. Просто активируйте кнопку «Просмотр»!
Посмотрите демо-видео для полного просмотра: https://www.youtube.com/watch?v=MJ_CVRWRS08
С помощью команды /embed вы можете хранить текст на неопределенный срок в своей собственной личной векторной базе данных и запросить его позже, в любое время. Если вы используете команду /share , текст хранится в общественной векторной базе данных, которой каждый может поделиться. Включение кнопки переключения Query или команды /query помогает ИИ генерировать контекстуализированные ответы путем поиска текстовых сходств в публичных и частных базах данных. Это решает одно из самых больших ограничений языковых моделей: память .
Вы можете встроить PDF -файл, нажав Embed Document внизу слева. Через несколько секунд текстовое содержимое PDF будет преобразовано в векторы и встроено в кеш Redis.
LLMModels , которая находится в app/models/llms.py . Для локального LLALAM LLMS предполагается, что он будет работать только в местной среде и использует конечную точку http://localhost:8002/v1/completions . Он непрерывно проверяет состояние сервера API LLAMA, подключаясь к http://localhost:8002/health один раз в заряд, чтобы увидеть, возвращается ли отклик в 200 OK, а если нет, автоматически запускает отдельный процесс для создания сервера API.
Основная цель Llama.cpp-запустить модель LLAMA с использованием 4-битного квантования GGML с простой реализацией C/C ++ без зависимостей. Вы должны загрузить файл bin GGML из HuggingFace и поместить его в папку llama_models/ggml и определить LLMMODEL в app/models/llms.py . Есть несколько примеров, поэтому вы можете легко определить свою собственную модель. Обратитесь к репозиторию llama.cpp для получения дополнительной информации: https://github.com/ggerganov/llama.cpp
Отдельная реализация Python/C ++/CUDA LLAMA для использования с 4-битными весами GPTQ , предназначенной для быстрой и эффективной памяти для современных графических процессоров. Он использует pytorch и sentencepiece для запуска модели. Предполагается, что он будет работать только в местной среде, и требуется, по крайней мере, один NVIDIA CUDA GPU . Вы должны загрузить файлы Tokenizer, Config и GPTQ из HuggingFace и поместить его в папку llama_models/gptq/YOUR_MODEL_FOLDER , и определить LLMMODEL в app/models/llms.py . Есть несколько примеров, поэтому вы можете легко определить свою собственную модель. Обратитесь к репозиторию exllama для получения более подробной информации: https://github.com/turboderp/exllama
web framework для построения API с Python.Webapp с красивым пользовательским интерфейсом и богатым набором настраиваемых виджетов.OpenAI API для генерации текста и управления сообщениями.LlamaCpp и Exllama Models.Real-time , двустороннее общение с CHATGPT и другие модели LLM, с Flutter Frontend WebApp.Redis и Langchain , хранить и извлечь векторные встраивания для поиска сходства. Это поможет ИИ генерировать более актуальные ответы.Duckduckgo , просмотрите Интернет и найдите соответствующую информацию.async / await для параллелизма и параллелизма.MySQL . Легко выполнять создание, чтение, обновление и удаление действий, с sqlalchemy.asyncioRedis с Aioredis. Легко выполнять создание, чтение, обновление и удаление действий, с помощью aioredis . Чтобы настроить на местной машине, выполните эти простые шаги. Прежде чем начать, убедитесь, что на вашей машине установлены docker и docker-compose . Если вы хотите запустить сервер без Docker, вам нужно установить Python 3.11 дополнительно. Несмотря на то, что вам нужен Docker для запуска серверов DB.
Чтобы рекурсивно клонировать подмодулы, чтобы использовать модели Exllama или llama.cpp , используйте следующую команду:
git clone --recurse-submodules https://github.com/c0sogi/llmchat.gitВы хотите использовать только основные функции (OpenAI), используйте следующую команду:
git clone https://github.com/c0sogi/llmchat.git cd LLMChat.env -файл Настройка файла env, ссылаясь на файл .env-sample . Введите информацию о базе данных для создания, ключ API OpenAI и другие необходимые конфигурации. Необходимые опционы не требуются, просто оставьте их такими, какие они есть.
Выполнить это. Это может занять несколько минут, чтобы запустить сервер в первый раз:
docker-compose -f docker-compose-local.yaml updocker-compose -f docker-compose-local.yaml down Теперь вы можете получить доступ к серверу по адресу http://localhost:8000/docs и базу данных по адресу db:3306 или cache:6379 . Вы также можете получить доступ к приложению по адресу http://localhost:8000/chat .
Чтобы запустить сервер без Docker, если вы хотите запустить сервер без Docker, вам нужно установить Python 3.11 дополнительно. Несмотря на то, что вам нужен Docker для запуска серверов DB. Выключите сервер API, который уже работает с docker-compose -f docker-compose-local.yaml down api . Не забудьте запустить другие серверы DB на Docker! Затем запустите следующие команды:
python -m main Ваш сервер должен теперь работать на http://localhost:8001 в этом случае.
Этот проект лицензируется по лицензии MIT, которая позволяет бесплатно использовать, модификацию и распространение, если в любую копию или существенную часть программного обеспечения включены первоначальное уведомление об авторском праве и лицензии.
FastAPI - это современная веб -структура для создания API с Python. ? Он имеет высокую производительность, легко учиться, быстро кодировать и готовый к производству. ? Одной из основных особенностей FastAPI является то, что он поддерживает параллелизм и синтаксис async / await . ? Это означает, что вы можете написать код, который может выполнять несколько задач одновременно, не блокируя друг друга, особенно при работе с операциями ввода -вывода, такими как сетевые запросы, запросы базы данных, операции файлов и т. Д.
Flutter -это инструментарий пользовательского интерфейса с открытым исходным кодом, разработанный Google для создания собственных пользовательских интерфейсов для мобильных, веб-и настольных платформ из одной кодовой базы. « использует Dart , современный объектно-ориентированный язык программирования и предоставляет богатый набор настраиваемых виджетов, которые могут адаптироваться к любому дизайну.
Вы можете получить доступ ChatGPT или LlamaCpp через подключение WebSocket , используя два модуля: app/routers/websocket и app/utils/chat/chat_stream_manager . Эти модули облегчают связь между клиентом Flutter и моделью чата через WebSocket. С помощью WebSocket вы можете установить двухсторонний канал связи в реальном времени для взаимодействия с LLM.
Чтобы начать разговор, подключитесь к маршруту WebSocket /ws/chat/{api_key} с действительным ключом API, зарегистрированным в базе данных. Обратите внимание, что этот ключ API не совпадает с ключом API OpenAI, но доступен только для вашего сервера для проверки пользователя. После подключения вы можете отправлять сообщения и команды для взаимодействия с моделью LLM. WebSocket отправит ответы в чате в режиме реального времени. Это соединение WebSocket создается через приложение Flutter, которое может быть доступно с помощью конечной точки /chat .
websocket.py отвечает за настройку подключения к WebSocket и обработку аутентификации пользователей. Он определяет маршрут websocket /chat/{api_key} , который принимает веб -сайт и ключ API в качестве параметров.
Когда клиент подключается к WebSocket, он сначала проверяет ключ API для аутентификации пользователя. Если ключ API действительна, функция begin_chat() вызывается из модуля stream_manager.py , чтобы начать разговор.
В случае незарегистрированного ключа API или неожиданной ошибки клиенту отправляется соответствующее сообщение, а соединение закрыто.
@ router . websocket ( "/chat/{api_key}" )
async def ws_chat ( websocket : WebSocket , api_key : str ):
... stream_manager.py отвечает за управление разговором и обработку сообщений пользователей. Он определяет функцию begin_chat() , которая принимает WebSocket, идентификатор пользователя в качестве параметров.
Функция сначала инициализирует контекст чата пользователя из Cache Manager. Затем он отправляет начальную историю сообщений клиенту через WebSocket.
Разговор продолжается в цикле, пока соединение не будет закрыто. Во время разговора сообщения пользователя обрабатываются, а ответы GPT генерируются соответствующим образом.
class ChatStreamManager :
@ classmethod
async def begin_chat ( cls , websocket : WebSocket , user : Users ) -> None :
... Класс SendToWebsocket используется для отправки сообщений и потоков в WebSocket. Он имеет два метода: message() и stream() . Метод message() отправляет полное сообщение в WebSocket, в то время как метод stream() отправляет поток в WebSocket.
class SendToWebsocket :
@ staticmethod
async def message (...):
...
@ staticmethod
async def stream (...):
... Класс MessageHandler также обрабатывает ответы ИИ. Метод ai() отправляет ответ AI на WebSocket. Если перевод включен, ответ переводится с использованием API Google Translate перед отправкой его клиенту.
class MessageHandler :
...
@ staticmethod
async def ai (...):
... Пользовательские сообщения обрабатываются с использованием класса HandleMessage . Если сообщение начинается с / , например, /YOUR_CALLBACK_NAME . Он рассматривается как команда, и генерируется соответствующий ответ команды. В противном случае сообщение пользователя обрабатывается и отправляется в модель LLM для создания ответа.
Команды обрабатываются с использованием класса ChatCommands . Он выполняет соответствующую функцию обратного вызова в зависимости от команды. Вы можете добавить новые команды, просто добавив обратный вызов в классе ChatCommands из app.utils.chat.chat_commands .
Использование REDIS для хранения векторных вторжений разговоров? ️ может помочь модели CHATGPT? Несколько способов, таких как эффективный и быстрый поиск контекста разговора ♀, обработка больших объемов данных и предоставление более релевантных ответов с помощью поиска сходства вектора?
Некоторые забавные примеры того, как это может работать на практике:
/embed Когда пользователь вводит команду в окно чата, например, /embed <text_to_embed> , вызывается метод VectorStoreManager.create_documents . Этот метод преобразует входной текст в вектор с использованием модели Openai text-embedding-ada-002 и хранит его в VectorStore Redis.
@ staticmethod
@ command_response . send_message_and_stop
async def embed ( text_to_embed : str , / , buffer : BufferedUserContext ) -> str :
"""Embed the text and save its vectors in the redis vectorstore. n
/embed <text_to_embed>"""
.../query Когда пользователь входит в команду /query <query> , функция asimilarity_search используется для поиска до трех результатов с наибольшим сходством вектора с встроенным данными в Vectorstore Redis. Эти результаты временно хранятся в контексте чата, который помогает ИИ ответить на запрос, ссылаясь на эти данные.
@ staticmethod
async def query ( query : str , / , buffer : BufferedUserContext , ** kwargs ) -> Tuple [ str | None , ResponseType ]:
"""Query from redis vectorstore n
/query <query>"""
... При запуске функции begin_chat , если пользователь загружает файл, содержащий текст (например, PDF или файл TXT), текст автоматически извлекается из файла, и его векторное встраивание сохраняется в Redis.
@ classmethod
async def embed_file_to_vectorstore ( cls , file : bytes , filename : str , collection_name : str ) -> str :
# if user uploads file, embed it
...commands.py Функциональность В файле commands.py есть несколько важных компонентов:
command_response : Этот класс используется для установки декоратора в методе команды для указания следующего действия. Это помогает определить различные типы ответов, такие как отправка сообщения и остановка, отправка сообщения и продолжение ввода пользователя, обработка ответов ИИ и многое другое.command_handler : Эта функция отвечает за выполнение метода обратного вызовов команды на основе текста, введенного пользователем.arguments_provider : Эта функция автоматически поставляет аргументы, необходимые методом команды на основе типа аннотации метода команды.Запуск задачи : эта функция активируется всякий раз, когда пользователь выбирает сообщение или ИИ отвечает сообщением. На этом этапе создается задача автоматической суммирования для конденсации текстового контента.
Хранение задач : задача автоматической смахивания затем сохраняется в атрибуте task_list BufferUserChatContext . Это служит очередью для управления задачами, связанными с контекстом чата пользователя.
Сбор задач : После завершения цикла вопросов и ответов пользователя и ответов на MessageHandler функция harvest_done_tasks используется. Эта функция собирает результаты задачи суммирования, следя за тем, чтобы ничего не осталось.
Заявление о суммировании : после процесса сбора урожая суммированные результаты заменяют фактическое сообщение, когда наш чат -бот запрашивает ответы у моделей обучения языку (LLMS), таких как OpenAI и LLAMA_CPP. Таким образом, мы можем отправлять гораздо более лаконичные подсказки, чем начальное длинное сообщение.
Пользовательский опыт : Важно, что с точки зрения пользователя, они видят только исходное сообщение. Суммированная версия сообщения не показана им, сохраняя прозрачность и избегая потенциальной путаницы.
Одновременные задачи : еще одна ключевая особенность этой задачи автоматического оммурия заключается в том, что она не препятствует другим задачам. Другими словами, в то время как чат -бот занят суммированием текста, другие задачи все еще могут быть выполнены, тем самым повышая общую эффективность нашего чат -бота.
ChatConfig . Этот репозиторий содержит различные модели LLM, определенные в llms.py Каждый класс модели LLM наследуется от базового класса LLMModel . Enum LLMModels представляет собой коллекцию этих LLMS.
Все операции обрабатываются асинхронно без перерыва в основной потоке. Тем не менее, локальные LLM не могут обрабатывать несколько запросов одновременно, так как они слишком дороги. Следовательно, Semaphore используется для ограничения количества запросов до 1.
Модель LLM по умолчанию, используемая пользователем через UserChatContext.construct_default - gpt-3.5-turbo . Вы можете изменить по умолчанию эту функцию.
OpenAIModel генерирует текстовые асинхронно, запрашивая завершение чата с сервера OpenAI. Это требует ключа API OpenAI.
LlamaCppModel читает локально хранящуюся модель GGML. Модель Llama.cpp GGML должна быть помещена в папку llama_models/ggml в качестве файла .bin . Например, если вы загрузили квантовую модель Q4_0 из "https://huggingface.co/thebloke/robin-7b-v2-ggml", путь модели должен быть "Robin-7b.ggmlv3.q4_0.bin".
ExllamaModel Прочитайте локально хранящуюся модель GPTQ. Модель Exllama GPTQ должна быть помещена в папку llama_models/gptq в виде папки. Например, если вы загрузили 3 файла из "https://huggingface.co/thebloke/orca_mini_7b-gptq/tree/main":
Тогда вам нужно поместить их в папку. Путь модели должен быть именем папки. Допустим, «ORCA_MINI_7B», который содержит 3 файла.
Обработайте исключения, которые могут возникнуть во время генерации текста. Если ChatLengthException выброшено, оно автоматически выполняет процедуру для повторного ограничения сообщения в течение количества Tokens Limited функцией cutoff_message_histories и отправите его. Это гарантирует, что пользователь имеет плавный опыт чата независимо от предела токена.
Этот проект направлен на создание бэкэнда API, чтобы обеспечить большую языковую модель чатбота. Он использует менеджер Cache для хранения сообщений и профилей пользователей в Redis, а также диспетчер сообщений для безопасного кэширования сообщений, чтобы количество токенов не превышало приемлемого предела.
Cache Manager ( CacheManager ) отвечает за обработку информации о контексте пользователя и истории сообщений. Он хранит эти данные в Redis, что позволяет легко извлечь и модификацию. Менеджер предоставляет несколько методов взаимодействия с кэшем, например:
read_context_from_profile : считывает контекст чата пользователя из Redis в соответствии с профилем пользователя.create_context : создает новый контекст чата пользователя в Redis.reset_context : сбросить контекст чата пользователя к значениям по умолчанию.update_message_histories : обновляет истории сообщений для конкретной роли (пользователь, ИИ или Система).lpop_message_history / rpop_message_history : удаляет и возвращает историю сообщения с левого или правого конца списка.append_message_history : добавляет историю сообщений к окончанию списка.get_message_history : извлечет историю сообщений для конкретной роли.delete_message_history : удаляет историю сообщений для конкретной роли.set_message_history : устанавливает конкретную историю сообщений для роли и индекса. Менеджер сообщений ( MessageManager ) гарантирует, что количество токенов в истории сообщений не превышает указанный предел. Он безопасно обрабатывает добавление, удаление и настройку истории сообщений в контексте чата пользователя при сохранении ограничений токенов. Менеджер предоставляет несколько методов взаимодействия с историями сообщений, такими как:
add_message_history_safely : добавляет историю сообщений в контекст чата пользователя, гарантируя, что предел токена не превышен.pop_message_history_safely : удаляет и возвращает историю сообщений с правого конца списка при обновлении количества.set_message_history_safely : устанавливает конкретную историю сообщений в контексте чата пользователя, обновляя количество токенов и гарантируя, что предел токена не превышен. Чтобы использовать Cache Manager и Manger Manager в вашем проекте, импортируйте их следующим образом:
from app . utils . chat . managers . cache import CacheManager
from app . utils . chat . message_manager import MessageManagerЗатем вы можете использовать их методы для взаимодействия с кэшем Redis и управления историями сообщений в соответствии с вашими требованиями.
Например, чтобы создать новый контекст пользовательского чата:
user_id = "[email protected]" # email format
chat_room_id = "example_chat_room_id" # usually the 32 characters from `uuid.uuid4().hex`
default_context = UserChatContext . construct_default ( user_id = user_id , chat_room_id = chat_room_id )
await CacheManager . create_context ( user_chat_context = default_context )Чтобы безопасно добавить историю сообщений в контекст чата пользователя:
user_chat_context = await CacheManager . read_context_from_profile ( user_chat_profile = UserChatProfile ( user_id = user_id , chat_room_id = chat_room_id ))
content = "This is a sample message."
role = ChatRoles . USER # can be enum such as ChatRoles.USER, ChatRoles.AI, ChatRoles.SYSTEM
await MessageManager . add_message_history_safely ( user_chat_context , content , role ) В этом проекте используется промежуточное программное обеспечение token_validator и другие средние войны, используемые в приложении FastAPI. Эти средние войны несут ответственность за контроль доступа к API, обеспечивая обработку только авторизованные и аутентифицированные запросы.
Следующие средние войны добавляются в приложение FastAPI:
Промежуточное программное обеспечение управления доступом определено в файле token_validator.py . Он отвечает за проверку ключей API и токенов JWT.
Класс StateManager используется для инициализации переменных состояния запроса. Он устанавливает время запроса, время начала, IP -адрес и токен пользователя.
Класс AccessControl содержит два статических метода для проверки клавиш API и токенов JWT:
api_service : проверяет ключи API, проверяя наличие необходимых параметров и заголовков запроса в запросе. Он вызывает метод Validator.api_key для проверки ключа API, секрета и временной метки.non_api_service : проверяет токены JWT, проверяя существование заголовка «авторизации» или «авторизацию» в запросе. Он вызывает метод Validator.jwt для декодирования и проверки токена JWT. Класс Validator содержит два статических метода для проверки клавиш API и токенов JWT:
api_key : проверяет ключ доступа API, хэш -секрет и временную метку. Возвращает объект UserToken , если проверка успешна.jwt : декодирует и проверяет токен JWT. Возвращает объект UserToken , если проверка успешна. Функция access_control - это асинхронная функция, которая обрабатывает поток запроса и ответа для промежуточного программного обеспечения. Он инициализирует состояние запроса, используя класс StateManager , определяет тип аутентификации, необходимой для запрошенного URL (ключ API или токен JWT) и проверяет аутентификацию с помощью класса AccessControl . Если возникает ошибка в процессе проверки, поднимается соответствующее исключение HTTP.
Утилиты токена определены в файле token.py . Он содержит две функции:
create_access_token : создает токен JWT с данными данными и временем истечения срока действия.token_decode : декодирует и проверяет токен JWT. Повышает исключение, если токен истек или не может быть декодирован. Файл params_utils.py содержит функцию утилиты для параметров хэширования и секретного ключа с использованием HMAC и SHA256:
hash_params : принимает параметры запроса и секретный ключ в качестве ввода и возвращает хешированную строку BASE64. Файл date_utils.py содержит класс UTC с функциями утилиты для работы с датами и временными метками:
now : возвращает текущую UTC DateTime с необязательной разницей в час.timestamp : возвращает текущую временную метку UTC с дополнительной разницей в час.timestamp_to_datetime : преобразует метку времени в объект DateTime с необязательной разницей в час. Файл logger.py содержит класс ApiLogger , который регистрирует запрос API и информацию о ответе, включая URL -адрес запроса, метод, код состояния, информацию клиента, время обработки и данные ошибки (если применимо). Функция регистратора вызывается в конце функции access_control для регистрации обработанного запроса и ответа.
Чтобы использовать промежуточное программное обеспечение token_validator в вашем приложении FastAPI, просто импортируйте функцию access_control и добавьте ее в качестве промежуточного программного обеспечения в экземпляр FastAPI:
from app . middlewares . token_validator import access_control
app = FastAPI ()
app . add_middleware ( dispatch = access_control , middleware_class = BaseHTTPMiddleware )Обязательно добавьте CORS и Host Host MiddleWares для полного контроля доступа:
app . add_middleware (
CORSMiddleware ,
allow_origins = config . allowed_sites ,
allow_credentials = True ,
allow_methods = [ "*" ],
allow_headers = [ "*" ],
)
app . add_middleware (
TrustedHostMiddleware ,
allowed_hosts = config . trusted_hosts ,
except_path = [ "/health" ],
) Теперь любые входящие запросы в ваше приложение FastAPI будут обработаны промежуточным программным обеспечением token_validator и другими средним уровнем, что обеспечивает обработку только авторизованные и аутентифицированные запросы.
This Module app.database.connection предоставляет простой в использовании интерфейс для управления подключениями к базе данных и выполнения запросов SQL с использованием SQLalchemy и Redis. Он поддерживает MySQL и может быть легко интегрирован с этим проектом.
Во -первых, импортируйте необходимые классы из модуля:
from app . database . connection import MySQL , SQLAlchemy , CacheFactory Далее создайте экземпляр класса SQLAlchemy и настройте его с настройками базы данных:
from app . common . config import Config
config : Config = Config . get ()
db = SQLAlchemy ()
db . start ( config ) Теперь вы можете использовать экземпляр db для выполнения запросов SQL и управления сеансами:
# Execute a raw SQL query
result = await db . execute ( "SELECT * FROM users" )
# Use the run_in_session decorator to manage sessions
@ db . run_in_session
async def create_user ( session , username , password ):
await session . execute ( "INSERT INTO users (username, password) VALUES (:username, :password)" , { "username" : username , "password" : password })
await create_user ( "JohnDoe" , "password123" ) Чтобы использовать кэширование Redis, создайте экземпляр класса CacheFactory и настройте его с помощью настроек Redis:
cache = CacheFactory ()
cache . start ( config ) Теперь вы можете использовать экземпляр cache для взаимодействия с Redis:
# Set a key in Redis
await cache . redis . set ( "my_key" , "my_value" )
# Get a key from Redis
value = await cache . redis . get ( "my_key" ) Фактически, в этом проекте класс MySQL выполняет начальную настройку при запуске приложения, и все подключения базы данных выполняются только с переменными db и cache , присутствующими в конце модуля. ?
Все параметры DB будут выполнены в create_app() в app.common.app_settings . Например, функция create_app() в app.common.app_settings будет выглядеть так:
def create_app ( config : Config ) -> FastAPI :
# Initialize app & db & js
new_app = FastAPI (
title = config . app_title ,
description = config . app_description ,
version = config . app_version ,
)
db . start ( config = config )
cache . start ( config = config )
js_url_initializer ( js_location = "app/web/main.dart.js" )
# Register routers
# ...
return new_app В этом проекте используется простой и эффективный способ обработки базы данных CRUD (создание, чтение, обновление, удаление) с использованием SQLALCHEMY и двух модулей и пути: app.database.models.schema и app.database.crud .
Модуль schema.py отвечает за определение моделей баз данных и их отношения с использованием SQLalchemy. Он включает в себя набор классов, которые наследуют от Base , экземпляр declarative_base() . Каждый класс представляет таблицу в базе данных, а его атрибуты представляют столбцы в таблице. Эти классы также наследуют от класса Mixin , который предоставляет некоторые общие методы и атрибуты для всех моделей.
Класс Mixin предоставляет некоторые общие атрибуты и методы для всех классов, которые наследуют от него. Некоторые из атрибутов включают в себя:
id : целое число первичного ключа для таблицы.created_at : DateTime для того, когда была создана запись.updated_at : DateTime для того, когда запись была в последний раз обновлялась.ip_address : IP -адрес клиента, который создал или обновил запись.Он также предоставляет несколько методов класса, которые выполняют операции CRUD с использованием SQLalchemy, например:
add_all() : добавляет несколько записей в базу данных.add_one() : добавляет одну запись в базу данных.update_where() : обновления записей в базе данных на основе фильтра.fetchall_filtered_by() : избирает все записи из базы данных, которые соответствуют предоставленному фильтру.one_filtered_by() : извлекает одну запись из базы данных, которая соответствует предоставленному фильтру.first_filtered_by() : извлекает первую запись из базы данных, которая соответствует предоставленному фильтру.one_or_none_filtered_by() : получает одну запись или возвращает None если нет записей, не соответствуют предоставленному фильтру. Модуль users.py и api_keys.py содержит набор функций, которые выполняют операции CRUD с использованием классов, определенных в schema.py . Эти функции используют методы класса, предоставленные классом Mixin для взаимодействия с базой данных.
Некоторые из функций в этом модуле включают в себя:
create_api_key() : создает новый ключ API для пользователя.get_api_keys() : извлекает все клавиши API для пользователя.get_api_key_owner() : Получает владельца ключа API.get_api_key_and_owner() : Получает ключ API и его владельца.update_api_key() : обновляет ключ API.delete_api_key() : удаляет ключ API.is_email_exist() : проверяет, существует ли электронное письмо в базе данных.get_me() : получает информацию пользователя на основе идентификатора пользователя.is_valid_api_key() : проверяет, действителен ли клавиша API.register_new_user() : регистрирует нового пользователя в базе данных.find_matched_user() : находит пользователя с соответствующим электронным письмом в базе данных. Чтобы использовать предоставленные операции CRUD, импортируйте соответствующие функции из модуля crud.py и вызовите их с необходимыми параметрами. Например:
import asyncio
from app . database . crud . users import register_new_user , get_me , is_email_exist
from app . database . crud . api_keys import create_api_key , get_api_keys , update_api_key , delete_api_key
async def main ():
# `user_id` is an integer index in the MySQL database, and `email` is user's actual name
# the email will be used as `user_id` in chat. Don't confuse with `user_id` in MySQL
# Register a new user
new_user = await register_new_user ( email = "[email protected]" , hashed_password = "..." )
# Get user information
user = await get_me ( user_id = 1 )
# Check if an email exists in the database
email_exists = await is_email_exist ( email = "[email protected]" )
# Create a new API key for user with ID 1
new_api_key = await create_api_key ( user_id = 1 , additional_key_info = { "user_memo" : "Test API Key" })
# Get all API keys for user with ID 1
api_keys = await get_api_keys ( user_id = 1 )
# Update the first API key in the list
updated_api_key = await update_api_key ( updated_key_info = { "user_memo" : "Updated Test API Key" }, access_key_id = api_keys [ 0 ]. id , user_id = 1 )
# Delete the first API key in the list
await delete_api_key ( access_key_id = api_keys [ 0 ]. id , access_key = api_keys [ 0 ]. access_key , user_id = 1 )
if __name__ == "__main__" :
asyncio . run ( main ())