☰
从 0 到 1 构建第一个 AI Agent:用 TaoToken 统一 Key 打通 LangChain 与 LangGraph 配置骨架
2026/9/26 12:31:34 网站建设 项目流程

1. 为什么第一个 Agent 总是卡在配置这一步

很多人第一次搭 AI Agent,卡住的地方不是 LangChain 的 API 记不住,也不是 LangGraph 的状态图看不懂,而是配置环节就翻车了。模型名写错、base_url 少个斜杠、Key 散落在三四个文件里、环境变量没加载、跑起来报 401 或者 model not found,折腾一晚上连一句回复都没拿到。

我自己刚开始也是这样:一个项目里同时用了 OpenAI 兼容接口、本地 Ollama、还有某个云厂商的 SDK,每个地方都要填一遍 Key 和地址,改一次要翻五个文件。后来我把所有模型调用统一收敛到一个 API 通道上,用 TaoToken 做统一 Key 管理,配置只写一次,LangChain 和 LangGraph 共用同一份 settings.json 和 config.toml,整个链路才真正跑通。

这篇就是把这个过程完整拆给你:从零基础视角,用 TaoToken 统一 Key 打通 LangChain 与 LangGraph,交付可以直接复制的 settings.json 与 config.toml 骨架,再带你做一次连通性验证,确认第一个 Agent 调用链路真的通了。适合刚接触 AI Agent、想跑通第一个可运行 Demo 的开发者,不需要你之前用过 LangGraph。

核心检索词先明确:AI Agent 是能自主规划、调用工具、维护记忆的系统;LangChain 负责模型适配和工具编排;LangGraph 负责状态图和记忆;TaoToken 在这里扮演的是统一 API 通道和 Key 管理入口,让上面这些组件不用各自维护一套凭证。

2. TaoToken 前置准备:拿到统一 Key 和 API 地址

在写任何配置文件之前,先把凭证准备好。TaoToken 的官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基础地址是 https://taotoken.net/api ,注意这个地址后面不加任何 UTM 参数,配置里就写这个干净的。

你需要做两件事:注册账号,然后在控制台创建一个 API Key。创建 Key 的入口在 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,进去之后找到 API Keys 页面,新建一个 Key,复制出来。这个 Key 就是后面所有配置里唯一要填的凭证。

注意:Key 只在创建时完整显示一次,复制后立刻存到本地环境变量或密码管理器里,不要直接写进会提交到 Git 的代码。

如果你后面要长期跑编码类 Agent,或者想让 Agent 在多个会话里持续工作,可以了解一下 Coding Plan,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。它解决的是长期编码和 Agent 场景下的额度与通道问题,和本篇的配置骨架是配套的。

拿到 Key 之后,先做一次最小验证,确认这个 Key 和 API 地址是通的。用 curl 直接打一次模型对话接口:

export TAOTOKEN_API_KEY="你的Key" curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "只回复两个字:通了"}] }'

如果返回里能看到"content": "通了"之类的字段,说明 Key 和通道没问题,可以进入配置环节。如果报 401,检查 Key 有没有复制完整;如果报 model not found,说明模型名要换成你账号下可用的模型,具体可用模型列表可以在模型对话页面确认:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

3. 可复制配置:settings.json 与 config.toml 骨架

配置的核心思路是:把「凭证」和「模型参数」分离,凭证走环境变量,模型参数走配置文件。这样 LangChain 和 LangGraph 读同一份配置,改模型只改一处。

先建项目目录结构:

mkdir my-first-agent && cd my-first-agent mkdir -p config src touch config/settings.json config/config.toml .env

3.1 settings.json:给 LangChain 用的模型配置

config/settings.json负责描述模型适配器参数,LangChain 的ChatOpenAI直接读它:

{ "llm": { "provider": "openai-compatible", "model": "gpt-4o-mini", "base_url": "https://taotoken.net/api/v1", "api_key_env": "TAOTOKEN_API_KEY", "temperature": 0.7, "timeout": 60, "max_retries": 2 }, "agent": { "system_prompt": "你是一个友好的AI助手,用简洁易懂的语言回答用户问题。", "max_iterations": 8 } }

这里几个字段值得说明:base_url指向 TaoToken 的 API 地址加/v1,这是 OpenAI 兼容协议的标准路径;api_key_env写的是环境变量名而不是 Key 本身,代码里用os.getenv读,避免硬编码;max_retries设 2 次,网络抖动时能自动重试。

3.2 config.toml:给 LangGraph 和运行时用的配置

config/config.toml负责 LangGraph 的状态图参数和运行时行为:

[graph] checkpointer = "memory" thread_prefix = "user_" recursion_limit = 25 [memory] type = "short_term" max_messages = 20 [logging] level = "INFO" log_tool_calls = true [model] settings_file = "config/settings.json"

checkpointer = "memory"表示用内存检查点,适合本地开发;recursion_limit控制状态图最大步数,防止 Agent 陷入循环;max_messages限制短期记忆保留的对话轮数,避免上下文无限增长导致 token 成本失控。

3.3 .env:唯一放 Key 的地方

TAOTOKEN_API_KEY=你的Key

.env必须加进.gitignore:

echo ".env" >> .gitignore

3.4 加载配置的 Python 骨架

src/config_loader.py把两份配置读进来,供 LangChain 和 LangGraph 共用:

