You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Langchain运行时动态修改OpenAI API密钥?

Langchain LCEL运行时修改ChatOpenAI API密钥问题解决

问题根源

openai_api_key被ChatOpenAI类标记为lc_secrets,Langchain的配置系统会默认排除这类敏感字段,不允许通过configurable_fields和with_config动态修改——这类字段的设计初衷是从环境变量或密钥管理系统加载,而非运行时动态传入。

可行解决方案

方法1:用RunnableLambda动态创建模型实例

适合FastAPI这种每次请求独立处理的场景,每次调用时根据传入的API密钥生成新的ChatOpenAI实例:

from langchain_core.runnables import RunnableLambda
from langchain_openai import ChatOpenAI

def get_chat_model(api_key: str):
    return ChatOpenAI(openai_api_key=api_key, temperature=0)

# 定义接收api_key和prompt的链
dynamic_model_chain = RunnableLambda(lambda inputs: get_chat_model(inputs["api_key"]).invoke(inputs["prompt"]))

# 调用示例
response = dynamic_model_chain.invoke({"api_key": "你的有效密钥", "prompt": "foo_prompt"})

方法2:自定义子类移除敏感标记(不推荐)

如果一定要用ConfigurableField机制,可以自定义ChatOpenAI子类,移除openai_api_key的敏感标记:

from langchain_openai import ChatOpenAI
from langchain_core.runnables.config import ConfigurableField

class CustomChatOpenAI(ChatOpenAI):
    @property
    def lc_secrets(self):
        # 从敏感字段列表中移除api_key
        secrets = super().lc_secrets
        secrets.pop("openai_api_key", None)
        return secrets

# 现在可以配置api_key为可动态修改字段
model = CustomChatOpenAI(openai_api_key="占位密钥").configurable_fields(
    openai_api_key=ConfigurableField(
        id="openai_api_key",
        name="API密钥",
        description="调用OpenAI接口使用的API密钥"
    )
)

# 运行时修改密钥调用
response = model.with_config(configurable={"openai_api_key": "你的有效密钥"}).invoke("foo_prompt")

注意:这种方式会让API密钥存在被序列化、日志记录的风险,生产环境谨慎使用。

方法3:临时切换环境变量

如果不同请求对应不同密钥,可以在请求处理时临时替换环境变量:

import os
from langchain_openai import ChatOpenAI

# 初始化模型时不指定密钥,默认读取环境变量OPENAI_API_KEY
model = ChatOpenAI(temperature=0)

# FastAPI请求处理函数示例
def process_request(api_key: str, prompt: str):
    original_key = os.getenv("OPENAI_API_KEY")
    os.environ["OPENAI_API_KEY"] = api_key
    try:
        response = model.invoke(prompt)
    finally:
        # 恢复原环境变量,避免影响后续请求
        if original_key:
            os.environ["OPENAI_API_KEY"] = original_key
        else:
            os.environ.pop("OPENAI_API_KEY", None)
    return response

注意:多线程环境(比如FastAPI默认模式)下可能出现竞态问题,建议结合线程本地存储或上下文变量隔离。

总结

优先选方法1,既安全又符合Langchain的设计逻辑,避免实例状态污染;方法3适合有成熟环境变量管理的场景;方法2仅在特殊需求下使用,一定要做好安全防护。

内容的提问来源于stack exchange,提问作者FlightPlan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:20:27