ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

UE/EP 添加右键菜单:TaoToken 统一 Key 接入配置与验证

UE/EP 添加右键菜单:TaoToken 统一 Key 接入配置与验证 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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址https://taotoken.net/api 这个不加 UTM直接作为请求前缀模型对话页https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewriteCoding Plan 页https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteClaudeCodeAnthropic 说明https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite注意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/apiexport TAOTOKEN_API_KEY你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api4. 右键菜单注册与 API 调用验证配置就位后进入工程实践。UE 编辑器扩展加右键菜单有两条主流路径C 的FExtenderFToolMenu以及 Python 的tool_menus。下面各给一个可跑的最小实现然后接上 API 调用。4.1 C 侧注册右键菜单在插件的StartupModule里扩展 Content Browser 的资产右键菜单void FMyEditorPluginModule::StartupModule() { FContentBrowserModule ContentBrowserModule FModuleManager::LoadModuleCheckedFContentBrowserModule(ContentBrowser); TArrayFContentBrowserMenuExtender_SelectedAssets Extenders ContentBrowserModule.GetAllAssetViewContextMenuExtenders(); Extenders.Add(FContentBrowserMenuExtender_SelectedAssets::CreateRaw( this, FMyEditorPluginModule::OnExtendAssetContextMenu)); } TSharedRefFExtender FMyEditorPluginModule::OnExtendAssetContextMenu( const TArrayFAssetData SelectedAssets) { TSharedRefFExtender Extender MakeSharedFExtender(); Extender-AddMenuExtension( GetAssetActions, EExtensionHook::After, nullptr, FMenuExtensionDelegate::CreateRaw(this, FMyEditorPluginModule::AddTaoTokenMenuEntry, SelectedAssets)); return Extender; }AddTaoTokenMenuEntry里创建菜单项点击后触发 API 调用。菜单标签用配置里的menu_label别写死。4.2 Python 侧注册右键菜单如果你更习惯 PythonEditor 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( nameTaoTokenAction, typeunreal.MultiBlockType.MENU_ENTRY, insert_positionunreal.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, datajson.dumps(payload).encode(utf-8), headers{ Content-Type: application/json, Authorization: Bearer key }, methodPOST ) with urllib.request.urlopen(req, timeout30) as resp: result json.loads(resp.read().decode(utf-8)) print(result[choices][0][message][content])C 侧用FHttpModule发同样的请求Header 里带Authorization: Bearer keybody 结构一致。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/apiapi_key_env环境变量名TAOTOKEN_API_KEYdefault_model默认模型claude-sonnet / gpt-4otimeout_seconds超时30max_retries重试次数26. 本篇常见错排查链路跑不通时按下面顺序查基本能覆盖九成问题。菜单不出现最常见是插件没启用或者StartupModule里模块加载失败。检查.uplugin的Modules配置确认LoadingPhase是PostEngineInit或更晚。Python 侧则要确认menus.refresh_all_widgets()被调用了。401 UnauthorizedKey 没读到。先确认环境变量在当前进程里可见——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-8Header 里Content-Type: application/json别漏。注意如果团队里有人能跑有人不能先对比环境变量是否一致再看是不是有人用了旧版插件缓存。UE 的插件缓存偶尔会作怪删掉Intermediate/重新生成一次。排查完还卡住的话接入文档里有更细的请求示例API Keys 页面可以重新生成 Key 排除 Key 本身的问题。验证模型是否可用直接去模型对话页发一条消息最快。7. 把链路固定下来长期编码与 Agent 场景的配置建议右键菜单跑通只是第一步。如果你的团队要长期在 UE 编辑器扩展里用模型能力建议把配置固化成两层一层是团队共享的settings.json骨架不含 Key一层是每个人本机的环境变量。这样新人入职只需要设置一个环境变量插件拉下来就能跑。对于需要长时间跑编码任务或 Agent 流程的场景比如批量资产审查、自动生成蓝图注释单次请求的超时和重试策略要调得更保守timeout_seconds可以放到 60max_retries放到 3。Coding Plan 页里有针对这类长任务的通道说明配置方式与上面一致只是模型选择上更偏向代码能力强的型号。最后给一个实用技巧在插件里加一个“测试连接”的菜单项点击后发一条极短的 ping 请求把状态码和耗时打到 Output Log。这样每次换机器、换 Key、换网络先点一下测试连接比直接跑业务逻辑再排查要快得多。菜单注册的代码复用同一套FExtender只是回调里换成 ping 请求成本很低收益很高。
返回列表