Đi tới nội dung
Tất cả tài liệu

Code

OpenAI Agents SDK

Agents SDK chạy trên nokeep qua chat completions. Đưa cho nó một AsyncOpenAI client với base URL của nokeep và bọc mô hình trong OpenAIChatCompletionsModel.

Đã kiểm tra 29 tháng 10, 2026

Cài đặt và kết nối

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 gọi Responses API (/v1/responses) trừ khi được chỉ định khác, và nokeep chỉ có chat completions. Bọc mô hình trong OpenAIChatCompletionsModel chính là điều làm nó chạy được.

Hoặc đặt một lần cho mọi agent

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

Khi đó các agent nhận id mô hình như một chuỗi thường. Chuyển giao giữa các agent hoạt động y như vậy.

Công cụ

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 gửi mỗi công cụ với strict: true và tự chạy vòng lặp: mô hình yêu cầu một công cụ, SDK chạy nó và gửi kết quả lại, cho tới khi mô hình trả lời. Xem Gọi công cụ.

Streaming và mức dùng

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 yêu cầu thông tin mức dùng khi streaming, nên context_wrapper.usage chứa số token của cả lần chạy, cộng dồn mọi lệnh gọi mô hình.

Reasoning effort và các thiết lập khác

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

Phần thinking được tính vào max_tokens, nên hãy để đủ chỗ cho một agent có suy nghĩ. Xem Thinking.

Những điều cần lưu ý

  • `reasoning_effort` chỉ nhận giá trị riêng của mô hình. deepseek-v4.1-flash-uncensored nhận none, low, high, max; glm-5.3-flash-uncensored nhận low, high. Các giá trị minimal, medium và xhigh của ứng dụng khác sẽ chạy ở mức gần nhất mà mô hình hỗ trợ (medium thành high, xhigh thành max nơi mô hình có mức đó); mọi giá trị khác nhận 400 invalid_reasoning_effort. Xem Thinking.
  • GLM tự chọn công cụ. glm-5.3-flash-uncensored chỉ nhận tool_choice là auto hoặc none. Ép buộc một công cụ (required, hoặc nêu tên một hàm) sẽ nhận 400 unsupported_tool_choice. Dùng DeepSeek khi bạn cần ép chọn một công cụ. Trong SDK, điều đó là ModelSettings(tool_choice="required"), hoặc một tên công cụ.
  • Trường mà mô hình không nhận được sẽ bị bỏ, không bị từ chối. Lệnh gọi vẫn được trả lời, và header phản hồi x-nokeep-ignored nêu tên những gì đã bị bỏ. GLM chỉ giữ tools, tool_choice và reasoning_effort, nên temperature và response_format của nó bị bỏ. Xem mỗi mô hình nhận những trường nào.
  • Chỉ có chat completions. Không có /v1/responses và không có /v1/embeddings; framework nào mặc định dùng một trong hai cần được trỏ sang chat completions, và embeddings cần một provider khác.

Công cụ được host sẵn, như tìm kiếm web, tìm kiếm tệp và trình thông dịch code, chạy trên máy chủ riêng của OpenAI thông qua Responses API. Chúng không hoạt động với bất kỳ API nào khác, kể cả nokeep. Hãy viết chúng thành công cụ hàm.

Câu hỏi

Tôi có cần khóa OpenAI nữa không?

Không. Mọi lệnh gọi mô hình đều đi tới nokeep bằng khóa nokeep của bạn. Phần theo dõi (tracing) được tải lên bảng điều khiển của OpenAI; nếu bật tracing mà không đặt khóa OpenAI, SDK sẽ in OPENAI_API_KEY is not set, skipping trace export và agent vẫn chạy. set_tracing_disabled(True) giúp tắt thông báo này.

Agent nên dùng mô hình nào?

deepseek-v4.1-flash-uncensored: có thể được buộc gọi công cụ, đọc được hình ảnh và nhận mọi thiết lập. glm-5.3-flash-uncensored rẻ hơn và phù hợp với các agent để mô hình tự chọn công cụ.