繁中 ▾
取得 API 金鑰

LangChain 中使用 ChatOpenAI 搭配無審查 API

LangChain 的 ChatOpenAI 類別適用於任何相容於 OpenAI 的端點,因此你只需變更 Base URL、金鑰與模型名稱。本頁展示 Python 與 Node 的設定,然後逐步建立串流輸出、工具與小型代理程式。

更新於

等距鏈接環串連聊天氣泡進入伺服器立方體,代表 LangChain 與 API 的連線

重點摘要

  1. ChatOpenAI 需三個設定:base_url、api_key 與設為 uncensored 的模型
  2. 串流輸出、工具呼叫與 JSON 模式皆透過標準 LangChain 介面進行。
  3. 將並行請求上限設為 8,並處理 HTTP 429 重試以保持在限制範圍內。
  4. 執行十個步驟的 agent 成本遠低於 1 美分,每 1M tokens 分別為 $0.15 與 $0.50。

簡短答案: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 產生時即時顯示,Chat UI 的體驗會更好。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 套件使用稍微不同的選項名稱。Base URL 位於 configuration 內:

npm install @langchain/openai @langchain/core
import { 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 相同。溫度、top_p、停止序列、種子與懲罰選項會傳遞給模型,因此你可以像為任何其他 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。 Base URL 必須以 /v1 結尾,且不得包含 /chat/completions。LangChain 會自行附加路徑。
  • 找不到模型。 唯一的模型 ID 是 uncensored。gpt-4o 等名稱無法運作。
  • 上下文錯誤。 上下文視窗為提示詞加上完成的 100,000 token。長檢索鏈可能超過它。在發送之前請摘要或修剪。
  • 請求太大。 主體限制為 8 MB,如果你將整個文件塞入提示詞,這很重要。
  • 嵌入失敗。 此 API 僅限文字聊天。將你的嵌入模型保留在其他供應商處,並使用此端點進行生成。

相同的模式適用於其他框架與聊天前端;整合指南涵蓋更多用戶端。對於任何不尋常的情況,支援頁面是開始的地方。

問答

我可以在自訂 Base URL 下使用 ChatOpenAI 嗎?

可以。請傳入 base_url(Node 中為 configuration 內的 baseURL)、你的金鑰與模型 uncensored。LangChain 不在乎是哪部伺服器回應,只要遵循 OpenAI 聊天協定。

LangChain 串流輸出與此 API 相容嗎?

可以。API 透過 SSE 進行串流輸出並在結尾發送用量資訊,因此 .stream() 與 astream() 均可運作,且 stream_usage=True 可取得 token 計數。

我可以將 LangChain 嵌入或向量資料庫與此 API 搭配使用嗎?

不適用於嵌入,因為 API 沒有嵌入端點。請使用其他嵌入來源進行檢索,並將檢索到的文字傳送至此端點進行生成。

達到速率限制時會發生什麼事?

你會收到 HTTP 429 錯誤,代碼為 rate_limited 或 concurrency。在 ChatOpenAI 上設定 max_retries,並將完整金鑰的 max_concurrency 限制在 8 或以下。

只差一張表單,即可取得金鑰

建立帳號、複製金鑰、更改基礎 URL。這就是整個設定過程。

取得 API 金鑰