Код
OpenAI Agents SDK
Agents SDK работает с nokeep через chat completions. Передайте ему клиент AsyncOpenAI с базовым URL nokeep и оберните модель в OpenAIChatCompletionsModel.
Проверено 29 октября 2026 г.
Установка и подключение
pip install openai-agents
export NOKEEP_API_KEY="sk-nokeep-test" # your own key once it connectsimport 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.
Или задайте один раз для всех агентов
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 модели как обычную строку. Передача управления между агентами работает так же.
Инструменты
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 его выполняет и отправляет результат обратно, пока модель не ответит. См. Вызовы инструментов.
Потоковая передача и использование
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 и другие настройки
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_choiceautoили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 стоит дешевле и подходит агентам, которые дают модели самой выбирать инструменты.