Código
OpenAI Agents SDK
O Agents SDK roda no nokeep pelo chat completions. Dê a ele um AsyncOpenAI com a URL base do nokeep e envolva o modelo em OpenAIChatCompletionsModel.
Verificado em 29 de outubro de 2026
Instalar e conectar
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)O SDK chama a Responses API (/v1/responses) a menos que se diga o contrário, e o nokeep só tem chat completions. Envolver o modelo em OpenAIChatCompletionsModel é o que faz funcionar.
Ou defina uma vez para todos os agentes
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")Os agentes então recebem o id do modelo como string simples. Os handoffs entre agentes funcionam do mesmo jeito.
Ferramentas
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)O SDK envia cada ferramenta com strict: true e roda o loop: o modelo pede uma ferramenta, o SDK a executa e devolve o resultado até o modelo responder. Veja Chamadas de ferramentas.
Streaming e uso
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())O SDK pede o uso no stream, então context_wrapper.usage guarda a contagem de tokens da execução inteira, com todas as chamadas ao modelo somadas.
Esforço de raciocínio e outras configurações
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
),
)O raciocínio conta no max_tokens, então dê espaço a um agente que pensa. Veja Raciocínio.
Armadilhas
- `reasoning_effort` aceita só os valores do próprio modelo.
deepseek-v4.1-flash-uncensoredaceitanone,low,high,max;glm-5.3-flash-uncensoredaceitalow,high. Os valoresminimal,mediumexhighde outros apps rodam no nível mais próximo do modelo (mediumcomohigh,xhighcomomaxonde o modelo tem esse nível); qualquer outro valor recebe400 invalid_reasoning_effort. Veja Raciocínio. - O GLM escolhe as próprias ferramentas.
glm-5.3-flash-uncensoredaceita sótool_choiceautoounone. Forçar uma ferramenta (required, ou citar um nome de função) recebe400 unsupported_tool_choice. Use o DeepSeek quando precisar forçar uma. No SDK isso éModelSettings(tool_choice="required"), ou um nome de ferramenta. - Campos que um modelo não aceita são descartados, não recusados. A chamada ainda responde, e o cabeçalho de resposta
x-nokeep-ignoreddiz o que ficou de fora. O GLM mantém sótools,tool_choiceereasoning_effort, então seustemperatureeresponse_formatsão descartados. Veja quais campos cada modelo aceita. - Só chat completions. Não existe
/v1/responsesnem/v1/embeddings; um framework que usa um dos dois por padrão precisa ser apontado para chat completions, e embeddings precisam de outro provedor.
Ferramentas hospedadas, como busca na web, busca em arquivos e interpretador de código, rodam nos servidores da própria OpenAI pela Responses API. Elas não funcionam com nenhuma outra API, o nokeep inclusive. Escreva-as como ferramentas de função.
Perguntas
Preciso também de uma chave da OpenAI?
Não. Toda chamada de modelo vai para o nokeep com a sua chave do nokeep. O rastreamento envia dados para o painel da OpenAI; com o rastreamento ligado e sem chave da OpenAI definida, o SDK imprime OPENAI_API_KEY is not set, skipping trace export e o agente roda do mesmo jeito. set_tracing_disabled(True) mantém isso quieto.
Qual modelo um agente deve usar?
deepseek-v4.1-flash-uncensored: ele consegue ser levado a chamar uma ferramenta, lê imagens e aceita todas as configurações. glm-5.3-flash-uncensored custa menos e funciona para agentes que deixam o modelo escolher as próprias ferramentas.