☰
UE/EP 添加右键菜单:TaoToken 统一 Key 接入配置与验证
2026/9/29 4:12:47 网站建设 项目流程

1. 为什么要在 UE/EP 里加右键菜单,还要接统一 Key

如果你在做 Unreal Engine 编辑器扩展(Editor Plugin,简称 EP),大概率遇到过这个场景:美术在 Content Browser 里选中一堆贴图,想批量跑一遍压缩检查;TA 在关卡里右键某个 Actor,想直接调一个内部工具做 LOD 校验;程序在资产上右键,想触发一次基于大模型的命名规范审查。这些动作如果每次都让人去点菜单栏、翻工具栏,效率会被拖垮。右键菜单(Context Menu)就是把这些高频操作塞到鼠标手边最直接的方式。

但真正麻烦的不是“怎么加菜单”,而是菜单点下去之后要调外部服务时,Key 怎么管。UE 项目通常是多人协作,编辑器扩展里如果硬编码一个 API Key,提交到版本库就等于泄露;每个人各自填 Key,又会出现“我这能跑你那报 401”的扯皮。我试过把 Key 塞进DefaultGame.ini,结果打包时忘了排除,差点出事。

所以这篇要解决的是两件事叠在一起:一是在 UE/EP 里把右键菜单注册起来,二是让菜单背后的 API 调用走一套统一的 Key 通道,团队里谁都不用关心 Key 从哪来。TaoToken 在这里扮演的角色就是那个统一入口——你拿到一个 Key,就能通过它的 API 通道访问多种模型,编辑器扩展侧只需要认一个 base URL 和一个 Key,配置骨架固定下来,换模型不用改代码。

适合谁看:正在写或准备写 UE Editor Plugin 的开发者、需要给内部工具加右键入口的 TA、以及被“多人多 Key”折磨过的团队。下面从配置骨架开始,一步步把链路跑通。

2. TaoToken 前置:统一 Key 与 API 通道在 EP 里的定位

在 UE 编辑器扩展里调外部 API,本质就是插件里的 C++ 或 Python 代码发一个 HTTP 请求。问题在于这个请求的“目的地”和“凭证”如果散落在各处,维护成本会指数上升。TaoToken 的做法是提供一个统一的 API 端点,你用同一个 Key 就能请求不同模型,编辑器扩展侧只维护一份配置。

先把入口理清楚,后面配置会反复用到:

  • 官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
  • API 基址:https://taotoken.net/api (这个不加 UTM,直接作为请求前缀)
  • 模型对话页:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
  • Coding Plan 页:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
  • 控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
  • API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
  • 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
  • ClaudeCodeAnthropic 说明:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code&utm_campaign=rewrite

注意:Key 只在 API Keys 页面生成和查看,生成后立刻复制保存,页面刷新后不再完整显示。编辑器扩展里不要硬编码,走环境变量或本地配置文件。

为什么强调“统一”?因为 UE 项目里往往不止一个工具要调模型:命名审查一个、材质描述生成一个、蓝图注释补全一个。如果每个插件各自管 Key,团队里就会出现 N 份配置。统一到 TaoToken 后,插件侧只认TAOTOKEN_API_KEY和TAOTOKEN_BASE_URL两个变量,换模型只改请求体里的 model 字段,不动基础设施。

3. 可复制配置:settings.json / config.toml 骨架与 CC Switch、Cline 片段

这一节给的是可以直接抄的配置骨架。UE 编辑器扩展本身不强制你用某种配置文件格式,但团队协作时建议统一。下面分三块:通用 JSON 骨架、TOML 骨架、以及 CC Switch / Cline 的片段。

3.1 settings.json 骨架(编辑器扩展侧读取)

把这份放到插件目录下的Config/里,或者放到用户目录避免提交到版本库。字段含义我写在注释里,实际 JSON 不支持注释,抄的时候删掉。

