🔴 OpenAI 对话格式(Python)
官方文档
📝 简介
给定一组包含对话的消息列表,模型将返回一个响应。相关指南可参阅OpenAI官网:Chat Completions
💡 Python请求示例基础文本对话 ✅
1.创建 .env 变量文件文件
-
在您的 Python 脚本(例如
xxxx.py
)所在的同一个目录下,创建一个名为.env
的文件(注意,文件名就是.env
,前面有一个点,没有其他前缀)。 -
在该
.env
文件中,输入以下内容,将您的 API 密钥和基础 URL 填入:# .env 文件内容 OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" OPENAI_BASE_URL="https://sg.uiuiapi.com/v1"
您未来还可以添加其他配置变量,例如:
DEFAULT_MODEL="gpt-4.1"
MAX_TOKENS_DEFAULT=150
### 2.创建一个`xxxx.py`文件,写入一下Python代码。
- 在您的 Python 脚本(例如 `xxxx.py`)所在的同一个目录下,创建一个名为 `.env` 的文件(注意,文件名就是 `.env`,前面有一个点,没有其他前缀)。
```python
import os
from dotenv import load_dotenv, find_dotenv # 导入 find_dotenv 帮助定位
import openai
from openai import OpenAI
import httpx
# 0. 加载 .env 文件中的环境变量 (增强调试)
print("--- 开始 .env 文件加载调试 ---")
# 尝试在当前工作目录或脚本所在目录查找 .env 文件
# find_dotenv(usecwd=True) 会优先尝试当前工作目录
# find_dotenv() (无参数) 会从脚本位置开始向上查找
dotenv_path_found = find_dotenv(usecwd=True) # 检查当前工作目录
if not dotenv_path_found:
dotenv_path_found = find_dotenv() # 如果CWD没有,则按标准方式查找(从脚本目录向上)
if dotenv_path_found:
print(f"DEBUG: 找到 .env 文件路径: {dotenv_path_found}")
# verbose=True 会打印加载过程的详细信息
# override=True 表示 .env 文件中的变量会覆盖系统中已存在的同名环境变量
loaded_successfully = load_dotenv(dotenv_path=dotenv_path_found, verbose=True, override=True)
if loaded_successfully:
print("DEBUG: 成功从 .env 文件加载变量。")
else:
# 如果 loaded_successfully 为 False,可能表示文件为空或无法解析,
# 但通常只要文件被找到且非空,python-dotenv 即使内容有问题也可能返回 True,
# 真正的判断是后续 os.getenv 是否能取到值。
print("DEBUG: .env 文件已找到,但 load_dotenv() 执行完毕 (请检查 verbose 输出和后续变量值)。")
else:
print("DEBUG: 未能找到 .env 文件。")
print("DEBUG: 请确保名为 '.env' 的文件存在于脚本所在目录或项目的根目录中。")
print("--- .env 文件加载调试结束 ---")
print("--- 开始环境变量获取调试 ---")
# 1. 从环境变量加载 API 密钥和基础 URL
api_key = os.getenv("OPENAI_API_KEY")
base_url_from_env = os.getenv("OPENAI_BASE_URL")
# 打印获取到的原始值以供调试
print(f"DEBUG: os.getenv(\"OPENAI_API_KEY\") 返回的值: {'一个字符串 (已隐藏具体内容)' if api_key else 'None'}")
if api_key:
print(f"DEBUG: API Key 的前5个字符: {api_key[:5]}") # 打印部分以确认
print(f"DEBUG: os.getenv(\"OPENAI_BASE_URL\") 返回的值: {base_url_from_env if base_url_from_env else 'None'}")
print("--- 环境变量获取调试结束 ---")
if not api_key:
print("--------------------------------------------------------------------")
print("错误:未能从 .env 文件或环境变量中获取 OPENAI_API_KEY。")
print("请仔细检查以下几点:")
print("1. 项目根目录或脚本所在目录中是否存在一个名为 '.env' 的文件。")
print(" (DEBUG 信息中 '找到 .env 文件路径:' 是否显示了正确的路径?)")
print("2. '.env' 文件中是否正确定义了 OPENAI_API_KEY='your_actual_key'。")
print(" (确保键名拼写正确,无多余空格,API密钥值完整无误)。")
print("3. 确保您的 .env 文件内容与示例格式一致,例如:")
print(" OPENAI_API_KEY=\"sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"")
print(" OPENAI_BASE_URL=\"https://sg.uiuiapi.com/v1\"")
print("请查看上面以 'DEBUG:' 开头的详细输出,以帮助定位问题。")
print("--------------------------------------------------------------------")
exit() # 必需的 API Key 未找到,退出程序
else:
print(f"成功加载的 API Key (部分显示): '{api_key[:5]}...{api_key[-4:]}'")
# 基础 URL 可以从环境变量加载,如果未设置,则使用default_base_url = "https://sg.uiuiapi.com/v1"
default_base_url = "OPENAI_BASE_URL" # 您常用的 URL 作为默认值
base_url = base_url_from_env if base_url_from_env else default_base_url
print(f"使用的 Base URL: {base_url}")
if base_url == default_base_url and not base_url_from_env :
print(f"(提示: OPENAI_BASE_URL 未在 .env 文件或环境变量中指定, 当前使用的是代码中的默认值 '{default_base_url}'。)")
# ... (后续的 OpenAI 客户端初始化、API 调用和错误处理代码保持不变) ...
# 2. 配置 API 客户端
client = OpenAI(
api_key=api_key,
base_url=base_url,
timeout=httpx.Timeout(300.0, connect=60.0),
max_retries=1,
)
# 3. 准备 API 请求的消息体
messages = [
{"role": "user", "content": "你好,你好,你能做什么?请用中文回答。"}
]
# 4. 发送请求并处理响应
try:
print("正在尝试调用 OpenAI API...")
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
max_tokens=4500,
temperature=0.8,
)
if response.choices:
assistant_reply = response.choices[0].message.content
print("模型回复:", assistant_reply)
else:
print("未能从 API 获取有效回复。")
except openai.AuthenticationError as e:
print(f"OpenAI API 认证失败: {e}")
print("这通常意味着 API 密钥无效或没有权限。请再次核对 .env 文件中的 OPENAI_API_KEY 是否为您从 uiuiAPI 获取的正确密钥。")
print(f"当前尝试使用的 API Key (来自 .env 或环境变量,部分显示): '{api_key[:5]}...{api_key[-4:]}',Base URL 为: {base_url}")
except openai.APIConnectionError as e:
print(f"无法连接到 OpenAI API: {e}")
except openai.RateLimitError as e:
print(f"达到 OpenAI API速率限制: {e}")
except openai.APIStatusError as e:
print(f"OpenAI API 返回了错误状态码: {e.status_code}")
print(f"响应详情: {e.response}")
except Exception as e:
print(f"调用 API 时发生未知错误: {e}")
print(f"错误类型: {type(e).__name__}")
请您:
-
仔细检查您的
.env
文件:-
文件名:确保是
.env
。 -
位置:确保它和您的 Python 脚本在同一个文件夹里。
-
内容:再次确认键名(
OPENAI_API_KEY
,OPENAI_BASE_URL
)无误,API 密钥和 URL 的值也完全正确,没有多余字符或缺失字符。格式类似: Code snippet -
OPENAI_API_KEY=
"sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
-
OPENAI_BASE_URL=
"https://sg.uiuiapi.com/v1"
-
-
运行上面提供的完整 Python 脚本。
-
观察脚本开始部分的
DEBUG:
输出信息。- 它是否找到了
.env
文件 (DEBUG: 找到 .env 文件路径: ...
)? load_dotenv
是否报告成功加载 (DEBUG: 成功从 .env 文件加载变量。
)?os.getenv("OPENAI_API_KEY")
返回的是什么 (DEBUG: os.getenv("OPENAI_API_KEY") 返回的值: ...
)?
- 它是否找到了
根据 DEBUG 输出判断:
- 如果 DEBUG 信息显示 未能找到
.env
文件,或者os.getenv("OPENAI_API_KEY")
返回None
,那么问题就在于.env
文件的查找或加载过程。请重点检查文件名、位置和load_dotenv
的相关 DEBUG 输出。 - 如果 DEBUG 信息显示
.env
文件被找到并加载,并且os.getenv("OPENAI_API_KEY")
也成功获取到了一个看起来像密钥的字符串,但后续仍然报AuthenticationError
(认证失败),那么问题就不是环境变量的加载机制了,而是.env
文件中的OPENAI_API_KEY
的值本身对于https://sg.uiuiapi.com/v1
这个服务是无效的或没有权限。这种情况下,您需要联系 uiuiAPI 的提供方确认密钥的有效性。