Skip to content

Commit 8f2c7b8

Browse files
author
Gudynin Danila
committed
fix:
- remove foundation-models-support - refactor workflow with async token renew
1 parent 7ecbc82 commit 8f2c7b8

35 files changed

Lines changed: 654 additions & 2456 deletions

.github/workflows/ci.yml

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,4 @@ jobs:
198198
EVOLUTION_KEY_ID: ${{ secrets.EVOLUTION_KEY_ID }}
199199
EVOLUTION_SECRET: ${{ secrets.EVOLUTION_SECRET }}
200200
EVOLUTION_BASE_URL: ${{ secrets.EVOLUTION_BASE_URL }}
201-
run: make run-tokens
202-
203-
- name: Run foundation models examples
204-
env:
205-
EVOLUTION_KEY_ID: ${{ secrets.EVOLUTION_KEY_ID }}
206-
EVOLUTION_SECRET: ${{ secrets.EVOLUTION_SECRET }}
207-
EVOLUTION_BASE_URL: ${{ secrets.EVOLUTION_BASE_URL }}
208-
EVOLUTION_PROJECT_ID: ${{ secrets.EVOLUTION_PROJECT_ID }}
209-
run: make run-foundation-models
201+
run: make run-tokens

Makefile

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ help:
2424
@echo " run-streaming Run streaming examples"
2525
@echo " run-async Run async examples"
2626
@echo " run-tokens Run token management examples"
27-
@echo " run-foundation-models Run foundation models examples"
27+
@echo ""
2828
@echo ""
2929
@echo "Build:"
3030
@echo " clean Clean build artifacts"
@@ -59,8 +59,7 @@ shell:
5959
test:
6060
rye run pytest tests/ -v --cov=evolution_openai --cov-report=html --cov-report=term --cov-report=xml:coverage.xml --cov-report=json:coverage.json
6161

62-
test-foundation-models:
63-
rye run pytest tests/test_foundation_models_*.py -v
62+
6463

6564
# Code quality
6665
lint:
@@ -213,9 +212,7 @@ run-tokens:
213212
@if [ -f .env ]; then echo "Загружение переменных окружения из файла .env..."; export $$(grep -v '^#' .env | xargs); fi; \
214213
rye run python examples/token_management.py
215214

216-
run-foundation-models:
217-
@if [ -f .env ]; then echo "Загружение переменных окружения из файла .env..."; export $$(grep -v '^#' .env | xargs); fi; \
218-
rye run python examples/foundation_models_example.py
215+
219216

220217
# Package info
221218
info:

README.md

Lines changed: 16 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,14 @@
1010
-**100% совместимость** с официальным OpenAI Python SDK
1111
-**Автоматическое управление токенами** Cloud.ru
1212
-**Drop-in replacement** - минимальные изменения в коде
13-
-**Async/await поддержка** с `AsyncOpenAI`
13+
-**Async/await поддержка** с `EvolutionAsyncOpenAI`
1414
-**Streaming responses** поддержка
1515
-**Thread-safe** token management
1616
-**Автоматическое обновление** токенов за 30 секунд до истечения
1717
-**Retry логика** при ошибках авторизации
1818
-**Поддержка .env файлов** для управления конфигурацией
1919
-**Интеграционные тесты** с реальным API
20-
-**Evolution Foundation Models** поддержка с `project_id`
21-
-**Готовые примеры** для Foundation Models
22-
-**Передовые AI модели** включая DeepSeek-R1, Qwen2.5 и другие
20+
2321

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

@@ -38,26 +36,17 @@ from openai import OpenAI
3836
client = OpenAI(api_key="sk-...")
3937

4038
# ✅ СТАЛО (Evolution OpenAI)
41-
from evolution_openai import OpenAI
39+
from evolution_openai import EvolutionOpenAI
4240

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