import json import os import tomllib from pathlib import Path from dotenv import load_dotenv load_dotenv() def load_settings(path="config/settings.json"): with open(path, "r", encoding="utf-8") as f: return json.load(f) def load_runtime_config(path="config/config.toml"): with open(path, "rb") as f: return tomllib.load(f) def build_llm(): from langchain_openai import ChatOpenAI settings = load_settings() llm_cfg = settings["llm"] api_key = os.getenv(llm_cfg["api_key_env"]) if not api_key: raise RuntimeError(f"环境变量 {llm_cfg['api_key_env']} 未设置") return ChatOpenAI( model=llm_cfg["model"], temperature=llm_cfg["temperature"], api_key=api_key, base_url=llm_cfg["base_url"], timeout=llm_cfg["timeout"], max_retries=llm_cfg["max_retries"], )

注意base_url参数名,新版 langchain-openai 用的是base_url,老版本是openai_api_base,如果你装的是旧版会报参数错误,升级到langchain-openai>=0.2即可。

4. 验证请求:跑通第一个 Agent 调用链路

配置写完,先验证模型能通,再验证 Agent 能跑。

4.1 验证模型连通

src/check_llm.py:

from config_loader import build_llm llm = build_llm() resp = llm.invoke("只回复两个字:通了") print("模型返回:", resp.content)

运行:

pip install langchain-openai python-dotenv python src/check_llm.py

看到「模型返回:通了」就说明 LangChain 通过 TaoToken 通道调通了。

4.2 验证 Agent 带工具调用

src/first_agent.py:

from datetime import datetime from langchain_core.tools import tool from langchain.agents import create_agent from config_loader import build_llm, load_settings @tool def get_current_time(): """返回当前的日期和时间。当用户询问现在几点、今天日期、当前时间时调用此工具。""" return datetime.now().strftime("%Y-%m-%d %H:%M:%S") @tool def calculator(expression: str): """计算数学表达式。输入应该是字符串形式的数学表达式,如 '2+3*4'。""" try: result = eval(expression, {"__builtins__": {}}, {}) return f"计算结果:{expression} = {result}" except Exception as e: return f"计算失败:{str(e)}" settings = load_settings() agent = create_agent( model=build_llm(), tools=[get_current_time, calculator], system_prompt=settings["agent"]["system_prompt"], ) result = agent.invoke({"messages": [{"role": "user", "content": "现在几点?顺便算一下 12*8+5"}]}) print(result["messages"][-1].content)

运行后应该能看到 Agent 先调用get_current_time,再调用calculator,最后整合成一句回答。这一步跑通,说明「模型 + 工具 + 统一 Key」这条链路完整了。

4.3 验证 LangGraph 短期记忆

src/graph_agent.py:

from typing import TypedDict, Annotated from langgraph.checkpoint.memory import InMemorySaver from langgraph.graph import StateGraph, END from langgraph.graph.message import add_messages from first_agent import agent class AgentState(TypedDict): messages: Annotated[list, add_messages] def run_agent(state: AgentState): result = agent.invoke({"messages": state["messages"]}) return {"messages": [result["messages"][-1]]} graph = StateGraph(AgentState) graph.add_node("agent", run_agent) graph.set_entry_point("agent") graph.add_edge("agent", END) checkpointer = InMemorySaver() app = graph.compile(checkpointer=checkpointer) config = {"configurable": {"thread_id": "user_123"}} app.invoke({"messages": [{"role": "user", "content": "我叫张三"}]}, config) out = app.invoke({"messages": [{"role": "user", "content": "我叫什么名字?"}]}, config) print(out["messages"][-1].content)

如果第二次调用能答出「你叫张三」,说明thread_id和 checkpointer 生效,短期记忆通了。同一个thread_id代表同一个会话,换用户就换thread_id。

5. 本篇常见错排查

配置环节的报错基本集中在下面几类,对照排查能省很多时间。

报错信息常见原因处理方式
401 UnauthorizedKey 没读到或复制不全检查.env是否被load_dotenv加载,echo $TAOTOKEN_API_KEY确认
model not found模型名不在账号可用列表到模型对话页面确认可用模型名
Connection errorbase_url 写错确认是https://taotoken.net/api/v1,不要漏/v1
TypeError: unexpected keywordlangchain-openai 版本旧升级到 0.2 以上,或改用openai_api_base
Agent 不调用工具工具 docstring 描述不清把「什么时候调用」写进 docstring
记忆不生效thread_id 每次不同同一会话固定同一个 thread_id
递归超限状态图陷入循环调低recursion_limit或检查工具返回

提示:如果 Agent 反复调用同一个工具停不下来,先看工具的返回值是不是空或者异常,模型拿不到有效结果会一直重试。

还有一个容易忽略的点:config.toml用tomllib读取时必须以二进制模式打开("rb"),用文本模式会报TypeError。Python 3.11 以下没有内置tomllib,需要pip install tomli并改导入。

6. 下一步:把配置骨架用起来

配置骨架跑通之后,你手上就有了一个可复用的底座:模型参数在settings.json,运行时行为在config.toml,凭证在.env,LangChain 和 LangGraph 读同一份配置。后面加工具、加记忆、换模型,都只改配置不改调用代码。

如果你要接着做更复杂的编排,建议先把接入文档过一遍,确认参数和路径细节:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。Key 管理和新建入口在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,需要多环境隔离时可以建多个 Key 分别给开发和生产用。

想先直观感受一下模型对话效果,可以直接在 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 里试,确认模型行为符合预期再写进 Agent。长期跑编码类 Agent 的话,Coding Plan 的入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,和本篇的配置骨架配合使用即可。

最后留一个我踩过的坑:settings.json里的base_url千万别写成带 UTM 参数的完整链接,配置里只写干净的 API 地址,参数是给浏览器和统计用的,写进代码只会让请求路径出错。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询