Pular para o conteúdo
Toda a documentação

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

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)

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

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")

Os agentes então recebem o id do modelo como string simples. Os handoffs entre agentes funcionam do mesmo jeito.

Ferramentas

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)

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

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())

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

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
    ),
)

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-uncensored aceita none, low, high, max; glm-5.3-flash-uncensored aceita low, high. Os valores minimal, medium e xhigh de outros apps rodam no nível mais próximo do modelo (medium como high, xhigh como max onde o modelo tem esse nível); qualquer outro valor recebe 400 invalid_reasoning_effort. Veja Raciocínio.
  • O GLM escolhe as próprias ferramentas. glm-5.3-flash-uncensored aceita só tool_choice auto ou none. Forçar uma ferramenta (required, ou citar um nome de função) recebe 400 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-ignored diz o que ficou de fora. O GLM mantém só tools, tool_choice e reasoning_effort, então seus temperature e response_format são descartados. Veja quais campos cada modelo aceita.
  • Só chat completions. Não existe /v1/responses nem /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.