调用大模型API

OpenAI Python 库是官方提供的工具包,让你能在 Python 应用中便捷地调用 OpenAI 的强大模型。它的核心用途是简化与 OpenAI REST API 的交互,并提供了同步/异步客户端以及完整的类型定义。

下面是它的基本使用方法。

安装

在开始之前,需要完成安装和API密钥配置两步。

安装库

通过 pip 即可从 PyPI 安装。库要求 Python 3.9 或更高版本。

bash 复制代码
pip install openai

核心用法

OpenAI Python 库目前支持两种主要的文本生成接口:Responses API (推荐)和 Chat Completions API。

方式一:Responses API(推荐的新标准)

这是与 OpenAI 模型交互的首要 API,提供了更简洁的接口。

python 复制代码
import os
from openai import OpenAI

client = OpenAI(
    api_key="sk-123",
    base_url="https://api.qnaigc.com/v1",
)

response = client.responses.create(
    model="deepseek/deepseek-v4.1-flash-1017",
    instructions="You are a coding assistant that talks like a pirate.", # 系统级指令
    input="How do I check if a Python object is an instance of a class?", # 用户输入
)

print(response.output_text)

这段代码会让模型扮演一个"像海盗一样说话"的编程助手来回答问题,并直接打印生成的文本。

方式二:Chat Completions API(经典接口)

这是之前的标准接口,目前仍被无限期支持,适合需要更精细控制对话角色的场景。

python 复制代码
from openai import OpenAI

client = OpenAI(
    api_key="sk-123",
    base_url="https://api.qnaigc.com/v1",
)

completion = client.chat.completions.create(
    model="deepseek/deepseek-v4.1-flash-1017",
    messages=[
        {"role": "developer", "content": "Talk like a pirate."}, # 开发者指令(类似系统角色)
        {"role": "user", "content": "How do I check if a Python object is an instance of a class?"},
    ],
)

print(completion.choices[0].message.content)

关键区别 :Chat Completions API 通过 messages 列表来构建对话上下文,其中 role 可以是 developer(系统级指令)、user(用户消息)或 assistant(模型之前的回复)。

不用 openai SDK 后,本质就是用 requests 发 HTTP POST JSON 请求。等价的 requests 写法:Chat Completions

python 复制代码
import os
import requests

API_KEY = os.getenv("LLM_API_KEY", "sk-123") 
BASE_URL = os.getenv("LLM_BASE_URL", "https://api.qnaigc.com/v1").rstrip("/")
MODEL = os.getenv("LLM_MODEL", "deepseek/deepseek-v4.1-flash-1017")

headers = {
    "Content-Type": "application/json",
}

# 本地模型没有 key 时可以不传 Authorization
if API_KEY:
    headers["Authorization"] = f"Bearer {API_KEY}"

payload = {
    "model": MODEL,
    "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "你好,简单介绍一下你自己"},
    ],
    "temperature": 0.7,
}

try:
    resp = requests.post(
        f"{BASE_URL}/chat/completions",
        headers=headers,
        json=payload,
        timeout=60,
    )
    resp.raise_for_status()
    data = resp.json()

    print(data["choices"][0]["message"]["content"])

except requests.RequestException as e:
    print("请求失败:", e)
    if "resp" in locals():
        print("状态码:", resp.status_code)
        print("响应内容:", resp.text)

代码的模型配置参数使用的是七牛云厂商提供,如果你还没有API_KEY,那么可以尝试扫码注册领取token,然后开发你的agent应用。

源码

我希望简单模拟自己实现一个类似OpenAI的调用方式。核心就是把 client.chat.completions.create(...) 这种链式属性访问用普通类模拟出来,再把 HTTP 返回的 JSON 递归包装成可以用 . 访问的对象。下面是一个可以直接运行的最小实现。

一、完整代码

python 复制代码
import os
import requests
from types import SimpleNamespace


class APIError(Exception):
    def __init__(self, status_code, body):
        self.status_code = status_code
        self.body = body
        super().__init__(f"API error {status_code}: {body}")


