LangChain · Agent

LangChain 接入 Tikway:ChatOpenAI 配置与 Agent 工具调用

更新日期:

想给自己的 Python 应用接入 AI Agent,可以先用 LangChain 的 ChatOpenAI 连接 Tikway,再逐步验证工具调用。基础地址、模型 ID 和 Key 配对正确后,模型负责生成工具调用请求,Python 应用负责执行工具并把结果返回模型。本文用一个只做整数加法的本地工具演示这个过程,不需要接入搜索服务或访问业务数据。

1. 先选支持工具调用的模型

打开模型目录,选择同时支持 OpenAI 协议、Chat Completions 和工具调用 / Function Calling 的文本模型,复制完整 ID。文本问答成功不代表工具调用也成功,单独核对所选型号的能力和参数。

从控制台创建 Tikway API Key。这里的 Base URL 为 https://api.tikway.ai/v1;SDK 会追加 /chat/completions。不要把完整端点当作 Base URL,也不要把官网业务接口 /api 地址填进模型客户端。

在自己的 Python 虚拟环境中安装:

bash
python -m pip install -U langchain-openai

配置当前终端的环境变量。下面是 Bash / macOS / Linux / WSL 写法:

bash
export TIKWAY_API_KEY='替换为你的 Tikway API Key'
export TIKWAY_MODEL='替换为目录中的完整模型 ID'

Windows PowerShell 写法:

powershell
$env:TIKWAY_API_KEY = '替换为你的 Tikway API Key'
$env:TIKWAY_MODEL = '替换为目录中的完整模型 ID'

2. 先测试一条普通文本请求

保存为 langchain_chat.py。运行脚本会调用真实模型并产生适用的 API 费用。本文提供配置和自检方法,尚未对你的账号、所选模型或工具流程进行端到端验证。

python
import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model=os.environ["TIKWAY_MODEL"],
    api_key=os.environ["TIKWAY_API_KEY"],
    base_url="https://api.tikway.ai/v1",
    use_responses_api=False,
    timeout=60,
    max_retries=0,
)

response = llm.invoke("只回复 OK")
print(response.content)
print(response.usage_metadata)
bash
python langchain_chat.py

use_responses_api=False 将示例明确限定在 Chat Completions 路径。不要额外启用 OpenAI 内置 Web Search、Code Interpreter 或远程 MCP,并推定这些能力也能通过同一路径使用。它们属于不同接口和工具形态,需要另外确认。

3. 加上一个可核对结果的本地工具

文本请求正常后,保存下面的代码为 langchain_agent.py。它最多发送三轮模型请求,关闭自动重试,遇到未知工具或无效参数就停止,便于定位首次工具调用。示例不执行模型生成的任意代码。

python
import os
from langchain_core.messages import HumanMessage, ToolMessage
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

@tool
def add_numbers(a: int, b: int) -> int:
    """Add two integers and return their sum."""
    return a + b

llm = ChatOpenAI(
    model=os.environ["TIKWAY_MODEL"],
    api_key=os.environ["TIKWAY_API_KEY"],
    base_url="https://api.tikway.ai/v1",
    use_responses_api=False,
    timeout=60,
    max_retries=0,
)
agent = llm.bind_tools([add_numbers])
messages = [HumanMessage(content="使用 add_numbers 工具计算 17 + 25,然后报告结果。")]
tool_seen = False

for step in range(3):
    answer = agent.invoke(messages)
    messages.append(answer)
    print("step:", step + 1, "usage:", answer.usage_metadata)
    if not answer.tool_calls:
        print(answer.content)
        if not tool_seen:
            raise RuntimeError("模型没有请求工具;这次未完成工具调用验证")
        break
    for call in answer.tool_calls:
        if call["name"] != add_numbers.name:
            raise RuntimeError("模型请求了未允许的工具")
        result = add_numbers.invoke(call["args"])
        tool_seen = True
        print("tool:", call["name"], "args:", call["args"], "result:", result)
        messages.append(ToolMessage(content=str(result), tool_call_id=call["id"]))
else:
    raise RuntimeError("达到三轮上限,工具流程仍未结束")
bash
python langchain_agent.py

核对日志里是否出现 add_numbers、参数 17 和 25、本地返回值 42,以及随后基于工具结果的最终回答。仅看到模型直接说“42”,还不能说明工具真的被执行。保留 tool_call_id 配对,模型消息后应追加对应工具结果;不要只把工具返回值当成普通用户消息。

4. 怎么排查 Agent 接入问题?

现象 优先检查
401 Key 是否属于 Tikway、是否复制了空格、运行终端是否读到了新变量;参考 401 排查
404 或返回 HTML 实际 URL 是否是 /v1/chat/completions,有没有重复 /v1 或误用了官网 /api
普通文本成功但 tools 报错 所选模型和路由是否支持 Function Calling,工具 schema 是否符合要求
没有工具调用 查看 tool_calls;确认模型能力、工具描述与任务要求,再做小规模测试
有工具请求却无法结束 检查本地函数错误、参数校验、tool_call_id 和消息顺序;限制轮次
流式输出异常 先确认非流式工具流程,再阅读 SSE 排查

本地工具能够运行,也不等于所有第三方工具、MCP 服务或 LangGraph Agent 功能都已兼容。接入真实业务时逐个验证工具,只提供任务所需权限;这里的加法示例可作为最小复现。

5. Agent 费用为什么比一次聊天高?

一次 Agent 任务可能包含多轮请求。工具定义、历史消息和工具返回值会增加后续输入,最终回答还会产生输出 Token。先用费用计算器估算每轮文本预算,再结合实际轮次、usage 与控制台调用记录核对;不要把一轮价格当作整个 Agent 任务的价格。

继续阅读:Agent API 接入与选型 · Dify 接入 Tikway · n8n AI Agent 接入 Tikway · 模型与费用核对

配置参考:LangChain ChatOpenAI 官方文档。示例采用文档中的自定义 Base URL、bind_tools 和工具消息方式;不同版本或模型的参数支持可能不同。