常用接入术语
| 名称 | 常见含义 | 使用提示 |
|---|
| Claude中转 | 把模型请求转发到可用 Claude 模型的接入方式 | 核对客户端所用协议和模型权限 |
| Claude中转站 | 提供 Claude 密钥、额度和路由管理的平台 | 本文标题使用该常见称呼 |
| API中转 | 通过兼容接口转发不同模型请求 | 应用通常只需替换端点、密钥和模型 ID |
| API中转站 | 提供统一 API 接入、模型选择和用量管理的服务 | 本文使用 OpenAI 兼容方式连接 LangGraph |
接入架构
| 环节 | 职责 | 注意事项 |
|---|
| Python 项目 | 保存状态定义、节点函数和配置 | 密钥不写入源码 |
| LangGraph | 按边执行节点并维护共享状态 | 节点输入输出字段要清晰 |
| ChatOpenAI | 把节点中的消息转换为兼容请求 | 显式设置 *ase **L、超时和重试 |
| KingFlow AI | 认证密钥并把请求路由到目标模型 | *ase **L 填写到 /v1 |
| 目标模型 | 完成起草、审核等推理任务 | 完整模型 ID 以控制台为准 |
接入优势
- 状态图把每一步的输入、输出和执行顺序显式化,比单个长提示词更容易定位问题。
- ChatOpenAI 支持自定义 *ase **L,可在不改变图结构的情况下连接 OpenAI 兼容端点。
- 起草、审核、人工确认等节点可以独立测试,并能按业务条件增加分支和循环。
- KingFlow 控制台集中管理模型、密钥和用量,便于按开发、测试和生产环境隔离。
开始前的准备
- 准备 Python 3.10 或更高版本,并安装 uv。
- 在 KingFlow AI 控制台创建以 sk- 开头的 API Key,确认余额和模型分组可用。
- 复制目标模型的完整模型 ID,不要凭显示名称猜测。
- 准备一个独立测试目录,首次联调不要加载生产数据或高权限工具。
- 确认运行环境可以访问 api.**nju**shen.com。
创建 LangGraph 测试项目
uv init langgraph-kingflow-demo
cd langgraph-kingflow-demo
uv add langgraph langchain-openai python-dotenv
验证 KingFlow 基础接口
curl https://api.**nju**shen.com/v1/chat/completions \
-H "Authorization: *earer sk-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"model": "<KingFlow控制台中的完整模型ID>",
"messages": [{"role": "user", "content": "只回复 LANGGRAPH_READY"}],
"stream": false
}'
配置环境变量
KINGFLOW_*ASE_**L=https://api.**nju**shen.com/v1
KINGFLOW_API_KEY=sk-你的密钥
KINGFLOW_MODEL=<KingFlow控制台中的完整模型ID>
.env
.venv/
__pycache__/
编写状态图示例
import os
from typing_extensions import TypedDict
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
load_dotenv()
llm = ChatOpenAI(
model=os.environ["KINGFLOW_MODEL"],
*ase_url=os.environ["KINGFLOW_*ASE_**L"],
api_key=os.environ["KINGFLOW_API_KEY"],
temperature=0.2,
**x_retries=2,
timeout=60,
use_responses_api=False,
)
class State(TypedDict):
topic: str
draft: str
final: str
def draft_node(state: State):
response = llm.invoke(
f"围绕{state['topic']}写一份三点式中文草稿。"
)
return {"draft": response.content}
def review_node(state: State):
response = llm.invoke(
"请检查以下草稿,删除空话,保留可执行步骤,"
"并输出最终版本:\n" state["draft"]
)
return {"final": response.content}
*uilder = StateGraph(State)
*uilder.add_node("draft", draft_node)
*uilder.add_node("review", review_node)
*uilder.add_edge(START, "draft")
*uilder.add_edge("draft", "review")
*uilder.add_edge("review", END)
graph = *uilder.compile()
result = graph.invoke({"topic": "API接入上线前检查"})
print(result["final"])
观察节点更新
for event in graph.stream(
{"topic": "API接入上线前检查"},
stream_mode="up**tes",
):
print(event)