{ "taotoken": { "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "default_model": "claude-sonnet", "timeout_seconds": 30, "max_retries": 2 }, "context_menu": { "enabled": true, "menu_label": "TaoToken 工具", "show_on_asset": true, "show_on_actor": true } }

关键点:api_key_env指向环境变量名,而不是 Key 本身。这样配置文件可以进版本库,Key 留在每个人本机。

3.2 config.toml 骨架(Python 侧工具常用)

UE 的 Editor Utility Widget 或 Python 脚本经常用 TOML。骨架如下:

[taotoken] base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" default_model = "claude-sonnet" timeout_seconds = 30 [context_menu] enabled = true menu_label = "TaoToken 工具"

3.3 CC Switch 配置片段

CC Switch 用来在多个模型通道之间切换,配置里指向 TaoToken 的基址即可:

{ "provider": "taotoken", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "models": ["claude-sonnet", "gpt-4o", "deepseek-chat"] }

3.4 Cline 配置片段

Cline 作为编辑器内的编码助手,同样走统一 Key:

{ "cline.provider": "openai-compatible", "cline.baseUrl": "https://taotoken.net/api", "cline.apiKey": "${env:TAOTOKEN_API_KEY}", "cline.model": "claude-sonnet" }

提示:${env:TAOTOKEN_API_KEY}这种写法依赖工具支持环境变量插值。如果你的工具不支持,就在启动脚本里先 export,再让工具读明文变量。

环境变量设置(Windows PowerShell 和 macOS/Linux 各一份):

$env:TAOTOKEN_API_KEY = "你的Key" $env:TAOTOKEN_BASE_URL = "https://taotoken.net/api"
export TAOTOKEN_API_KEY="你的Key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"

4. 右键菜单注册与 API 调用验证

配置就位后,进入工程实践。UE 编辑器扩展加右键菜单有两条主流路径:C++ 的FExtender+FToolMenu,以及 Python 的tool_menus。下面各给一个可跑的最小实现,然后接上 API 调用。

4.1 C++ 侧注册右键菜单

在插件的StartupModule里扩展 Content Browser 的资产右键菜单:

void FMyEditorPluginModule::StartupModule() { FContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser"); TArray<FContentBrowserMenuExtender_SelectedAssets>& Extenders = ContentBrowserModule.GetAllAssetViewContextMenuExtenders(); Extenders.Add(FContentBrowserMenuExtender_SelectedAssets::CreateRaw( this, &FMyEditorPluginModule::OnExtendAssetContextMenu)); } TSharedRef<FExtender> FMyEditorPluginModule::OnExtendAssetContextMenu( const TArray<FAssetData>& SelectedAssets) { TSharedRef<FExtender> Extender = MakeShared<FExtender>(); Extender->AddMenuExtension( "GetAssetActions", EExtensionHook::After, nullptr, FMenuExtensionDelegate::CreateRaw(this, &FMyEditorPluginModule::AddTaoTokenMenuEntry, SelectedAssets)); return Extender; }

AddTaoTokenMenuEntry里创建菜单项,点击后触发 API 调用。菜单标签用配置里的menu_label,别写死。

4.2 Python 侧注册右键菜单

如果你更习惯 Python,Editor Utility 里可以这样加:

import unreal def on_taotoken_clicked(): unreal.log("TaoToken 菜单被点击") call_taotoken_api() menus = unreal.ToolMenus.get() asset_menu = menus.find_menu("ContentBrowser.AssetContextMenu") entry = unreal.ToolMenuEntry( name="TaoTokenAction", type=unreal.MultiBlockType.MENU_ENTRY, insert_position=unreal.ToolMenuInsert("", unreal.ToolMenuInsertType.First) ) entry.set_label("TaoToken 工具") entry.set_string_command( unreal.ToolMenuStringCommandType.PYTHON, "", "on_taotoken_clicked()" ) asset_menu.add_menu_entry("GetAssetActions", entry) menus.refresh_all_widgets()

4.3 菜单背后的 API 调用

菜单点下去之后,用 Python 发请求最省事:

import os, json, urllib.request def call_taotoken_api(): base = os.environ.get("TAOTOKEN_BASE_URL", "https://taotoken.net/api") key = os.environ.get("TAOTOKEN_API_KEY") if not key: raise RuntimeError("TAOTOKEN_API_KEY 未设置") payload = { "model": "claude-sonnet", "messages": [ {"role": "user", "content": "用一句话说明这个资产命名是否规范"} ] } req = urllib.request.Request( base + "/v1/chat/completions", data=json.dumps(payload).encode("utf-8"), headers={ "Content-Type": "application/json", "Authorization": "Bearer " + key }, method="POST" ) with urllib.request.urlopen(req, timeout=30) as resp: result = json.loads(resp.read().decode("utf-8")) print(result["choices"][0]["message"]["content"])

C++ 侧用FHttpModule发同样的请求,Header 里带Authorization: Bearer <key>,body 结构一致。

5. 验证请求与成功结果

配置和代码都写完后,别急着在编辑器里点菜单,先用命令行验证链路,能省掉大量“到底是 Key 错还是代码错”的排查时间。

5.1 命令行验证

curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -d '{ "model": "claude-sonnet", "messages": [{"role": "user", "content": "ping"}] }'

成功时你会看到类似结构:

{ "choices": [ { "message": { "role": "assistant", "content": "pong" } } ] }

只要choices[0].message.content有内容,说明 Key、基址、模型名三者都对。这一步过了,再回编辑器点菜单。

5.2 编辑器内验证动作

在 Content Browser 里选中一个资产,右键,应该能看到“TaoToken 工具”。点击后看 Output Log,如果打印出模型返回内容,链路就通了。如果菜单没出现,先确认插件已启用、编辑器已重启;如果菜单出现但点击报错,看 Output Log 里的 HTTP 状态码。

5.3 参数对照表

参数作用常见取值
base_urlAPI 前缀https://taotoken.net/api
api_key_env环境变量名TAOTOKEN_API_KEY
default_model默认模型claude-sonnet / gpt-4o
timeout_seconds超时30
max_retries重试次数2

6. 本篇常见错排查

链路跑不通时,按下面顺序查,基本能覆盖九成问题。

菜单不出现:最常见是插件没启用,或者StartupModule里模块加载失败。检查.uplugin的Modules配置,确认LoadingPhase是PostEngineInit或更晚。Python 侧则要确认menus.refresh_all_widgets()被调用了。

401 Unauthorized:Key 没读到。先确认环境变量在当前进程里可见——UE 编辑器如果是通过桌面图标启动的,可能读不到你终端里 export 的变量。解决办法是在系统环境变量里设置,或者用启动脚本先 export 再拉起编辑器。

404 Not Found:基址拼错。base_url末尾不要带/v1,请求路径里再拼/v1/chat/completions。如果你把 base 写成https://taotoken.net/api/v1,就会变成/api/v1/v1/...。

超时:timeout_seconds太短,或者网络抖动。把重试打开,max_retries设 2 到 3。

模型名报错:不同模型名不通用。去模型对话页确认当前可用的模型标识,别凭记忆写。

中文乱码:请求体编码用 UTF-8,Header 里Content-Type: application/json别漏。

注意:如果团队里有人能跑有人不能,先对比环境变量是否一致,再看是不是有人用了旧版插件缓存。UE 的插件缓存偶尔会作怪,删掉Intermediate/重新生成一次。

排查完还卡住的话,接入文档里有更细的请求示例,API Keys 页面可以重新生成 Key 排除 Key 本身的问题。验证模型是否可用,直接去模型对话页发一条消息最快。

7. 把链路固定下来:长期编码与 Agent 场景的配置建议

右键菜单跑通只是第一步。如果你的团队要长期在 UE 编辑器扩展里用模型能力,建议把配置固化成两层:一层是团队共享的settings.json骨架(不含 Key),一层是每个人本机的环境变量。这样新人入职只需要设置一个环境变量,插件拉下来就能跑。

对于需要长时间跑编码任务或 Agent 流程的场景,比如批量资产审查、自动生成蓝图注释,单次请求的超时和重试策略要调得更保守,timeout_seconds可以放到 60,max_retries放到 3。Coding Plan 页里有针对这类长任务的通道说明,配置方式与上面一致,只是模型选择上更偏向代码能力强的型号。

最后给一个实用技巧:在插件里加一个“测试连接”的菜单项,点击后发一条极短的 ping 请求,把状态码和耗时打到 Output Log。这样每次换机器、换 Key、换网络,先点一下测试连接,比直接跑业务逻辑再排查要快得多。菜单注册的代码复用同一套FExtender,只是回调里换成 ping 请求,成本很低,收益很高。

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

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

立即咨询