50-
# Для Evolution Foundation Models
51-
client = OpenAI(
52-
key_id="your_key_id",
53-
secret="your_secret",
54-
base_url="https://foundation-models.api.cloud.ru/api/gigacube/openai/v1",
55-
project_id="your_project_id" # Для Evolution Foundation Models
56-
)
57-
58-
# Все остальное работает ТОЧНО ТАК ЖЕ!
5948
response = client.chat.completions.create(
60-
model="default", # или "deepseek-ai/DeepSeek-R1-Distill-Llama-70B" для Foundation Models
49+
model="default",
6150
messages=[{"role": "user", "content": "Hello!"}]
6251
)
6352
```
@@ -67,10 +56,10 @@ response = client.chat.completions.create(
6756
#### Обычное использование
6857

6958
```python
70-
from evolution_openai import OpenAI
59+
from evolution_openai import EvolutionOpenAI
7160

7261
# Инициализация client для обычного использования
73-
client = OpenAI(
62+
client = EvolutionOpenAI(
7463
key_id="your_key_id",
7564
secret="your_secret",
7665
base_url="https://your-model-endpoint.cloud.ru/v1"
@@ -89,38 +78,7 @@ response = client.chat.completions.create(
8978
print(response.choices[0].message.content)
9079
```
9180

92-
#### 🚀 Evolution Foundation Models
93-
94-
Библиотека полностью поддерживает **Evolution Foundation Models** - платформу для работы с передовыми AI моделями на Cloud.ru. Ключевые возможности:
95-
96-
- **Автоматическое управление Project ID** - добавляет заголовок `x-project-id` автоматически
97-
- **Передовые модели** - DeepSeek-R1, Qwen2.5, RefalMachine/RuadaptQwen2.5-7B-Lite-Beta
98-
- **Специальный endpoint** - `https://foundation-models.api.cloud.ru/api/gigacube/openai/v1`
99-
- **Полная совместимость** с OpenAI SDK - все методы работают идентично
100-
101-
```python
102-
from evolution_openai import OpenAI
103-
104-
# Инициализация для Evolution Foundation Models
105-
client = OpenAI(
106-
key_id="your_key_id",
107-
secret="your_secret",
108-
base_url="https://foundation-models.api.cloud.ru/api/gigacube/openai/v1",
109-
project_id="your_project_id" # Автоматически добавляется в заголовки
110-
)
111-
112-
# Использование Foundation Models
113-
response = client.chat.completions.create(
114-
model="deepseek-ai/DeepSeek-R1-Distill-Llama-70B",
115-
messages=[
116-
{"role": "system", "content": "You are a helpful assistant."},
117-
{"role": "user", "content": "What is artificial intelligence?"},
118-
],
119-
max_tokens=150
120-
)
121-
122-
print(response.choices[0].message.content)
123-
```
81+
12482

12583
### Streaming
12684

@@ -132,12 +90,7 @@ stream = client.chat.completions.create(
13290
stream=True
13391
)
13492

135-
# Для Foundation Models
136-
stream = client.chat.completions.create(
137-
model="deepseek-ai/DeepSeek-R1-Distill-Llama-70B",
138-
messages=[{"role": "user", "content": "Tell me a story"}],
139-
stream=True
140-
)
93+
14194

14295
for chunk in stream:
14396
if chunk.choices[0].delta.content:
@@ -148,27 +101,17 @@ for chunk in stream:
148101

149102
```python
150103
import asyncio
151-
from evolution_openai import AsyncOpenAI
104+
from evolution_openai import EvolutionAsyncOpenAI
152105

153106

154107
async def main():
155-
# Для обычного использования
156-
client = AsyncOpenAI(
108+
client = EvolutionAsyncOpenAI(
157109
key_id="your_key_id",
158110
secret="your_secret",
159111
base_url="https://your-model-endpoint.cloud.ru/v1",
160112
)
161-
162-
# Для Foundation Models
163-
client = AsyncOpenAI(
164-
key_id="your_key_id",
165-
secret="your_secret",
166-
base_url="https://foundation-models.api.cloud.ru/api/gigacube/openai/v1",
167-
project_id="your_project_id", # Опционально для Foundation Models
168-
)
169-
170113
response = await client.chat.completions.create(
171-
model="deepseek-ai/DeepSeek-R1-Distill-Llama-70B", # или "default" для обычного использования
114+
model="default",
172115
messages=[{"role": "user", "content": "Async hello!"}]
173116
)
174117

@@ -201,32 +144,20 @@ ENABLE_INTEGRATION_TESTS=false
201144
LOG_LEVEL=INFO
202145
```
203146

204-
#### Для Evolution Foundation Models:
205-
206-
```bash
207-
# .env файл для Foundation Models
208-
EVOLUTION_KEY_ID=your_key_id_here
209-
EVOLUTION_SECRET=your_secret_here
210-
EVOLUTION_BASE_URL=https://foundation-models.api.cloud.ru/api/gigacube/openai/v1
211-
EVOLUTION_PROJECT_ID=your_project_id_here # Обязательно для Foundation Models
212-
EVOLUTION_TOKEN_URL=https://iam.api.cloud.ru/api/v1/auth/token
213-
ENABLE_INTEGRATION_TESTS=false
214-
LOG_LEVEL=INFO
215-
```
147+
216148

217149
```python
218150
import os
219-
from evolution_openai import OpenAI
151+
from evolution_openai import EvolutionOpenAI
220152
from dotenv import load_dotenv
221153

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

225-
client = OpenAI(
157+
client = EvolutionOpenAI(
226158
key_id=os.getenv("EVOLUTION_KEY_ID"),
227159
secret=os.getenv("EVOLUTION_SECRET"),
228160
base_url=os.getenv("EVOLUTION_BASE_URL"),
229-
project_id=os.getenv("EVOLUTION_PROJECT_ID"), # Опционально для Foundation Models
230161
)
231162
```
232163

@@ -271,7 +202,7 @@ with client:
271202
## 📚 Документация
272203

273204
- [API Documentation](https://cloud-ru-tech.github.io/evolution-openai-python)
274-
- [Evolution Foundation Models Guide](https://cloud-ru-tech.github.io/evolution-openai-python/foundation_models)
205+
275206
- [Migration Guide](https://cloud-ru-tech.github.io/evolution-openai-python/migration)
276207
- [Examples](examples/)
277208
- [Changelog](CHANGELOG.md)

docs/async_usage.rst

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ Evolution OpenAI полностью поддерживает асинхронн
1212
.. code-block:: python
1313
1414
import asyncio
15-
from evolution_openai import AsyncOpenAI
15+
from evolution_openai import EvolutionAsyncOpenAI
1616
1717
async def main():
18-
client = AsyncOpenAI(
18+
client = EvolutionAsyncOpenAI(
1919
key_id="your_key_id",
2020
secret="your_secret",
2121
base_url="https://your-endpoint.cloud.ru/v1"
@@ -33,7 +33,7 @@ Evolution OpenAI полностью поддерживает асинхронн
3333
.. code-block:: python
3434
3535
async def simple_request():
36-
client = AsyncOpenAI(
36+
client = EvolutionAsyncOpenAI(
3737
key_id="your_key_id",
3838
secret="your_secret",
3939
base_url="https://your-endpoint.cloud.ru/v1"
@@ -59,7 +59,7 @@ Context Manager
5959
.. code-block:: python
6060
6161
async def with_context_manager():
62-
async with AsyncOpenAI(
62+
async with EvolutionAsyncOpenAI(
6363
key_id="your_key_id",
6464
secret="your_secret",
6565
base_url="https://your-endpoint.cloud.ru/v1"
@@ -83,7 +83,7 @@ Context Manager
8383
.. code-block:: python
8484
8585
async def parallel_requests():
86-
async with AsyncOpenAI(
86+
async with EvolutionAsyncOpenAI(
8787
key_id="your_key_id",
8888
secret="your_secret",
8989
base_url="https://your-endpoint.cloud.ru/v1"
@@ -127,7 +127,7 @@ Context Manager
127127
print(f"Запрос {index} завершен")
128128
return response.choices[0].message.content
129129
130-
async with AsyncOpenAI(
130+
async with EvolutionAsyncOpenAI(
131131
key_id="your_key_id",
132132
secret="your_secret",
133133
base_url="https://your-endpoint.cloud.ru/v1"
@@ -154,7 +154,7 @@ Context Manager
154154
.. code-block:: python
155155
156156
async def async_streaming():
157-
async with AsyncOpenAI(
157+
async with EvolutionAsyncOpenAI(
158158
key_id="your_key_id",
159159
secret="your_secret",
160160
base_url="https://your-endpoint.cloud.ru/v1"
@@ -186,7 +186,7 @@ Try-except с async
186186
187187
async def error_handling_example():
188188
try:
189-
async with AsyncOpenAI(
189+
async with EvolutionAsyncOpenAI(
190190
key_id="your_key_id",
191191
secret="your_secret",
192192
base_url="https://your-endpoint.cloud.ru/v1"
@@ -218,7 +218,7 @@ Graceful shutdown
218218
self.running = True
219219
220220
async def start(self):
221-
self.client = AsyncOpenAI(
221+
self.client = EvolutionAsyncOpenAI(
222222
key_id="your_key_id",
223223
secret="your_secret",
224224
base_url="https://your-endpoint.cloud.ru/v1"
@@ -265,7 +265,7 @@ Graceful shutdown
265265
266266
async def __aenter__(self):
267267
for i in range(self.pool_size):
268-
client = AsyncOpenAI(
268+
client = EvolutionAsyncOpenAI(
269269
key_id="your_key_id",
270270
secret="your_secret",
271271
base_url="https://your-endpoint.cloud.ru/v1"
@@ -331,7 +331,7 @@ Graceful shutdown
331331
# Создаем очередь и клиент
332332
queue = asyncio.Queue(maxsize=20)
333333
334-
async with AsyncOpenAI(
334+
async with EvolutionAsyncOpenAI(
335335
key_id="your_key_id",
336336
secret="your_secret",
337337
base_url="https://your-endpoint.cloud.ru/v1"
@@ -375,7 +375,7 @@ FastAPI пример
375375
376376
from fastapi import FastAPI
377377
from pydantic import BaseModel
378-
from evolution_openai import AsyncOpenAI
378+
from evolution_openai import EvolutionAsyncOpenAI
379379
380380
app = FastAPI()
381381
@@ -392,7 +392,7 @@ FastAPI пример
392392
@app.on_event("startup")
393393
async def startup_event():
394394
global client
395-
client = AsyncOpenAI(
395+
client = EvolutionAsyncOpenAI(
396396
key_id="your_key_id",
397397
secret="your_secret",
398398
base_url="https://your-endpoint.cloud.ru/v1"
@@ -422,7 +422,7 @@ aiohttp пример
422422
.. code-block:: python
423423
424424
from aiohttp import web
425-
from evolution_openai import AsyncOpenAI
425+
from evolution_openai import EvolutionAsyncOpenAI
426426
427427
async def chat_handler(request):
428428
data = await request.json()
@@ -444,7 +444,7 @@ aiohttp пример
444444
app = web.Application()
445445
446446
# Инициализация клиента
447-
app['openai_client'] = AsyncOpenAI(
447+
app['openai_client'] = EvolutionAsyncOpenAI(
448448
key_id="your_key_id",
449449
secret="your_secret",
450450
base_url="https://your-endpoint.cloud.ru/v1"

0 commit comments

Comments
 (0)