Перейти к содержанию
Вся документация

Код

OpenAI Agents SDK

Agents SDK работает с nokeep через chat completions. Передайте ему клиент AsyncOpenAI с базовым URL nokeep и оберните модель в OpenAIChatCompletionsModel.

Проверено 29 октября 2026 г.

Установка и подключение

Shell
pip install openai-agents
export NOKEEP_API_KEY="sk-nokeep-test"  # your own key once it connects
agent.py
import os
from openai import AsyncOpenAI
from agents import Agent, OpenAIChatCompletionsModel, set_tracing_disabled

client = AsyncOpenAI(
    base_url="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
)
set_tracing_disabled(True)  # traces go to OpenAI's dashboard, which a nokeep key can't reach

model = OpenAIChatCompletionsModel(model="deepseek-v4.1-flash-uncensored", openai_client=client)

from agents import Runner

agent = Agent(name="Editor", instructions="You are a blunt editor.", model=model)
result = Runner.run_sync(agent, "Cut this opening line to ten words: ...")
print(result.final_output)

SDK вызывает Responses API (/v1/responses), если не сказано иначе, а у nokeep есть только chat completions. Работает это именно благодаря тому, что модель обёрнута в OpenAIChatCompletionsModel.

Или задайте один раз для всех агентов

Python
import os
from openai import AsyncOpenAI
from agents import Agent, set_default_openai_api, set_default_openai_client, set_tracing_disabled

set_default_openai_client(AsyncOpenAI(base_url="https://nokeep.ai/v1", api_key=os.environ["NOKEEP_API_KEY"]), use_for_tracing=False)
set_default_openai_api("chat_completions")
set_tracing_disabled(True)

agent = Agent(name="Editor", instructions="You are a blunt editor.", model="deepseek-v4.1-flash-uncensored")

Затем агенты принимают id модели как обычную строку. Передача управления между агентами работает так же.

Инструменты

Python
from agents import Agent, Runner, function_tool

@function_tool
def get_weather(city: str) -> str:
    """Get the weather in a city."""
    return f"18°C and clear in {city}"

agent = Agent(
    name="Weather",
    instructions="Answer questions about the weather.",
    model=model,
    tools=[get_weather],
)
print(Runner.run_sync(agent, "What's the weather in Lisbon?").final_output)

SDK отправляет каждый инструмент с strict: true и запускает цикл: модель запрашивает инструмент, SDK его выполняет и отправляет результат обратно, пока модель не ответит. См. Вызовы инструментов.

Потоковая передача и использование

Python
import asyncio
from agents import Runner
from openai.types.responses import ResponseTextDeltaEvent

async def main():
    result = Runner.run_streamed(agent, "Tell me a story in three lines.")
    async for event in result.stream_events():
        if event.type == "raw_response_event" and isinstance(event.data, ResponseTextDeltaEvent):
            print(event.data.delta, end="", flush=True)
    print("\n", result.context_wrapper.usage)

asyncio.run(main())

SDK запрашивает использование в потоке, поэтому context_wrapper.usage содержит количество токенов за весь запуск, суммируя все вызовы модели.

Reasoning effort и другие настройки

Python
from agents import Agent, ModelSettings
from openai.types.shared import Reasoning

planner = Agent(
    name="Planner",
    instructions="Plan before you answer.",
    model=model,
    model_settings=ModelSettings(
        reasoning=Reasoning(effort="high"),  # sent as reasoning_effort
        max_tokens=4000,
        extra_body={"min_p": 0.05},  # fields ModelSettings has no argument for
    ),
)

Размышления входят в max_tokens, поэтому дайте агенту, который размышляет, запас. См. Размышления.

Подводные камни

  • `reasoning_effort` принимает только собственные значения модели. deepseek-v4.1-flash-uncensored принимает none, low, high, max; glm-5.3-flash-uncensored принимает low, high. minimal, medium и xhigh из других приложений работают на ближайшем уровне модели (medium как high, xhigh как max, где он есть у модели); любое другое значение получает 400 invalid_reasoning_effort. См. Размышления.
  • GLM выбирает инструменты сам. glm-5.3-flash-uncensored принимает только tool_choice auto или none. Принудительный выбор инструмента (required или имя функции) получает 400 unsupported_tool_choice. Если нужно принудительно выбрать инструмент, используйте DeepSeek. В SDK это ModelSettings(tool_choice="required") или имя инструмента.
  • Поля, которые модель не принимает, отбрасываются, а не отклоняются. Вызов всё равно получает ответ, а заголовок ответа x-nokeep-ignored называет, что было пропущено. GLM оставляет только tools, tool_choice и reasoning_effort, поэтому его temperature и response_format отбрасываются. См. какие поля принимает каждая модель.
  • Только chat completions. Нет /v1/responses и /v1/embeddings; фреймворк, который по умолчанию использует одно из них, нужно направить на chat completions, а эмбеддинги нужны от другого провайдера.

Встроенные инструменты, такие как веб-поиск, поиск по файлам и интерпретатор кода, работают на серверах OpenAI через Responses API. С любым другим API они не работают, включая nokeep. Оформляйте их как функциональные инструменты.

Вопросы

Нужен ли ещё ключ OpenAI?

Нет. Каждый вызов модели идёт в nokeep с вашим ключом nokeep. Трассировка загружается в панель OpenAI; если трассировка включена и ключ OpenAI не задан, SDK выводит OPENAI_API_KEY is not set, skipping trace export, а агент всё равно работает. set_tracing_disabled(True) убирает это сообщение.

Какую модель должен использовать агент?

deepseek-v4.1-flash-uncensored: его можно заставить вызвать инструмент, он читает изображения и принимает все настройки. glm-5.3-flash-uncensored стоит дешевле и подходит агентам, которые дают модели самой выбирать инструменты.