例行检查
你的版本
问题描述, 日志截图,配置文件等
Skill 详情页的"skill 配置"中,内嵌 iframe 显示的是 FastGPT 页面自身,而非 sandbox 编辑器内容。
在 SHOW_SKILL=true 且使用 K8s 部署(OpenSandbox Server 通过 Ingress 暴露)的场景下,getSandboxProxyTarget 的 URL 拼接逻辑存在问题:
proxy.ts URL 拼接在 useServerProxy 模式下错误
当 AGENT_SANDBOX_OPENSANDBOX_USE_SERVER_PROXY=true(默认值)时,OpenSandbox 服务端返回的 endpoint 格式为:
server-host/sandboxes/{id}/proxy/8080
而 @fastgpt-sdk/sandbox-adapter 的 getEndpoint() 将整个字符串赋给 host 字段(因为 lastIndexOf(":") 找不到冒号)。
proxy.ts 固定拼接 ${protocol}://${host}:${targetPort},产生错误 URL:
https://server-host/sandboxes/{id}/proxy/8080:8080
↑ 端口追加在路径末尾
根因:proxy.ts 假设 host 是纯主机名然后拼接 :port,但 useServerProxy=true 模式下 endpoint 是带路径的 URL,host 字段包含完整路径。adapter 返回的 url 字段(如 https://server-host/sandboxes/{id}/proxy/8080)是正确的,但 proxy.ts 没有使用它。
此问题在 K8s 部署中尤为突出:当 OpenSandbox Server 通过 Ingress 暴露时(BASEURL=https://domain.com,无显式端口),endpoint 字符串不含冒号,adapter 的 host:port 解析逻辑完全失效。
复现步骤
- 使用 K8s 部署 OpenSandbox Server,通过 Ingress 暴露(HTTPS,无显式端口)
- 设置
AGENT_SANDBOX_OPENSANDBOX_BASEURL=https://your-domain.com
- 设置
AGENT_SANDBOX_OPENSANDBOX_USE_SERVER_PROXY=true(默认)
- 打开 Skill 详情页,点击"skill 配置"
- SSE 流正确返回 sandbox endpoint(phase: ready)
- iframe 加载
/proxy/{sandboxId}/{port}/,但显示 FastGPT 页面而非 sandbox 内容
预期结果
iframe 应通过 server.ts 的代理逻辑转发到 sandbox 容器,显示 sandbox 编辑器内容。
修复建议
- Dockerfile:在 builder 阶段用 esbuild 编译
server.ts,覆盖 standalone 默认 server:
RUN cd projects/app && ./node_modules/.bin/esbuild server.ts \
--bundle --platform=node --format=cjs \
--outfile=server-proxy.js --external:next
COPY --from=builder /app/projects/app/server-proxy.js /app/projects/app/server-proxy.js
proxy.ts:使用 endpoint.url 替代 host:port 拼接:
// 当前(错误):
const { host, protocol } = sandbox.metadata!.endpoint!;
return `${protocol}://${host}:${targetPort}`;
// 建议修复:
const endpoint = sandbox.metadata!.endpoint!;
return endpoint.url || `${endpoint.protocol}://${endpoint.host}:${targetPort}`;
proxyUtils.ts:ProxySession 缓存完整 target URL 而非拆分存储 host + protocol。
例行检查
你的版本
问题描述, 日志截图,配置文件等
Skill 详情页的"skill 配置"中,内嵌 iframe 显示的是 FastGPT 页面自身,而非 sandbox 编辑器内容。
在
SHOW_SKILL=true且使用 K8s 部署(OpenSandbox Server 通过 Ingress 暴露)的场景下,getSandboxProxyTarget的 URL 拼接逻辑存在问题:proxy.tsURL 拼接在 useServerProxy 模式下错误当
AGENT_SANDBOX_OPENSANDBOX_USE_SERVER_PROXY=true(默认值)时,OpenSandbox 服务端返回的 endpoint 格式为:而
@fastgpt-sdk/sandbox-adapter的getEndpoint()将整个字符串赋给host字段(因为lastIndexOf(":")找不到冒号)。proxy.ts固定拼接${protocol}://${host}:${targetPort},产生错误 URL:根因:
proxy.ts假设host是纯主机名然后拼接:port,但useServerProxy=true模式下 endpoint 是带路径的 URL,host字段包含完整路径。adapter 返回的url字段(如https://server-host/sandboxes/{id}/proxy/8080)是正确的,但proxy.ts没有使用它。此问题在 K8s 部署中尤为突出:当 OpenSandbox Server 通过 Ingress 暴露时(
BASEURL=https://domain.com,无显式端口),endpoint 字符串不含冒号,adapter 的host:port解析逻辑完全失效。复现步骤
AGENT_SANDBOX_OPENSANDBOX_BASEURL=https://your-domain.comAGENT_SANDBOX_OPENSANDBOX_USE_SERVER_PROXY=true(默认)/proxy/{sandboxId}/{port}/,但显示 FastGPT 页面而非 sandbox 内容预期结果
iframe 应通过 server.ts 的代理逻辑转发到 sandbox 容器,显示 sandbox 编辑器内容。
修复建议
server.ts,覆盖 standalone 默认 server:proxy.ts:使用endpoint.url替代host:port拼接:proxyUtils.ts:ProxySession缓存完整 target URL 而非拆分存储host + protocol。