DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

AutoGen 交接目标名带空格,运行时才报 Invalid name

AutoGen 0.7.5 自动生成的交接工具名含空格时,核对工具命名、目标 Agent 与参与者一致性,保留长度、重名和版本边界。

Handoff(target="Support Desk") 可以构造出来,加入 AssistantAgent 后,却在转换工具或第一次模型调用时失败:

ValueError: Invalid name: transfer_to_support desk

先看报错里的名称。transfer_to_support desk 是交接工具名,包含空格;它与目标 Agent 是否已经加入团队是两项不同的检查。

本文针对 Python 3.13、AutoGen 的 autogen-agentchat、autogen-core、autogen-ext 0.7.5,模型客户端为 OpenAIChatCompletionClient。其他客户端接受的名称规则可能不同,不把这条错误推广成所有服务商的行为。

默认生成的工具名没有走同一项校验

0.7.5 的 Handoff 在未提供 name 时,将 transfer_to_ 与 target 拼接再转成小写。这个默认路径不会像显式名称那样检查 isidentifier(),所以目标中的空格会直接进入工具名。

OpenAI 客户端随后转换工具时,要求名称只包含 ASCII 字母、数字、下划线和连字符,并检查长度不超过 64 个字符。因而构造交接配置成功,不证明它能送到该模型客户端。

下面的示例只查看配置和工具 schema,不请求模型:

from autogen_agentchat.base import Handoff

handoff = Handoff(target="Support Desk")
print(repr(handoff.name))
print(handoff.handoff_tool.schema["name"])

定位时把生成的工具名、target 和实际参与者名称分别记下。错误出现在工具转换阶段时,给提示词补一句“正确交接”不会改变已生成的工具 schema;也不需要先怀疑 API 密钥或网络连接。

用合法标识路由,把显示文字放进描述

在团队内部,target 应与接收方 Agent 的 name 一致。这个版本的普通聊天 Agent 名称也要求有效的 Python 标识符,不能为了保留界面上的“Support Desk”,直接把带空格的文字当作 Agent 名。

下面给出一个完整的团队构造函数。model_client 由应用传入,需支持工具调用;函数只构建对象,不启动会话,也不关闭调用方的客户端:

from autogen_core.models import ChatCompletionClient
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.base import Handoff
from autogen_agentchat.conditions import (
    MaxMessageTermination,
    TextMentionTermination,
)
from autogen_agentchat.teams import Swarm

def build_support_team(model_client: ChatCompletionClient) -> Swarm:
    support_name = "support_desk"
    route = Handoff(
        target=support_name,
        name="transfer_to_support_desk",
        description="Transfer the request to Support Desk.",
    )
    triage = AssistantAgent(
        name="triage",
        model_client=model_client,
        handoffs=[route],
        system_message="Transfer support requests to support_desk.",
    )
    support = AssistantAgent(
        name=support_name,
        model_client=model_client,
        description="Support Desk handles support requests.",
        system_message=(
            "Answer the support request. "
            "When the answer is complete, finish with DONE."
        ),
    )
    stop = (
        TextMentionTermination("DONE", sources=[support_name])
        | MaxMessageTermination(8)
    )
    return Swarm([triage, support], termination_condition=stop)

这里界面可继续显示“Support Desk”,但路由使用 support_desk,工具使用 transfer_to_support_desk。三者用途清楚,接收方也确实出现在团队参与者中。终止词和八条消息上限是示例设置,需要按实际业务调整;构造成功不证明模型一定会交接或完整答复。

如果目标属于外部用户而非团队 Agent,应按应用的人工交接流程设计停止与恢复,不把这个内部参与者示例直接照搬。若保存后再加载上面的终止条件,还要核对来源限制是否保留;它不能因为本次修正了工具名就被忽略。

检查长度、重名,再检查实际交接

自定义 Handoff.name 的 Python 标识符检查与模型客户端的规则并不完全相同。例如某些非 ASCII 名称可以是 Python 标识符,仍会被该 OpenAI 客户端拒绝;反过来,也不能把客户端允许的连字符直接当成自定义 Handoff 一定接受的名称。选择短的 ASCII 标识符,并同时满足两边规则。

同一个 Agent 的多个交接工具不能重名,也不能与普通工具冲突。自动替换非法字符时,两个不同显示名称可能变成相同的工具名,因此批量规范化以后仍需检查唯一性。仅截断超长名称也可能制造冲突。

验收顺序是:生成的工具 schema 名称合格,运行时不再出现名称转换异常,交接消息的 target 与实际接收方相符,接收方确实继续处理任务。不要只验证异常消失,就把交接认作成功。改名也会影响已有交接消息、持久化会话或配置里的目标标识,迁移前应保留原配置并核对这些引用。

0.7.5 的默认名称路径仍有这个限制。不能仅因存在修正代码就认定已经进入可安装版本;升级时应核对目标版本的实际行为。回退配置时恢复相互匹配的 Agent 名称、交接目标和工具名称,不能只恢复界面显示文字。