中文 ▾
stableaudio.top

用于你音频管道的无审查文本 API

获取 API 密钥

无需 API 密钥使用 LangChain 和 LangGraph LangGraph

你无法在不使用密钥的情况下运行托管模型,但你可以先不付费使用 LangChain 和 LangGraph。一键获取试用密钥并更改 Base URL 即可。

等距节点图,带有发光连接立方体,代表 LangGraph 智能体工作流

更新于

要点

  1. 每个托管接口都需要密钥;试用密钥无需银行卡,一键即可获取。

  2. 设置 base_url 并将模型设为 uncensored 后,LangChain 的 ChatOpenAI 类即可工作。

  3. 支持函数调用的 LangGraph 智能体可以无需修改地运行,但扇出分支必须遵守并发限制。

  4. 一次典型的六次调用智能体运行成本约为 $0.0039,因此 $0.50 的试用额度大约可以支持 128 次此类运行。

“无需 API 密钥”在现实中可能意味着什么

搜索 无需 API 密钥的 langchain 和 langraph通常意味着以下三种情况之一。你可能希望在确认技术栈有效之前避免付费。你可能不想将信用卡交给另一个供应商。或者你希望在不使用任何凭据的情况下运行代理图。

托管服务无法满足第三种愿望:为你执行工作的服务器必须知道是谁在调用它。你可以获得的是免费且无需提供银行卡的密钥。新用户可以在 API 密钥页面 通过 Google 或电子邮件和密码注册后,一键领取 $0.50 的试用额度。每人限领一次,有效期为 7 天。

实现“无密钥”的另一种途径是使用你本地机器上运行的本地模型。这可行,但你需要承担硬件负担,且笔记本电脑在长时间运行智能体时无法与托管端点相媲美。托管试用是验证图逻辑是否合理的更快方式,且你编写的代码与后续使用付费密钥运行的代码完全相同。

由于该端点兼容 OpenAI,LangChain 不需要特殊的集成。你只需将其 OpenAI 聊天类指向不同的 base URL,传入密钥,并将模型命名为 uncensored。以下所有操作都基于此设置。

步骤 1:获取试用密钥并设置环境变量

注册,打开密钥页面,点击试用按钮。复制密钥并将其保留在仓库之外。将其放入环境变量中,以便同一个脚本今天可以使用试用密钥,而以后可以使用完整密钥。

export UNCENSORED_API_KEY="paste-your-key-here"
pip install -U langchain-openai langgraph langchain-core

在引入任何框架之前,先用普通请求检查密钥。这里花两分钟能节省一小时阅读那些实际上是认证错误的堆栈跟踪。

curl https://api.stableaudio.top/v1/chat/completions \
  -H "Authorization: Bearer $UNCENSORED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"uncensored","messages":[{"role":"user","content":"Reply with one word: ready"}]}'

GET /v1/models 调用是另一种快速检查方式;它应列出 uncensored。试用密钥允许 2 个并发请求和每分钟 60 个请求,这对于开发图来说已经绰绰有余,但在添加并行节点时值得牢记。

步骤 2:将 LangChain 指向接口

使用的类是来自 langchain-openai 的 ChatOpenAI。两个参数即可完成工作:base_url 和 api_key。模型名称为 uncensored,通常的采样设置通过参数传递。

import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.stableaudio.top/v1",
    api_key=os.environ["UNCENSORED_API_KEY"],
    temperature=0.7,
    max_retries=3,
)

print(llm.invoke("Give me three titles for an ambient track about rain.").content)

如果这打印了文本,说明连接良好。流式输出方式相同:迭代 llm.stream(...),数据块通过服务器发送事件到达,并在流结束时报告使用情况。

一个常见的疏忽是保留来自旧项目的 OPENAI_API_KEY 变量。如果你忘记传递 api_key,LangChain 会将该值发送到你自定义的 base URL。显式传递密钥即可消除猜测。

步骤 3:最小化的 LangGraph 图

LangGraph 将你的智能体建模为在节点之间移动的状态。最小的有用图包含一个节点,该节点调用模型并将回复附加到消息列表中。MessagesState 免费为你提供该列表。

from langgraph.graph import StateGraph, MessagesState, START, END

def call_model(state: MessagesState):
    reply = llm.invoke(state["messages"])
    return {"messages": [reply]}

builder = StateGraph(MessagesState)
builder.add_node("model", call_model)
builder.add_edge(START, "model")
builder.add_edge("model", END)
graph = builder.compile()

out = graph.invoke({"messages": [("user", "Outline a three-act short story about a lighthouse keeper.")]})
print(out["messages"][-1].content)

这故意设计得很简单。重点在于 LangGraph 不知道也不关心 llm 背后是哪个提供商。任何节点都可以采用不同的模型对象,因此你可以为便宜的规划步骤和较长的写作步骤分别赋予各自的设置,例如为规划设置较低的温度。

步骤 4:添加工具和循环

当模型可以调用函数时,智能体变得有趣。该接口支持使用 tools 和 tool_choice 进行函数调用,工具结果以 role: "tool" 消息形式返回。LangChain 和 LangGraph 为你处理这些底层工作。

from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode, tools_condition

@tool
def word_count(text: str) -> int:
    'Count the words in a piece of text.'
    return len(text.split())

tools = [word_count]
llm_with_tools = llm.bind_tools(tools)

def agent(state: MessagesState):
    return {"messages": [llm_with_tools.invoke(state["messages"])]}

builder = StateGraph(MessagesState)
builder.add_node("agent", agent)
builder.add_node("tools", ToolNode(tools))
builder.add_edge(START, "agent")
builder.add_conditional_edges("agent", tools_condition)
builder.add_edge("tools", "agent")
graph = builder.compile()

