简短回答:ChatOpenAI 的三项设置
如果你搜索了 chat open ai langchain,你可能有一个已经使用 ChatOpenAI 的 LangChain 项目,并希望它连接到不同的后端。这是一个配置更改,而不是重写。本站的 API 遵循 OpenAI 聊天完成协议,因此 LangChain 将其视为任何其他 OpenAI 风格的服务器。
你需要 Base URL、你的 API 密钥和模型 ID uncensored。首先安装软件包:
pip install -U langchain-openai langgraph然后创建模型对象:
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
temperature=0.8,
)
reply = llm.invoke("Write a two-sentence villain monologue for a heist novel.")
print(reply.content)这就是整个集成。每个基于 ChatOpenAI 的 LangChain 功能现在都在无审查模型上运行:链、调用聊天模型的检索器、输出解析器和代理。如果你还没有密钥,API 密钥页面 解释了注册和一键获取免费试用额度的方法。
将密钥与代码隔离
将密钥放入环境变量,并在启动时读取它。在 Linux 或 macOS 上:
export NOFILTER_API_KEY="paste-your-key-here"为项目创建一个共享客户端模块,例如 llm.py,它只构建一次模型并导出它。每个链都导入同一个对象,之后对密钥、超时或温度的更改只需在一个地方进行。这也使得轻松保持第二个用于工具步骤的较冷实例和一个用于创意写作的较热实例变得容易,两者都指向具有不同设置的同一接口。
一个陷阱困扰着许多人:ChatOpenAI 还会从环境中读取 OPENAI_API_KEY 和 OPENAI_API_BASE。如果为另一个项目设置了这些变量,配置不完整的对象可能会将你的请求发送到错误的服务器。如上所述,显式传递 base_url 和 api_key 可以消除歧义。
你可以完全不使用 LangChain 来确认连接。模型接口应返回单个条目:
curl https://api.nofilteraichat.com/v1/models \
-H "Authorization: Bearer $NOFILTER_API_KEY"如果这有效但 LangChain 失败,问题出在你的 Python 环境中,而不是密钥。如果两者都因 401 失败,请检查密钥中是否有多余的空格或换行符。快速入门 列出了用于比较的确切请求格式。
流式输出和 token 用量
当 token 随生成出现时,聊天界面的体验会更好。LangChain 通过 .stream() 暴露这一功能,并且当底层设置 stream: true 时,服务器会发送标准 SSE 块。
from langchain_openai import ChatOpenAI
import os
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
stream_usage=True,
)
final = None
for chunk in llm.stream("Describe a rainy harbour town in four sentences."):
print(chunk.content, end="", flush=True)
final = chunk if final is None else final + chunk
print()
print(final.usage_metadata)使用 stream_usage=True,最后一个块携带输入和输出 token 计数,API 在流结束时发送这些计数。保留这些数字。这是查看代理实际成本的最便宜方法,我们在下面的成本部分中使用它们。
要记住的一件事:流式请求会占用其并发槽位,直到流结束。如果你在不关闭流的情况下放弃流,该槽位会比预期更忙。
Node 和 TypeScript
JavaScript 包使用略有不同的选项名称。基础 URL 位于 configuration 内部:
npm install @langchain/openai @langchain/coreimport { ChatOpenAI } from "@langchain/openai";
const llm = new ChatOpenAI({
model: "uncensored",
apiKey: process.env.NOFILTER_API_KEY,
configuration: { baseURL: "https://api.nofilteraichat.com/v1" },
temperature: 0.8,
});
const res = await llm.invoke("Give me three names for a smuggler's ship.");
console.log(res.content);响应的 TypeScript 类型是常见的 LangChain 消息类,因此读取 res.content 或 res.usage_metadata 的现有代码可以继续使用。当在服务器路由中运行此代码时,请在模块作用域中构建模型,而不是针对每个请求构建。这避免了为每次调用创建新的 HTTP 客户端,并使你的并发逻辑更易于理解。
其他所有内容,包括 .stream()、.bindTools() 和 .withStructuredOutput(),行为与 Python 相同。temperature、top_p、stop 序列、seed 和惩罚选项会传递到模型,因此你可以像为任何其他 OpenAI 风格的后端那样在构造函数中设置它们。
工具调用和小型代理
API 支持工具调用:tools 和 tool_choice 字段,流式 tool_calls,以及作为 role: "tool" 消息返回的工具结果。LangGraph 的预构建代理完全使用此循环。这是一个带有一个工具的代理:
import os
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
@tool
def roll_dice(sides: int) -> int:
"""Roll a die with the given number of sides."""
import random
return random.randint(1, sides)
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
)
agent = create_react_agent(llm, [roll_dice])
out = agent.invoke(
{"messages": [("user", "Roll a twenty-sided die twice and tell me the total.")]}
)
print(out["messages"][-1].content)开放权重模型的工具使用不如托管旗舰模型可预测,因此将其视为需要测试的内容。用简单的词语编写工具描述,保持参数模式较小,并为必须生成有效参数的代理步骤设置低 temperature(0.2 到 0.4)。如果调用返回格式错误,LangChain 会将其显示为无效工具调用,使用更清晰的描述重试通常可以修复它。
保持代理循环有界。LangGraph 有递归限制,你应该将其设置为你可以承受的数字。如果代理可以无限调用工具,糟糕的提示可能会在你离开键盘时烧掉额度。10 到 15 步的限制是大多数任务的合理默认值,你可以在调用代理时在配置中传递它。
JSON 模式
JSON 模式通过 response_format 提供。在 LangChain 中,使用 JSON 模式方法请求它,并在提示词中命名键:
from pydantic import BaseModel
from langchain_openai import ChatOpenAI
import os
class Character(BaseModel):
name: str
role: str
secret: str
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
)
structured = llm.with_structured_output(Character, method="json_mode")
print(structured.invoke(
"Return JSON with keys name, role and secret for a noir detective."
))速率限制、重试和成本
完整密钥允许 8 个并发请求和每分钟 300 个请求。试用密钥允许 2 个和 60 个。当你超过任一限制时,API 会回答 HTTP 429 和错误代码:rate_limited 用于每分钟请求,concurrency 用于同时过多。临时过载也返回 429,带有 Retry-After: 5 标头。
LangChain 为此提供了两个旋钮。模型上的 max_retries 使用退避重试失败的调用,运行配置中的 max_concurrency 限制并行批处理工作:
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
max_retries=4,
timeout=120,
)
answers = llm.batch(
["Prompt one", "Prompt two", "Prompt three", "Prompt four"],
config={"max_concurrency": 6},
)在完整密钥上将 max_concurrency 设置为 6 为第二个进程留出余地。请记住,每个代理步骤都是一个单独的请求,流式步骤会占用其槽位直到流结束。
代理运行成本
定价为每 1M 输入 token $0.15,每 1M 输出 token $0.50。假设一个代理步骤发送 3,000 个 token 的历史记录、工具和指令,模型生成 500 个 token。输入成本为 3,000 × $0.15 / 1,000,000 = $0.00045。输出成本为 500 × $0.50 / 1,000,000 = $0.00025。一步的成本为 $0.0007。十步运行的成本为 $0.007,1,000 次此类运行的成本为 $7.00。
代理在每一步重新发送其不断增长的历史记录,因此输入 token 占主导地位。修剪旧的工具输出是你拥有的最便宜的优化手段。失败或被拒绝的请求不收费。充值和奖金的详细信息请参阅 定价页面。
常见问题
- 每次调用都返回 404。 基础 URL 必须以
/v1结尾,且不得包含/chat/completions。LangChain 会自行附加路径。 - 未找到模型。 唯一的模型 ID 是
uncensored。gpt-4o 等名称将不起作用。 - 上下文错误。 上下文窗口为 100,000 个 token,包括提示词和补全。长检索链可能会超过它。发送前请总结或修剪。
- 请求过大。 主体限制为 8 MB,如果你将完整文档塞入提示词中,这很重要。
- 嵌入功能失效。 此 API 仅支持文本聊天。请将你的嵌入模型保留在其他提供商处,并使用此接口进行生成。
相同模式适用于其他框架和聊天前端;集成指南 涵盖了更多客户端。对于任何不寻常的情况,支持页面 是开始的地方。