def _wrap(obj):
    """递归把 dict/list 转成可用 . 属性访问的对象。"""
    if isinstance(obj, dict):
        return SimpleNamespace(**{k: _wrap(v) for k, v in obj.items()})
    if isinstance(obj, list):
        return [_wrap(x) for x in obj]
    return obj


class Completions:
    def __init__(self, client):
        self._client = client

    def create(self, *, model, messages, **kwargs):
        payload = {"model": model, "messages": messages, **kwargs}
        return self._client._post("/chat/completions", payload)


class Chat:
    def __init__(self, client):
        self.completions = Completions(client)


class OpenAI:
    def __init__(self, api_key=None, base_url=None, timeout=60):
        self.api_key = api_key or os.getenv("OPENAI_API_KEY")
        self.base_url = (
            base_url or os.getenv("OPENAI_BASE_URL") or "https://api.openai.com/v1"
        ).rstrip("/")
        self.timeout = timeout
        # 关键:把 chat 挂成实例属性,形成链式访问
        self.chat = Chat(self)

    def _post(self, path, payload):
        headers = {"Content-Type": "application/json"}
        if self.api_key:
            headers["Authorization"] = f"Bearer {self.api_key}"

        resp = requests.post(
            f"{self.base_url}{path}",
            headers=headers,
            json=payload,
            timeout=self.timeout,
        )
        if not resp.ok:
            raise APIError(resp.status_code, resp.text)
        return _wrap(resp.json())

二、使用方式(和官方一模一样)

python 复制代码
client = OpenAI(
    api_key="sk-...",
    base_url="https://api.deepseek.com/v1",  # 换成你实际服务的地址
)

completion = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "Talk like a pirate."},
        {"role": "user", "content": "How do I check if a Python object is an instance of a class?"},
    ],
)

print(completion.choices[0].message.content)

三、关键设计点

  1. 链式属性访问

    client.chat → Chat 实例

    client.chat.completions → Completions 实例

    client.chat.completions.create → 方法

    只要把每一层都挂成上一层的属性,就能自然形成 client.chat.completions.create(...)。

  2. completion.choices[0].message.content 怎么来的

    HTTP 返回的是:

    json 复制代码
    {"choices": [{"message": {"content": "..."}}]}

    原生的取值是 data["choices"][0]["message"]["content"]。

    _wrap() 递归把 dict 转成 SimpleNamespace,于是就能用 .choices[0].message.content 访问。这是整个模拟里最关键的一步。

  3. create 的签名

    用 def create(self, *, model, messages, **kwargs) 显式声明 model 和 messages,其余参数透传。这样调用姿势和官方 SDK 完全一致,也方便 IDE 提示。

但作为"理解官方 SDK 内部是怎么一层层组织请求和响应"的教学实现,上面这 50 行已经覆盖了核心机制。

相关推荐
跨境小彭2 小时前
Temu 全托管模式下,SKU 利润核算的实践复盘
大数据·运维·人工智能·自动化·temu
李纲明2 小时前
WordPress 定时发布不跑、备份邮件延误:先核 WP-Cron 触发与回环,再改系统 Cron
运维·wordpress·定时任务·devdiy·wp-cron
chushiyunen3 小时前
autoHotKey、windows自动化快捷键工具
运维·windows·自动化
逆风的蚂蚁3 小时前
linux服务器性能调整怎么落地?我把 CPU 调度、I/O 优先级和内核参数这几个旋钮都拧了一遍
linux·运维·服务器
ESDWAN3 小时前
企业网络监控应该监测哪些目标?网关、网络节点还是业务系统?
服务器·网络·php
mennekes3 小时前
临时用电线路标识:插头颜色、钟面标识配套规范
运维·网络·科技·安全·制造
发光小北4 小时前
EtherNet/IP 转 ModbusTCP 网关现场应用中会遇到什么问题?
服务器·网络·tcp/ip
程序猿老A5 小时前
轻量云服务器总是卡,内存占比高?
运维·服务器
一只鹿鹿鹿6 小时前
智算算力、AI-芯片与产品解析(PPT文件)
大数据·运维·网络·人工智能·物联网·1024程序员节