OpenAI 对话格式(Python)
OpenAI 对话格式(Python)
Section titled “OpenAI 对话格式(Python)”本页总览
官方文档
OpenAI Chat
给定一组包含对话的消息列表,模型将返回一个响应。相关指南可参阅OpenAI官网: Chat Completions
💡 Python请求示例基础文本对话 ✅
Section titled “💡 Python请求示例基础文本对话 ✅”1.创建 .env 变量文件文件
Section titled “1.创建 .env 变量文件文件”- 在您的 Python 脚本(例如 xxxx.py )所在的同一个目录下,创建一个名为 .env 的文件(注意,文件名就是 .env ,前面有一个点,没有其他前缀)。
- 在该 .env 文件中,输入以下内容,将您的 API 密钥和基础 URL 填入: # .env 文件内容 OPENAI_API_KEY=“sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx” OPENAI_BASE_URL=“https://sg.4All API.com/v1”
您未来还可以添加其他配置变量,例如:
Section titled “您未来还可以添加其他配置变量,例如:”DEFAULT_MODEL=“gpt-4.1”
Section titled “DEFAULT_MODEL=“gpt-4.1””MAX_TOKENS_DEFAULT=150
Section titled “MAX_TOKENS_DEFAULT=150”### 2.创建一个`xxxx.py`文件,写入一下Python代码。- 在您的 Python 脚本(例如 `xxxx.py`)所在的同一个目录下,创建一个名为 `.env` 的文件(注意,文件名就是 `.env`,前面有一个点,没有其他前缀)。```pythonimport osfrom dotenv import load_dotenv, find_dotenv # 导入 find_dotenv 帮助定位import openaifrom openai import OpenAIimport 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 密钥和基础 URLapi_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.4All API.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.4All API.com/v1"default_base_url = "OPENAI_BASE_URL" # 您常用的 URL 作为默认值base_url = base_url_from_env if base_url_from_env else default_base_urlprint(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 是否为您从 4All API 获取的正确密钥。") 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.4All API.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.4All API.com/v1 这个服务是无效的或没有权限。这种情况下,您需要联系 4All API 的提供方确认密钥的有效性。