# embed-client
Асинхронный клиент для Embedding Service API с поддержкой всех режимов безопасности.
## Возможности
- ✅ **Асинхронный API** - полная поддержка async/await
- ✅ **Все режимы безопасности** - HTTP, HTTPS, mTLS
- ✅ **Аутентификация** - API Key, JWT, Basic Auth, Certificate
- ✅ **SSL/TLS поддержка** - полная интеграция с mcp_security_framework
- ✅ **Конфигурация** - файлы конфигурации, переменные окружения, аргументы
- ✅ **Обратная совместимость** - API формат не изменился, добавлена только безопасность
- ✅ **Типизация** - 100% type-annotated код
- ✅ **Тестирование** - 84+ тестов с полным покрытием
## Quick Start: Примеры запуска
### Базовое использование
**Вариант 1: через аргументы командной строки**
```sh
# HTTP без аутентификации
python embed_client/example_async_usage.py --base-url http://localhost --port 8001
# HTTP с API ключом
python embed_client/example_async_usage.py --base-url http://localhost --port 8001 \
--auth-method api_key --api-key admin_key_123
# HTTPS с SSL
python embed_client/example_async_usage.py --base-url https://localhost --port 9443 \
--ssl-verify-mode CERT_REQUIRED
# mTLS с сертификатами
python embed_client/example_async_usage.py --base-url https://localhost --port 9443 \
--cert-file certs/client.crt --key-file keys/client.key --ca-cert-file certs/ca.crt
```
**Вариант 2: через переменные окружения**
```sh
export EMBED_CLIENT_BASE_URL=http://localhost
export EMBED_CLIENT_PORT=8001
export EMBED_CLIENT_AUTH_METHOD=api_key
export EMBED_CLIENT_API_KEY=admin_key_123
python embed_client/example_async_usage.py
```
**Вариант 3: через файл конфигурации**
```sh
python embed_client/example_async_usage.py --config configs/https_token.json
```
### Режимы безопасности
#### 1. HTTP (без аутентификации)
```python
from embed_client.async_client import EmbeddingServiceAsyncClient
client = EmbeddingServiceAsyncClient(
base_url="http://localhost",
port=8001
)
```
#### 2. HTTP + Token
```python
from embed_client.config import ClientConfig
# API Key
config = ClientConfig.create_http_token_config(
"http://localhost", 8001, {"user": "api_key_123"}
)
# JWT
config = ClientConfig.create_http_jwt_config(
"http://localhost", 8001, "secret", "username", "password"
)
# Basic Auth
config = ClientConfig.create_http_basic_config(
"http://localhost", 8001, "username", "password"
)
```
#### 3. HTTPS
```python
config = ClientConfig.create_https_config(
"https://localhost", 9443,
ca_cert_file="certs/ca.crt"
)
```
#### 4. mTLS (взаимная аутентификация)
```python
config = ClientConfig.create_mtls_config(
"https://localhost", 9443,
cert_file="certs/client.crt",
key_file="keys/client.key",
ca_cert_file="certs/ca.crt"
)
```
### Программное использование
```python
import asyncio
from embed_client.async_client import EmbeddingServiceAsyncClient
from embed_client.config import ClientConfig
async def main():
# Создание конфигурации
config = ClientConfig.create_http_token_config(
"http://localhost", 8001, {"user": "api_key_123"}
)
# Использование клиента
async with EmbeddingServiceAsyncClient.from_config(config) as client:
# Проверка статуса
print(f"Аутентификация: {client.get_auth_method()}")
print(f"SSL включен: {client.is_ssl_enabled()}")
print(f"mTLS включен: {client.is_mtls_enabled()}")
# Выполнение запроса
result = await client.cmd("embed", params={"texts": ["hello world"]})
# Извлечение данных
embeddings = client.extract_embeddings(result)
texts = client.extract_texts(result)
tokens = client.extract_tokens(result)
bm25_tokens = client.extract_bm25_tokens(result)
print(f"Эмбеддинги: {embeddings}")
print(f"Тексты: {texts}")
print(f"Токены: {tokens}")
print(f"BM25 токены: {bm25_tokens}")
if __name__ == "__main__":
asyncio.run(main())
```
## Установка
```bash
# Установка из PyPI
pip install embed-client
# Установка в режиме разработки
git clone <repository>
cd embed-client
pip install -e .
```
## Зависимости
- `aiohttp` - асинхронные HTTP запросы
- `PyJWT>=2.0.0` - JWT токены
- `cryptography>=3.0.0` - криптография и сертификаты
- `pydantic>=2.0.0` - валидация конфигурации
## Тестирование
```bash
# Запуск всех тестов
pytest tests/
# Запуск тестов с покрытием
pytest tests/ --cov=embed_client
# Запуск конкретных тестов
pytest tests/test_async_client.py -v
pytest tests/test_config.py -v
pytest tests/test_auth.py -v
pytest tests/test_ssl_manager.py -v
```
## Документация
- [Формат API и режимы безопасности](docs/api_format.md)
- [Примеры использования](embed_client/example_async_usage.py)
- [Примеры на русском](embed_client/example_async_usage_ru.py)
## Безопасность
### Рекомендации
1. **Используйте HTTPS** для продакшена
2. **Включите проверку сертификатов** (CERT_REQUIRED)
3. **Используйте mTLS** для критически важных систем
4. **Регулярно обновляйте сертификаты**
5. **Храните приватные ключи в безопасном месте**
### Поддерживаемые протоколы
- TLS 1.2
- TLS 1.3
- SSL 3.0 (устаревший, не рекомендуется)
## Лицензия
MIT License
## Автор
**Vasiliy Zdanovskiy**
Email: vasilyvz@gmail.com
---
**Важно:**
- Используйте `--base-url` (через дефис), а не `--base_url` (через подчеркивание).
- Значение base_url должно содержать `http://` или `https://`.
- Аргументы должны быть отдельными (через пробел), а не через `=`.
Raw data
{
"_id": null,
"home_page": null,
"name": "embed-client",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "embedding, async, client, api, authentication, ssl, tls, mtls",
"author": null,
"author_email": "Vasiliy Zdanovskiy <vasilyvz@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/99/01/107ce6083a4d1778ce680d098cf928a4a7f9b485f70b8b1ff5722a0c0860/embed_client-3.1.5.0.tar.gz",
"platform": null,
"description": "# embed-client\n\n\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f Embedding Service API \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0432\u0441\u0435\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.\n\n## \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\n\n- \u2705 **\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 API** - \u043f\u043e\u043b\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 async/await\n- \u2705 **\u0412\u0441\u0435 \u0440\u0435\u0436\u0438\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438** - HTTP, HTTPS, mTLS\n- \u2705 **\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f** - API Key, JWT, Basic Auth, Certificate\n- \u2705 **SSL/TLS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430** - \u043f\u043e\u043b\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 mcp_security_framework\n- \u2705 **\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f** - \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b\n- \u2705 **\u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c** - API \u0444\u043e\u0440\u043c\u0430\u0442 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\n- \u2705 **\u0422\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f** - 100% type-annotated \u043a\u043e\u0434\n- \u2705 **\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435** - 84+ \u0442\u0435\u0441\u0442\u043e\u0432 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c\n\n## Quick Start: \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\n\n### \u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\n\n**\u0412\u0430\u0440\u0438\u0430\u043d\u0442 1: \u0447\u0435\u0440\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438**\n\n```sh\n# HTTP \u0431\u0435\u0437 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\npython embed_client/example_async_usage.py --base-url http://localhost --port 8001\n\n# HTTP \u0441 API \u043a\u043b\u044e\u0447\u043e\u043c\npython embed_client/example_async_usage.py --base-url http://localhost --port 8001 \\\n --auth-method api_key --api-key admin_key_123\n\n# HTTPS \u0441 SSL\npython embed_client/example_async_usage.py --base-url https://localhost --port 9443 \\\n --ssl-verify-mode CERT_REQUIRED\n\n# mTLS \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438\npython embed_client/example_async_usage.py --base-url https://localhost --port 9443 \\\n --cert-file certs/client.crt --key-file keys/client.key --ca-cert-file certs/ca.crt\n```\n\n**\u0412\u0430\u0440\u0438\u0430\u043d\u0442 2: \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f**\n\n```sh\nexport EMBED_CLIENT_BASE_URL=http://localhost\nexport EMBED_CLIENT_PORT=8001\nexport EMBED_CLIENT_AUTH_METHOD=api_key\nexport EMBED_CLIENT_API_KEY=admin_key_123\npython embed_client/example_async_usage.py\n```\n\n**\u0412\u0430\u0440\u0438\u0430\u043d\u0442 3: \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438**\n\n```sh\npython embed_client/example_async_usage.py --config configs/https_token.json\n```\n\n### \u0420\u0435\u0436\u0438\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\n\n#### 1. HTTP (\u0431\u0435\u0437 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438)\n```python\nfrom embed_client.async_client import EmbeddingServiceAsyncClient\n\nclient = EmbeddingServiceAsyncClient(\n base_url=\"http://localhost\",\n port=8001\n)\n```\n\n#### 2. HTTP + Token\n```python\nfrom embed_client.config import ClientConfig\n\n# API Key\nconfig = ClientConfig.create_http_token_config(\n \"http://localhost\", 8001, {\"user\": \"api_key_123\"}\n)\n\n# JWT\nconfig = ClientConfig.create_http_jwt_config(\n \"http://localhost\", 8001, \"secret\", \"username\", \"password\"\n)\n\n# Basic Auth\nconfig = ClientConfig.create_http_basic_config(\n \"http://localhost\", 8001, \"username\", \"password\"\n)\n```\n\n#### 3. HTTPS\n```python\nconfig = ClientConfig.create_https_config(\n \"https://localhost\", 9443,\n ca_cert_file=\"certs/ca.crt\"\n)\n```\n\n#### 4. mTLS (\u0432\u0437\u0430\u0438\u043c\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f)\n```python\nconfig = ClientConfig.create_mtls_config(\n \"https://localhost\", 9443,\n cert_file=\"certs/client.crt\",\n key_file=\"keys/client.key\",\n ca_cert_file=\"certs/ca.crt\"\n)\n```\n\n### \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\n\n```python\nimport asyncio\nfrom embed_client.async_client import EmbeddingServiceAsyncClient\nfrom embed_client.config import ClientConfig\n\nasync def main():\n # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n config = ClientConfig.create_http_token_config(\n \"http://localhost\", 8001, {\"user\": \"api_key_123\"}\n )\n \n # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\n async with EmbeddingServiceAsyncClient.from_config(config) as client:\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430\n print(f\"\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f: {client.get_auth_method()}\")\n print(f\"SSL \u0432\u043a\u043b\u044e\u0447\u0435\u043d: {client.is_ssl_enabled()}\")\n print(f\"mTLS \u0432\u043a\u043b\u044e\u0447\u0435\u043d: {client.is_mtls_enabled()}\")\n \n # \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\n result = await client.cmd(\"embed\", params={\"texts\": [\"hello world\"]})\n \n # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\n embeddings = client.extract_embeddings(result)\n texts = client.extract_texts(result)\n tokens = client.extract_tokens(result)\n bm25_tokens = client.extract_bm25_tokens(result)\n \n print(f\"\u042d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438: {embeddings}\")\n print(f\"\u0422\u0435\u043a\u0441\u0442\u044b: {texts}\")\n print(f\"\u0422\u043e\u043a\u0435\u043d\u044b: {tokens}\")\n print(f\"BM25 \u0442\u043e\u043a\u0435\u043d\u044b: {bm25_tokens}\")\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n```\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n```bash\n# \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u0437 PyPI\npip install embed-client\n\n# \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\ngit clone <repository>\ncd embed-client\npip install -e .\n```\n\n## \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\n\n- `aiohttp` - \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u044b\n- `PyJWT>=2.0.0` - JWT \u0442\u043e\u043a\u0435\u043d\u044b\n- `cryptography>=3.0.0` - \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b\n- `pydantic>=2.0.0` - \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n\n## \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n\n```bash\n# \u0417\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432\npytest tests/\n\n# \u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u0441 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c\npytest tests/ --cov=embed_client\n\n# \u0417\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432\npytest tests/test_async_client.py -v\npytest tests/test_config.py -v\npytest tests/test_auth.py -v\npytest tests/test_ssl_manager.py -v\n```\n\n## \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\n\n- [\u0424\u043e\u0440\u043c\u0430\u0442 API \u0438 \u0440\u0435\u0436\u0438\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438](docs/api_format.md)\n- [\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f](embed_client/example_async_usage.py)\n- [\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c](embed_client/example_async_usage_ru.py)\n\n## \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\n\n### \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438\n\n1. **\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 HTTPS** \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430\n2. **\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432** (CERT_REQUIRED)\n3. **\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 mTLS** \u0434\u043b\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\n4. **\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0439\u0442\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b**\n5. **\u0425\u0440\u0430\u043d\u0438\u0442\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435**\n\n### \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b\n\n- TLS 1.2\n- TLS 1.3\n- SSL 3.0 (\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439, \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)\n\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\n\nMIT License\n\n## \u0410\u0432\u0442\u043e\u0440\n\n**Vasiliy Zdanovskiy** \nEmail: vasilyvz@gmail.com\n\n---\n\n**\u0412\u0430\u0436\u043d\u043e:**\n- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 `--base-url` (\u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0444\u0438\u0441), \u0430 \u043d\u0435 `--base_url` (\u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435).\n- \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 base_url \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c `http://` \u0438\u043b\u0438 `https://`.\n- \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 (\u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b), \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 `=`.\n",
"bugtrack_url": null,
"license": null,
"summary": "Async client for Embedding Service API with comprehensive authentication, SSL/TLS, and mTLS support",
"version": "3.1.5.0",
"project_urls": {
"Bug Tracker": "https://github.com/vasilyvz/embed-client/issues",
"Documentation": "https://github.com/vasilyvz/embed-client#readme",
"Homepage": "https://github.com/vasilyvz/embed-client",
"Repository": "https://github.com/vasilyvz/embed-client"
},
"split_keywords": [
"embedding",
" async",
" client",
" api",
" authentication",
" ssl",
" tls",
" mtls"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "90aca40ccfaca65128c70b45674fd3f54685e016181894fb412a5d4623ca411b",
"md5": "0f22f0129700bb5c4b7d8eda0074d045",
"sha256": "b90e49b026ee80cab1f3c582efc791cfb5328816230a01bc18b68a8c4b1ca309"
},
"downloads": -1,
"filename": "embed_client-3.1.5.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0f22f0129700bb5c4b7d8eda0074d045",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 56411,
"upload_time": "2025-10-14T12:47:16",
"upload_time_iso_8601": "2025-10-14T12:47:16.599547Z",
"url": "https://files.pythonhosted.org/packages/90/ac/a40ccfaca65128c70b45674fd3f54685e016181894fb412a5d4623ca411b/embed_client-3.1.5.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9901107ce6083a4d1778ce680d098cf928a4a7f9b485f70b8b1ff5722a0c0860",
"md5": "d0db3c58a402ab24697b4d83a9cad945",
"sha256": "72a0f15a6fe2bd1ab2ea59c0f1b7984ce5743d2dfb8973140ff831d27d731795"
},
"downloads": -1,
"filename": "embed_client-3.1.5.0.tar.gz",
"has_sig": false,
"md5_digest": "d0db3c58a402ab24697b4d83a9cad945",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 109148,
"upload_time": "2025-10-14T12:47:18",
"upload_time_iso_8601": "2025-10-14T12:47:18.226446Z",
"url": "https://files.pythonhosted.org/packages/99/01/107ce6083a4d1778ce680d098cf928a4a7f9b485f70b8b1ff5722a0c0860/embed_client-3.1.5.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-14 12:47:18",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "vasilyvz",
"github_project": "embed-client",
"github_not_found": true,
"lcname": "embed-client"
}