embed-client


Nameembed-client JSON
Version 3.1.5.0 PyPI version JSON
download
home_pageNone
SummaryAsync client for Embedding Service API with comprehensive authentication, SSL/TLS, and mTLS support
upload_time2025-10-14 12:47:18
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords embedding async client api authentication ssl tls mtls
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 1.65351s