evolution-openai


Nameevolution-openai JSON
Version 1.0.4 PyPI version JSON
download
home_pageNone
SummaryEvolution OpenAI with automatic token management
upload_time2025-10-06 16:30:37
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords ai api chatgpt client cloud.ru gpt ml openai sdk
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Evolution OpenAI
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![PyPI version](https://badge.fury.io/py/evolution-openai.svg)](https://badge.fury.io/py/evolution-openai)
[![Coverage](https://cloud-ru-tech.github.io/evolution-openai-python/badges/coverage.svg)](https://github.com/cloud-ru-tech/evolution-openai-python/actions)

**Полностью совместимый** Evolution OpenAI client с автоматическим управлением токенами. Просто замените `OpenAI` на `EvolutionOpenAI` и все будет работать!

## 🎯 Особенности

- ✅ **100% совместимость** с официальным OpenAI Python SDK
- ✅ **Автоматическое управление токенами** Cloud.ru
- ✅ **Drop-in replacement** - минимальные изменения в коде
- ✅ **Async/await поддержка** с `EvolutionAsyncOpenAI`
- ✅ **Streaming responses** поддержка
- ✅ **Thread-safe** token management
- ✅ **Автоматическое обновление** токенов за 30 секунд до истечения
- ✅ **Retry логика** при ошибках авторизации
- ✅ **Поддержка .env файлов** для управления конфигурацией
- ✅ **Интеграционные тесты** с реальным API
 

## 📦 Установка

```bash
pip install evolution-openai
```

## ⚡ Быстрый старт

### Миграция с OpenAI SDK

```python
# ❌ БЫЛО (OpenAI SDK)
from openai import OpenAI

client = OpenAI(api_key="sk-...")

# ✅ СТАЛО (Evolution OpenAI)
from evolution_openai import EvolutionOpenAI

# Для обычного использования
client = EvolutionOpenAI(
    key_id="your_key_id", secret="your_secret", base_url="https://your-model-endpoint.cloud.ru/v1"
)

response = client.chat.completions.create(
    model="default", messages=[{"role": "user", "content": "Hello!"}]
)
```

### Основное использование

#### Обычное использование

```python
from evolution_openai import EvolutionOpenAI

# Инициализация client для обычного использования
client = EvolutionOpenAI(
    key_id="your_key_id", secret="your_secret", base_url="https://your-model-endpoint.cloud.ru/v1"
)

# Chat Completions
response = client.chat.completions.create(
    model="default",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is artificial intelligence?"},
    ],
    max_tokens=150,
)

print(response.choices[0].message.content)
```

 

### Streaming

```python
# Для обычного использования
stream = client.chat.completions.create(
    model="default", messages=[{"role": "user", "content": "Tell me a story"}], stream=True
)


for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
```

### Async/Await

```python
import asyncio
from evolution_openai import EvolutionAsyncOpenAI


async def main():
    client = EvolutionAsyncOpenAI(
        key_id="your_key_id",
        secret="your_secret",
        base_url="https://your-model-endpoint.cloud.ru/v1",
    )
    response = await client.chat.completions.create(
        model="default", messages=[{"role": "user", "content": "Async hello!"}]
    )

    print(response.choices[0].message.content)


asyncio.run(main())
```

## 🔧 Конфигурация

### Переменные окружения

Создайте файл `.env` в корне вашего проекта:

```bash
# Скопируйте из env.example и заполните
cp env.example .env
```

#### Для обычного использования:

```bash
# .env файл
EVOLUTION_KEY_ID=your_key_id_here
EVOLUTION_SECRET=your_secret_here
EVOLUTION_BASE_URL=https://your-model-endpoint.cloud.ru/v1
EVOLUTION_TOKEN_URL=https://iam.api.cloud.ru/api/v1/auth/token
ENABLE_INTEGRATION_TESTS=false
LOG_LEVEL=INFO
```

 

```python
import os
from evolution_openai import EvolutionOpenAI
from dotenv import load_dotenv

# Загрузка переменных из .env файла
load_dotenv()

client = EvolutionOpenAI(
    key_id=os.getenv("EVOLUTION_KEY_ID"),
    secret=os.getenv("EVOLUTION_SECRET"),
    base_url=os.getenv("EVOLUTION_BASE_URL"),
)
```

### Удобные функции

```python
from evolution_openai import create_client, create_async_client

# Sync client
client = create_client(key_id="...", secret="...", base_url="...", timeout=30.0)

# Async client
async_client = create_async_client(key_id="...", secret="...", base_url="...", max_retries=5)
```

## 📋 Полная совместимость

Поддерживаются ВСЕ методы OpenAI SDK:

```python
# Chat API
client.chat.completions.create(...)
client.chat.completions.create(..., stream=True)

# Models API
client.models.list()
client.models.retrieve("model_id")

# Legacy Completions
client.completions.create(...)

# Advanced features
client.with_options(timeout=30).chat.completions.create(...)
client.chat.completions.with_raw_response.create(...)

# Context manager
with client:
    response = client.chat.completions.create(...)
```


## 📚 Документация

- [API Documentation](https://cloud-ru-tech.github.io/evolution-openai-python)
 
- [Migration Guide](https://cloud-ru-tech.github.io/evolution-openai-python/migration)
- [Examples](https://github.com/cloud-ru-tech/evolution-openai-python/tree/main/examples/)
- [Changelog](https://github.com/cloud-ru-tech/evolution-openai-python/tree/main/CHANGELOG.md)
- [Environment Configuration](https://github.com/cloud-ru-tech/evolution-openai-python/tree/main/env.example)


## 🆘 Support

- [GitHub Issues](https://github.com/cloud-ru-tech/evolution-openai-python/issues)
- [Documentation](https://cloud-ru-tech.github.io/evolution-openai-python)
- Email: support@cloud.ru

## 🔗 Links

- [PyPI Package](https://pypi.org/project/evolution-openai/)
- [GitHub Repository](https://github.com/cloud-ru-tech/evolution-openai-python)
- [Cloud.ru Platform](https://cloud.ru/)
- [OpenAI Python SDK](https://github.com/openai/openai-python) 
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "evolution-openai",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "Evolution ML Inference Team <support@cloud.ru>",
    "keywords": "ai, api, chatgpt, client, cloud.ru, gpt, ml, openai, sdk",
    "author": null,
    "author_email": "Evolution ML Inference Team <support@cloud.ru>",
    "download_url": "https://files.pythonhosted.org/packages/88/d7/e90e94c0ca69eae7c5832ec1b328fd9b9ffd39a47687e53a564ccb3207a2/evolution_openai-1.0.4.tar.gz",
    "platform": null,
    "description": "# Evolution OpenAI\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![PyPI version](https://badge.fury.io/py/evolution-openai.svg)](https://badge.fury.io/py/evolution-openai)\n[![Coverage](https://cloud-ru-tech.github.io/evolution-openai-python/badges/coverage.svg)](https://github.com/cloud-ru-tech/evolution-openai-python/actions)\n\n**\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439** Evolution OpenAI client \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438. \u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 `OpenAI` \u043d\u0430 `EvolutionOpenAI` \u0438 \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c!\n\n## \ud83c\udfaf \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n\n- \u2705 **100% \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c** \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c OpenAI Python SDK\n- \u2705 **\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438** Cloud.ru\n- \u2705 **Drop-in replacement** - \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435\n- \u2705 **Async/await \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430** \u0441 `EvolutionAsyncOpenAI`\n- \u2705 **Streaming responses** \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\n- \u2705 **Thread-safe** token management\n- \u2705 **\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435** \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0437\u0430 30 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f\n- \u2705 **Retry \u043b\u043e\u0433\u0438\u043a\u0430** \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438\n- \u2705 **\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 .env \u0444\u0430\u0439\u043b\u043e\u0432** \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439\n- \u2705 **\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b** \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c API\n \n\n## \ud83d\udce6 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n```bash\npip install evolution-openai\n```\n\n## \u26a1 \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n### \u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0441 OpenAI SDK\n\n```python\n# \u274c \u0411\u042b\u041b\u041e (OpenAI SDK)\nfrom openai import OpenAI\n\nclient = OpenAI(api_key=\"sk-...\")\n\n# \u2705 \u0421\u0422\u0410\u041b\u041e (Evolution OpenAI)\nfrom evolution_openai import EvolutionOpenAI\n\n# \u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\nclient = EvolutionOpenAI(\n    key_id=\"your_key_id\", secret=\"your_secret\", base_url=\"https://your-model-endpoint.cloud.ru/v1\"\n)\n\nresponse = client.chat.completions.create(\n    model=\"default\", messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n### \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\n\n#### \u041e\u0431\u044b\u0447\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\n\n```python\nfrom evolution_openai import EvolutionOpenAI\n\n# \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f client \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\nclient = EvolutionOpenAI(\n    key_id=\"your_key_id\", secret=\"your_secret\", base_url=\"https://your-model-endpoint.cloud.ru/v1\"\n)\n\n# Chat Completions\nresponse = client.chat.completions.create(\n    model=\"default\",\n    messages=[\n        {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n        {\"role\": \"user\", \"content\": \"What is artificial intelligence?\"},\n    ],\n    max_tokens=150,\n)\n\nprint(response.choices[0].message.content)\n```\n\n \n\n### Streaming\n\n```python\n# \u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\nstream = client.chat.completions.create(\n    model=\"default\", messages=[{\"role\": \"user\", \"content\": \"Tell me a story\"}], stream=True\n)\n\n\nfor chunk in stream:\n    if chunk.choices[0].delta.content:\n        print(chunk.choices[0].delta.content, end=\"\")\n```\n\n### Async/Await\n\n```python\nimport asyncio\nfrom evolution_openai import EvolutionAsyncOpenAI\n\n\nasync def main():\n    client = EvolutionAsyncOpenAI(\n        key_id=\"your_key_id\",\n        secret=\"your_secret\",\n        base_url=\"https://your-model-endpoint.cloud.ru/v1\",\n    )\n    response = await client.chat.completions.create(\n        model=\"default\", messages=[{\"role\": \"user\", \"content\": \"Async hello!\"}]\n    )\n\n    print(response.choices[0].message.content)\n\n\nasyncio.run(main())\n```\n\n## \ud83d\udd27 \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\n\n### \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\n\n\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b `.env` \u0432 \u043a\u043e\u0440\u043d\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430:\n\n```bash\n# \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0438\u0437 env.example \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\ncp env.example .env\n```\n\n#### \u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:\n\n```bash\n# .env \u0444\u0430\u0439\u043b\nEVOLUTION_KEY_ID=your_key_id_here\nEVOLUTION_SECRET=your_secret_here\nEVOLUTION_BASE_URL=https://your-model-endpoint.cloud.ru/v1\nEVOLUTION_TOKEN_URL=https://iam.api.cloud.ru/api/v1/auth/token\nENABLE_INTEGRATION_TESTS=false\nLOG_LEVEL=INFO\n```\n\n \n\n```python\nimport os\nfrom evolution_openai import EvolutionOpenAI\nfrom dotenv import load_dotenv\n\n# \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 .env \u0444\u0430\u0439\u043b\u0430\nload_dotenv()\n\nclient = EvolutionOpenAI(\n    key_id=os.getenv(\"EVOLUTION_KEY_ID\"),\n    secret=os.getenv(\"EVOLUTION_SECRET\"),\n    base_url=os.getenv(\"EVOLUTION_BASE_URL\"),\n)\n```\n\n### \u0423\u0434\u043e\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\n\n```python\nfrom evolution_openai import create_client, create_async_client\n\n# Sync client\nclient = create_client(key_id=\"...\", secret=\"...\", base_url=\"...\", timeout=30.0)\n\n# Async client\nasync_client = create_async_client(key_id=\"...\", secret=\"...\", base_url=\"...\", max_retries=5)\n```\n\n## \ud83d\udccb \u041f\u043e\u043b\u043d\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n\n\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0412\u0421\u0415 \u043c\u0435\u0442\u043e\u0434\u044b OpenAI SDK:\n\n```python\n# Chat API\nclient.chat.completions.create(...)\nclient.chat.completions.create(..., stream=True)\n\n# Models API\nclient.models.list()\nclient.models.retrieve(\"model_id\")\n\n# Legacy Completions\nclient.completions.create(...)\n\n# Advanced features\nclient.with_options(timeout=30).chat.completions.create(...)\nclient.chat.completions.with_raw_response.create(...)\n\n# Context manager\nwith client:\n    response = client.chat.completions.create(...)\n```\n\n\n## \ud83d\udcda \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\n\n- [API Documentation](https://cloud-ru-tech.github.io/evolution-openai-python)\n \n- [Migration Guide](https://cloud-ru-tech.github.io/evolution-openai-python/migration)\n- [Examples](https://github.com/cloud-ru-tech/evolution-openai-python/tree/main/examples/)\n- [Changelog](https://github.com/cloud-ru-tech/evolution-openai-python/tree/main/CHANGELOG.md)\n- [Environment Configuration](https://github.com/cloud-ru-tech/evolution-openai-python/tree/main/env.example)\n\n\n## \ud83c\udd98 Support\n\n- [GitHub Issues](https://github.com/cloud-ru-tech/evolution-openai-python/issues)\n- [Documentation](https://cloud-ru-tech.github.io/evolution-openai-python)\n- Email: support@cloud.ru\n\n## \ud83d\udd17 Links\n\n- [PyPI Package](https://pypi.org/project/evolution-openai/)\n- [GitHub Repository](https://github.com/cloud-ru-tech/evolution-openai-python)\n- [Cloud.ru Platform](https://cloud.ru/)\n- [OpenAI Python SDK](https://github.com/openai/openai-python) ",
    "bugtrack_url": null,
    "license": null,
    "summary": "Evolution OpenAI with automatic token management",
    "version": "1.0.4",
    "project_urls": {
        "Bug Reports": "https://github.com/cloud-ru-tech/evolution-openai-python/issues",
        "Changelog": "https://github.com/cloud-ru-tech/evolution-openai-python/blob/main/CHANGELOG.md",
        "Documentation": "https://cloud-ru-tech.github.io/evolution-openai-python/",
        "Homepage": "https://github.com/cloud-ru-tech/evolution-openai-python",
        "Repository": "https://github.com/cloud-ru-tech/evolution-openai-python.git"
    },
    "split_keywords": [
        "ai",
        " api",
        " chatgpt",
        " client",
        " cloud.ru",
        " gpt",
        " ml",
        " openai",
        " sdk"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "29a0cd628d6ee86d1426bcb93e936e39bb2f29c855c649d77173fdc6221a2ca5",
                "md5": "cbb2a9d581ecb2ae2f22e92fcf2b07b4",
                "sha256": "28e878152a729707012015845410357f811f4f4d15533f14aee7d2975968a21b"
            },
            "downloads": -1,
            "filename": "evolution_openai-1.0.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "cbb2a9d581ecb2ae2f22e92fcf2b07b4",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 14384,
            "upload_time": "2025-10-06T16:30:35",
            "upload_time_iso_8601": "2025-10-06T16:30:35.883817Z",
            "url": "https://files.pythonhosted.org/packages/29/a0/cd628d6ee86d1426bcb93e936e39bb2f29c855c649d77173fdc6221a2ca5/evolution_openai-1.0.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "88d7e90e94c0ca69eae7c5832ec1b328fd9b9ffd39a47687e53a564ccb3207a2",
                "md5": "050be407f23a4d9d864d7ea8624a79f9",
                "sha256": "5bd79c95092f9bcf590bd27bf810788fa7f115857a942ef28fceb952e1bca61e"
            },
            "downloads": -1,
            "filename": "evolution_openai-1.0.4.tar.gz",
            "has_sig": false,
            "md5_digest": "050be407f23a4d9d864d7ea8624a79f9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 49688,
            "upload_time": "2025-10-06T16:30:37",
            "upload_time_iso_8601": "2025-10-06T16:30:37.144381Z",
            "url": "https://files.pythonhosted.org/packages/88/d7/e90e94c0ca69eae7c5832ec1b328fd9b9ffd39a47687e53a564ccb3207a2/evolution_openai-1.0.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-06 16:30:37",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "cloud-ru-tech",
    "github_project": "evolution-openai-python",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "evolution-openai"
}
        
Elapsed time: 1.81735s