Zum Inhalt springen
Gesamte Doku

Code

OpenAI Agents SDK

Das Agents SDK läuft auf nokeep über Chat-Completions. Geben Sie ihm einen AsyncOpenAI-Client mit der Basis-URL von nokeep und verpacken Sie das Modell in OpenAIChatCompletionsModel.

Geprüft am 29. Oktober 2026

Installieren und verbinden

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)

Das SDK ruft die Responses API (/v1/responses) auf, sofern Sie nichts anderes sagen, und nokeep hat nur Chat-Completions. Dass Sie das Modell in OpenAIChatCompletionsModel verpacken, lässt es funktionieren.

Oder einmal für alle Agenten setzen

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

Agenten nehmen dann die Modell-ID als einfache Zeichenkette. Übergaben zwischen Agenten funktionieren genauso.

Tools

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)

Das SDK schickt jedes Tool mit strict: true und führt die Schleife aus: Das Modell fordert ein Tool an, das SDK führt es aus und schickt das Ergebnis zurück, bis das Modell antwortet. Siehe Tool-Aufrufe.

Streaming und Nutzung

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

Das SDK fordert die Nutzung bei einem Stream an, daher enthält context_wrapper.usage die Token-Zahlen für den ganzen Lauf, alle Modellaufrufe zusammengezählt.

Reasoning-Aufwand und andere Einstellungen

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

Thinking zählt auf max_tokens, also geben Sie einem denkenden Agenten Raum. Siehe Thinking.

Stolperfallen

  • `reasoning_effort` nimmt nur die eigenen Werte des Modells. deepseek-v4.1-flash-uncensored nimmt none, low, high, max; glm-5.3-flash-uncensored nimmt low, high. Die minimal-, medium- und xhigh-Werte anderer Apps laufen auf der nächsten Stufe des Modells (medium als high, xhigh als max, wo das Modell sie hat); jeder andere Wert ergibt 400 invalid_reasoning_effort. Siehe Thinking.
  • GLM wählt seine Tools selbst. glm-5.3-flash-uncensored nimmt tool_choice nur als auto oder none. Ein erzwungenes Tool (required oder ein benannter Funktionsname) ergibt 400 unsupported_tool_choice. Nehmen Sie DeepSeek, wenn Sie eines erzwingen müssen. Im SDK ist das ModelSettings(tool_choice="required") oder ein Tool-Name.
  • Felder, die ein Modell nicht annimmt, werden verworfen, nicht abgelehnt. Der Aufruf wird trotzdem beantwortet, und der Antwort-Header x-nokeep-ignored nennt, was weggelassen wurde. GLM behält nur tools, tool_choice und reasoning_effort; daher werden seine temperature und response_format verworfen. Siehe welche Felder jedes Modell annimmt.
  • Nur Chat-Completions. Es gibt kein /v1/responses und kein /v1/embeddings; ein Framework, das standardmäßig eines davon nutzt, muss auf Chat-Completions umgestellt werden, und Embeddings brauchen einen anderen Anbieter.

Gehostete Tools wie Websuche, Dateisuche und Code-Interpreter laufen auf den eigenen Servern von OpenAI über die Responses API. Sie funktionieren mit keiner anderen API, nokeep eingeschlossen. Schreiben Sie sie als Funktions-Tools.

Fragen

Brauche ich auch einen OpenAI-Schlüssel?

Nein. Jeder Modellaufruf geht mit Ihrem nokeep-Schlüssel an nokeep. Das Tracing lädt in das Dashboard von OpenAI hoch; mit eingeschaltetem Tracing und ohne gesetzten OpenAI-Schlüssel gibt das SDK OPENAI_API_KEY is not set, skipping trace export aus, und der Agent läuft trotzdem. set_tracing_disabled(True) hält es still.

Welches Modell sollte ein Agent nutzen?

deepseek-v4.1-flash-uncensored: es lässt sich zu einem Tool-Aufruf bringen, liest Bilder und nimmt jede Einstellung an. glm-5.3-flash-uncensored kostet weniger und funktioniert für Agenten, die das Modell seine Tools selbst wählen lassen.