result = graph.invoke({"messages": [("user", "Write a 40-word product blurb, then check its word count with the tool.")]})
print(result["messages"][-1].content)

循环是核心思想:智能体节点进行回答,tools_condition 检查回复是否请求了工具,工具节点执行该工具,然后控制权返回给智能体。当回复没有工具调用时,图结束。

开放权重模型在工具参数的整洁度上各不相同。如果调用返回格式错误,请收紧工具的文档字符串,降低温度,并保持参数架构较小。简短的类型化架构比包含许多可选字段的大型架构出错率更低。

速率限制、重试和并行分支

智能体图最容易绊倒的地方是并发。完整密钥允许 8 个并发请求和每分钟 300 个请求;试用密钥允许 2 个和 60 个。如果你的图在试用密钥上扇出到五个并行节点,其中三个将被拒绝,返回 HTTP 429 和错误代码 concurrency。超过每分钟预算将返回 rate_limited。临时过载也会返回 429,并带有 Retry-After: 5 标头。

以下三个习惯可以使这变得可控:

  • 在 ChatOpenAI 上将 max_retries 保持在 2 或 3,以便使用退避重试短时的 429 错误。
  • 将扇出限制在你的并发限制内。在 LangGraph 中,你可以在调用图时传递 config={"max_concurrency": 2}。
  • 请记住,流式请求会占用其槽位,直到流结束,因此慢速消费者会占用槽位。
out = graph.invoke(
    {"messages": [("user", "Draft five taglines in parallel.")]},
    config={"max_concurrency": 2},
)

响应标头有助于调试。X-Request-Id 标识调用,如果你需要就此联系支持团队,可以使用它;X-Balance-USD 显示每次请求后你剩余的额度。

图行为异常时的调试清单

首次 LangGraph 项目中的大多数故障与模型无关。它们来自配置,简短的清单可以捕获几乎所有故障。

  1. 401 或认证错误。 密钥缺失、输入错误,或者正在读取旧的 OPENAI_API_KEY。打印你的脚本实际使用的值的前四个字符。
  2. 404 或找不到模型。 模型名称必须是 uncensored。如果你不确定端点列出了什么,请调用 GET /v1/models。
  3. 连接错误。 Base URL 必须以 /v1 结尾,且不得包含 /chat/completions;客户端会添加该部分。
  4. 无限循环。 如果智能体不断调用工具,工具的返回值可能没有回答问题。返回简短的纯文本字符串,并通过图配置设置递归限制,以便在无效循环发生时尽早停止。
  5. 空回复或奇怪回复。 在运行后打印完整消息列表。通常,较早的节点编写了一条与后来消息矛盾的系统消息。

当请求在服务器端失败时,在你的消息中引用 X-Request-Id 标头以联系 支持团队。这让他们无需猜测即可找到该确切调用。请记住,失败或被拒绝的请求不会收费,因此充满错误的调试会话不会消耗你的试用额度。

还有一个设计要点。为每个节点分配狭窄的任务和简短的提示。具有规划器、编写器和检查器的图,每个节点都有自己的小型系统消息,比具有大量指令的单个节点更容易测试,并且每个部分都可以在连接之前通过直接的 llm.invoke 调用单独尝试。

一次试用运行实际花费多少

定价为每 1M 输入 token $0.15,每 1M 输出 token $0.50,从预付额度中扣除。失败或被拒绝的请求不收费。智能体图每次任务调用模型多次,每次调用都会重新发送不断增长的消息列表,因此输入 token 占主导地位。

进行一次包含六次模型调用的运行。假设每次调用输入 3,000 个 token 并返回 400 个 token。即 18,000 个输入 token 和 2,400 个输出 token。

  • 输入:18,000 / 1,000,000 x $0.15 = $0.0027
  • 输出:2,400 / 1,000,000 x $0.50 = $0.0012
  • 总计:每次运行 $0.0039

$0.50 的试用额度除以 $0.0039 约为 128 次该规模的运行,足以充分构建和测试图。当额度不足以支撑你的需求时,充值金额从 $20 到 $500 不等,且提供阶梯奖励:$50 起赠 5%,$100 起赠 10%,$200 起赠 15%;定价页面 有详细信息。支持银行卡(Visa、Mastercard、Apple Pay、Google Pay)或加密货币(TRC20 链上的 USDT、Base 链上的 USDC)支付。额度永不过期,且提示词不用于训练。

上下文窗口为 100,000 个 token(包含提示词和补全),因此长代理历史记录可以容纳,但你需为每次重发的 token 付费。使用 LangGraph 的消息工具精简旧消息可降低费用和延迟。有关底层请求格式的详细信息,请参阅 API 文档。

问答

完全不需要 API 密钥也能使用 LangChain 或 LangGraph 吗?

使用托管模型时不行。服务器必须识别调用者。你可以一键获取免费试用密钥,无需提供银行卡,或者自行运行本地模型。

我应该使用哪个 LangChain 类?

来自 langchain-openai 的 ChatOpenAI。将 base_url 设置为接口,将密钥作为 api_key 传入,并使用模型名称 uncensored。

在 LangGraph 代理中支持函数调用吗?

支持。该接口支持工具、tool_choice 和 role tool 结果,因此 bind_tools、ToolNode 和 tools_condition 的用法与上述示例一致。

为什么我的图并行运行分支时会收到 429 错误?

你超出了并发限制,试用密钥为 2,完整密钥为 8。请在图配置中限制 max_concurrency 并保留重试机制。

试用额度足以测试代理吗?

通常可以。对于包含 6 次调用的中等规模运行,成本约为 $0.0039,$0.50 足以覆盖 7 天有效期内远超一百次的运行。

只需填写一个表单即可获得密钥

创建账户,复制密钥,更改基础 URL。这就是全部设置。

获取 API 密钥