在左侧输入知识库内容后,这里会实时显示解析结果。
UI Prototype Navigation
千为 SaaS AI 转型原型
这个首页只作为原型导航入口。真实产品中,SaaS 用户由原平台跳转到对话页,SaaS 管理员和平台管理员分别进入自己的后台。
用户侧页面
SaaS 用户SaaS 公司侧页面
租户后台平台侧页面
平台运营你好,我是灵宝AI助手
告诉我你的业务目标,我会规划步骤、调用能力并实时汇报进度。
可调用能力
当前对话可以按需调用以下 AI 技能、AI 员工与模型能力。
Bubble 协议完整样例
千为灵宝助手 · 经营分析对话
千为云旗 · 原 SaaS 系统
门店经营工作台
查看本次接入链路
SaaS 后端读取当前登录态,使用配置页公钥完成 RSA-OAEP + AES-GCM 混合加密;前端只接收 iframe URL。网关解密后创建短期会话,token 不进入对话页 URL。

灵晤,让传统 SaaS 一键迈入智能体时代。
提供从平台到应用、从 Agent 到业务落地的完整企业 FDE 解决方案。
未认证企业注册后,该手机号成为企业所有者;已认证企业必须申请加入,不会按名称直接关联。
使用企业所有者手机号登录。未注册手机号请先切换到“注册”。

SaaS 公司后台
千为云旗 AI 配置中心
配置用户进入 AI 对话后可使用的模型、员工、技能与接入策略
当前工作区
助手与接入
助手与知识库
已发布AI 开发助手
使用本企业配置的文本模型,解答自有技能与 AI 员工问题,并结合 ZIP 与对话日志生成可验证修复建议。
推荐指令
独立配置用户对话页左侧展示的快捷指令,不再从知识库 Markdown 中识别。
尚未配置推荐指令。添加后将在用户对话页展示。
最多 10 条,每条最多 200 个字符。保存后,已经打开的对话页会在 5 秒内自动同步。
企业主体认证
认证后,同名新用户只能申请加入,不能另建同主体租户。
跳转加密与 iframe 接入
公钥交给 SaaS 后端,私钥仅保存在 Agent 服务器。
- platform_id
- qianwei-retail
- 当前 kid
- kid_20260711_a1
- 公钥指纹
- SHA256:7d:31:9a:4f:82:0c
- Allowed Origin
- 未配置
- Token 刷新接口
- 未配置
http://8.210.155.175:8083/api/saas/launch?platform_id=plt_xxx&kid=kid_xxx&encrypted_payload=BASE64URL_ENVELOPEhttp://8.210.155.175:8083/api/saas/launchplatform_id是SaaS 配置页生成的平台 IDkid是当前公钥版本,用于定位私钥encrypted_payload是Base64URL 编码的混合加密信封该地址作为 SaaS 页面 iframe.src。敏感 token 只存在于密文中,禁止由浏览器拼接明文载荷。
{
"platform_id": "qianwei-retail",
"user_id": "qw_user_10248",
"access_token": "ACCESS_TOKEN",
"refresh_token": "REFRESH_TOKEN",
"access_token_expired_time": 1783607200,
"refresh_token_http": "GET",
"refresh_token_refresh_input_params": {"refresh_token": "REFRESH_TOKEN"},
"refresh_token_url": "https://saas.example.com/api/auth/refresh",
"timestamp": 1783600000,
"nonce": "n_8f2a91",
"aud": "lingwu-ai-staging",
"origin": "https://saas.example.com"
}
安装依赖:pip install cryptography。公钥、platform_id 和 kid 来自本配置页;用户凭据从 SaaS 当前登录态读取。
import base64
import json
import os
import secrets
import time
from urllib.parse import urlencode
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
LAUNCH_ENDPOINT = "http://8.210.155.175:8083/api/saas/launch"
def b64url(value: bytes) -> str:
return base64.urlsafe_b64encode(value).rstrip(b"=").decode()
def build_iframe_src(*, platform_id, kid, public_key_pem, user_id,
access_token, refresh_token, access_token_expired_time,
refresh_token_url, refresh_token_http, saas_origin):
payload = {
"platform_id": platform_id,
"user_id": str(user_id),
"access_token": access_token,
"refresh_token": refresh_token,
"access_token_expired_time": int(access_token_expired_time),
"refresh_token_http": refresh_token_http.upper(),
"refresh_token_refresh_input_params": {"refresh_token": refresh_token},
"refresh_token_url": refresh_token_url,
"timestamp": int(time.time()),
"nonce": secrets.token_urlsafe(24),
"aud": "lingwu-ai-staging",
"origin": saas_origin,
}
aad = f"{platform_id}:{kid}".encode()
aes_key, iv = os.urandom(32), os.urandom(12)
encrypted = AESGCM(aes_key).encrypt(
iv,
json.dumps(payload, ensure_ascii=False, separators=(",", ":")).encode(),
aad,
)
public_key = serialization.load_pem_public_key(public_key_pem.encode())
encrypted_key = public_key.encrypt(
aes_key,
padding.OAEP(
mgf=padding.MGF1(hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
envelope = {
"version": "1.0",
"alg": "RSA-OAEP-256+A256GCM",
"encrypted_key": b64url(encrypted_key),
"iv": b64url(iv),
"ciphertext": b64url(encrypted[:-16]),
"tag": b64url(encrypted[-16:]),
}
return LAUNCH_ENDPOINT + "?" + urlencode({
"platform_id": platform_id,
"kid": kid,
"encrypted_payload": b64url(json.dumps(envelope).encode()),
})
# 在 SaaS 已完成登录校验的后端接口中调用;两个参数来自贵司认证系统。
def create_iframe_src_for_logged_in_user(current_user, current_session):
return build_iframe_src(
platform_id=os.environ["LINGWU_PLATFORM_ID"],
kid=os.environ["LINGWU_KID"],
public_key_pem=os.environ["LINGWU_PUBLIC_KEY_PEM"],
user_id=current_user.id, # 用户表稳定主键或 JWT sub
access_token=current_session.access_token,
refresh_token=current_session.refresh_token,
access_token_expired_time=current_session.access_token_expired_time,
refresh_token_url=os.environ["SAAS_REFRESH_TOKEN_URL"],
refresh_token_http="POST",
saas_origin=os.environ["SAAS_PUBLIC_ORIGIN"],
)
该代码必须运行在 SaaS 后端。SaaS 后端只把生成的 iframe_src 返回给前端,前端将其赋给 iframe.src,由浏览器发起 GET 并接收 302 对话页面;SaaS 后端不应提前请求这个一次性 URL。不要把 access_token 或 refresh_token 写入日志、页面 HTML 或 URL。
{
"version": "1.0",
"alg": "RSA-OAEP-256+A256GCM",
"encrypted_key": "BASE64URL_RSA_ENCRYPTED_AES_KEY",
"iv": "BASE64URL_12_BYTE_IV",
"ciphertext": "BASE64URL_CIPHERTEXT",
"tag": "BASE64URL_16_BYTE_TAG"
}
HTTP/1.1 302 Found Location: /embed/chat?s=sess_xxx Set-Cookie: noema_saas_session=...; HttpOnly; Secure; SameSite=None Cache-Control: no-store Content-Security-Policy: frame-ancestors https://saas.qianwei.cn
失败时返回稳定 error_code 和 request_id,不返回解密细节。支持 PLATFORM_NOT_FOUND、KEY_REVOKED、PAYLOAD_EXPIRED、NONCE_REPLAYED、ORIGIN_NOT_ALLOWED、TOKEN_INVALID。
<iframe src="http://8.210.155.175:8083/api/saas/launch?platform_id=plt_xxx&kid=kid_xxx&encrypted_payload=BASE64URL_ENVELOPE" title="千为灵宝助手" allow="microphone; clipboard-write" ></iframe>
包含当前 platform_id、kid、公钥、全部入参来源、加密边界、Python/Java 代码和 iframe 嵌入方式,可直接交给 Vibe Coding 工具。
Token 刷新配置
Agent 在 Access Token 到期前自动调用贵司 SaaS 服务端接口,终端用户无需重新登录。
未配置自定义 Header
值可使用 ${access_token}、${refresh_token} 或 Bearer ${access_token}。只允许这两个受控变量。
Allowed Origins 是允许嵌入灵宝 AI 对话 iframe 的 SaaS 父页面安全白名单。平台开启验证时,跳转网关会校验加密请求中的 Origin,浏览器也会根据 frame-ancestors 限制嵌入来源;关闭时本页会明确显示当前策略。
- 测试后台填写
http://8.210.155.175:8084;正式上线填写贵司 SaaS 父页面的 HTTPS Origin。 - 它不是刷新接口 URL,也不是 API CORS 白名单;不要填写 iframe 路径或刷新接口路径。
- 刷新接口由贵司 SaaS 后端开发并部署,不是本平台提供的地址。
- 接口使用传入的 refresh_token 验证用户会话,并签发新的 access_token。
- Header 可携带当前 access_token、refresh_token 或固定设备标识;接口不能依赖浏览器 Cookie。
- 禁止 Host、Content-Length、Content-Type、Connection 等协议控制 Header,也禁止换行和未知模板变量。
- 请求超时为 20 秒;非 2xx、非 JSON 或缺少必填字段都会中止本次技能调用。
https://api.saas.example.com/openapi/auth/refreshContent-Type: application/json
X-Access-Token: CURRENT_ACCESS_TOKEN
X-Access-Device: YQ_AI_BOX
{
"refresh_token": "SaaS_LOGIN_REFRESH_TOKEN"
}
推荐方式。刷新接口必须验证 refresh_token 是否有效、未撤销、未过期,并确认其对应用户仍可登录。
https://api.saas.example.com/openapi/auth/refresh?refresh_token=SaaS_LOGIN_REFRESH_TOKEN仅在贵司现有认证接口只能使用 GET 时选择。请确保负载均衡、网关和应用日志不会记录完整查询参数。
模板在 Agent 服务端渲染
[
{"key":"X-Access-Token","value":"${access_token}"},
{"key":"Authorization","value":"Bearer ${access_token}"},
{"key":"X-Refresh-Token","value":"${refresh_token}"},
{"key":"X-Access-Device","value":"YQ_AI_BOX"}
]
${access_token}当前访问令牌刷新前 Vault 中的当前值,不是初次 launch 的旧值。${refresh_token}当前刷新令牌发生轮换后,下次使用最近一次安全保存的值。固定字符串原样发送适合设备、渠道和客户端版本标识。Header 名称不区分大小写且不能重复。模板只在服务端内存中短暂渲染;页面、审计、运行监控和错误响应不会返回真实值。
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "NEW_ACCESS_TOKEN",
"refresh_token": "NEW_REFRESH_TOKEN",
"access_token_expired_time": 1783903600
}
access_token是新签发的访问令牌,字符串。refresh_token否轮换后的刷新令牌;不返回时继续使用原 refresh_token。access_token_expired_time是Access Token 过期时间,Unix 秒级时间戳;不能传毫秒或有效时长。也兼容将以上字段放在 data 对象内。验证失败应返回 401/403,参数错误返回 400,服务异常返回 5xx;不要用 HTTP 200 包装失败结果。
from flask import Flask, jsonify, request
import time
app = Flask(__name__)
@app.post("/openapi/auth/refresh")
def refresh_access_token():
payload = request.get_json(silent=True) or {}
refresh_token = str(payload.get("refresh_token") or "").strip()
current_access_token = request.headers.get("X-Access-Token", "").removeprefix("Bearer ").strip()
device = request.headers.get("X-Access-Device", "")
if not refresh_token:
return jsonify({"error": "refresh_token_required"}), 400
# 可按贵司协议校验当前 access_token 和固定设备标识;禁止记录它们。
if not current_access_token or device != "YQ_AI_BOX":
return jsonify({"error": "refresh_context_invalid"}), 401
# 必须在贵司认证服务中验证签名/数据库状态、过期时间、撤销状态和用户状态。
session = auth_service.validate_refresh_token(refresh_token)
if session is None or not session.user_is_active:
return jsonify({"error": "invalid_refresh_token"}), 401
# 推荐每次刷新都轮换 refresh_token,并立即作废旧 refresh_token。
token_pair = auth_service.rotate_tokens(
user_id=session.user_id,
old_refresh_token=refresh_token,
)
return jsonify({
"access_token": token_pair.access_token,
"refresh_token": token_pair.refresh_token,
"access_token_expired_time": int(token_pair.access_expires_at.timestamp()),
}), 200
if __name__ == "__main__":
app.run(host="0.0.0.0", port=9000)
正式服务应由 Gunicorn/uWSGI 等 WSGI 服务启动并使用 HTTPS;不要使用 Flask 开发服务器,也不要把 refresh_token 写入日志。
app.post("/openapi/auth/refresh", async (req, res) => {
const refreshToken = String(req.body?.refresh_token || "");
const accessToken = String(req.get("X-Access-Token") || "").replace(/^Bearer\s+/i, "");
const device = String(req.get("X-Access-Device") || "");
if (!refreshToken || !accessToken || device !== "YQ_AI_BOX") {
return res.status(401).json({error: "refresh_context_invalid"});
}
const pair = await authService.rotate({refreshToken, currentAccessToken: accessToken});
return res.json({
access_token: pair.accessToken,
refresh_token: pair.refreshToken,
access_token_expired_time: Math.floor(pair.accessExpiresAt.getTime() / 1000)
});
});
curl -X POST https://api.saas.example.com/openapi/auth/refresh \
-H 'Content-Type: application/json' \
-H 'X-Access-Token: TEST_ACCESS_TOKEN' \
-H 'X-Access-Device: YQ_AI_BOX' \
--data '{"refresh_token":"TEST_REFRESH_TOKEN"}'
测试 SaaS 跳转页面
测试数据在服务端混合加密,iframe 只接收密文 GET 地址。
test-user-001、test-access-token、test-refresh-token。这不能证明租户自有技能的鉴权链路已经打通。sub 获取;业务管理员无法获取时,请联系贵司 SaaS 开发人员。三个字段均为必填项。测试页面默认按 Access Token 1 小时后过期处理。线上测试服务当前使用 HTTP,请只填写测试凭据;正式环境必须使用 HTTPS。
模型平台与 API Key
同一模型可配置多个 Key;优先级数值越小越优先,文本模型也可接入租户自有 OpenAI Chat Completions 服务。
正在读取模型配置...
自有 OpenAI Chat 模型接入说明
接口范围
本期只支持 POST /v1/chat/completions。Base URL 可填写到 /v1 或完整 /v1/chat/completions,平台会规范化。规划和结构化 JSON 默认使用非流式;最终回答可按配置使用真实 SSE。
鉴权与安全
支持标准 Authorization: Bearer ${api_key}、X-API-Key: ${api_key} 或受控自定义 Header。只允许 ${api_key},禁止 access_token、refresh_token、Host、Content-Length、换行和重复 Header。
调度与故障切换
优先级数值越小越先调用;相同优先级按配置创建顺序尝试。达到最大 QPS 时跳过当前配置,调用失败时进入 60 秒冷却并继续尝试下一配置。该策略是主备故障切换,不是按权重随机分流。
非流式请求与响应
POST /v1/chat/completions
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{"model":"company-chat-v1","messages":[{"role":"user","content":"你好"}],"stream":false}
{"id":"req_1","choices":[{"message":{"role":"assistant","content":"你好"},"finish_reason":"stop"}],"usage":{"prompt_tokens":8,"completion_tokens":2,"total_tokens":10}}
实时流 SSE
data: {"id":"req_2","choices":[{"delta":{"role":"assistant"}}]}
data: {"id":"req_2","choices":[{"delta":{"content":"你"}}]}
data: {"id":"req_2","choices":[{"delta":{"content":"好"}}]}
data: {"id":"req_2","choices":[],"usage":{"prompt_tokens":8,"completion_tokens":2,"total_tokens":10}}
data: [DONE]
FastAPI 最小服务
from fastapi import FastAPI, Header
from fastapi.responses import StreamingResponse
import json
app = FastAPI()
@app.post("/v1/chat/completions")
def chat(body: dict, authorization: str = Header(default="")):
verify_api_key(authorization)
if not body.get("stream"):
return {"id":"req_1","choices":[{"message":{"role":"assistant","content":"模型结果"},"finish_reason":"stop"}],"usage":{"total_tokens":12}}
def events():
for text in ["模", "型", "结果"]:
yield "data: " + json.dumps({"id":"req_1","choices":[{"delta":{"content":text}}]}, ensure_ascii=False) + "\n\n"
yield 'data: {"id":"req_1","choices":[],"usage":{"total_tokens":12}}\n\n'
yield "data: [DONE]\n\n"
return StreamingResponse(events(), media_type="text/event-stream")
服务端必须禁用代理缓冲、定期发送心跳并在断开时停止生成。API Key 不得写入 URL、日志、usage metadata 或错误响应。验证按钮会发送短文本“仅回复 OK”,可能产生少量模型用量。
模型用量
Token 与音频秒数、图片张数、视频秒数等 provider 原生单位分别统计。
模型用量明细
分页查询全部模型调用
按时间、模型方向、模型名称和状态筛选,定位具体 request_id 或 run_id。
正在读取模型用量明细...
自有 AI 员工与技能
仅已发布且启用的租户能力会进入 iframe Agent 调度集合。
正在读取租户能力...
平台能力市场
付费能力确认模拟支付后获得 30 天订阅,可暂停、恢复或取消。
正在读取平台能力...
自有技能开发者社区
请稍候...
最终生成与灵晤盒子技能开发社区完全一致的 remote_http 标准包,也可下载 ZIP。
租户还未上传任何技能
自有 AI 员工广场
生成 employee_manifest、knowledge_base、private_skills 和 examples,并复用灵晤盒子原校验器。
租户还未上传任何 AI 员工
运行概览
对话与 Bubble 保留 180 天,模型调用 90 天,安全审计 365 天。
跳转对话与 Bubble
按用户、会话与日期查询完整消息、任务、交互和调用链。
正在读取对话...
能力与模型调用事件
记录成功、失败、延迟、目标能力和关联任务,不记录 token 与 API Key。
运行监控明细
跳转对话与 Bubble 明细
按 SaaS 用户、会话和日期定位完整消息、Bubble、任务和调用链。
正在读取对话明细...
运行监控明细
能力与模型调用事件明细
按状态、事件类型、目标和会话追踪 Agent 调度与模型调用事件。
正在读取事件明细...
对话诊断工作台
正在读取对话
企业成员
成员共享当前 platform_id 下的企业配置,操作范围由角色权限控制。
正在读取成员...
邀请成员
不发送邀请通知短信;请由企业内部通知成员使用手机号验证码登录。
暂无待处理邀请
企业加入申请
申请人已完成手机号验证;批准后生成 7 天成员邀请,由申请人使用登录验证码正式加入。
暂无加入申请
企业所有权
两阶段转移:原所有者验证发起,目标管理员在 24 小时内登录接受。
正在读取所有权状态...
角色权限矩阵
所有者拥有全部权限;管理员不能任命管理员或管理所有者。
成员审计记录
保留邀请、角色调整、停用、退出和所有权转移记录。
暂无成员操作记录
API Key 管理
每个 Key 独立配置来源 IP/CIDR。完整密钥仅在创建成功时展示一次。
正在读取 API Key...
API 文档
按接口查看完整协议、调用样例与错误处理;后续新增接口会继续列在这里。
数据分析 API
调用当前租户启用的文本大模型,并严格按照 result_sample 返回可稳定解析的 JSON 对象。
最近调用记录
只记录非敏感元数据,不保存提示词、业务数据、完整 Key 或模型原文。
暂无调用记录
租户接口 · 调用明细
数据分析 API 调用记录
分页查看脱敏请求元数据,不保存提示词、业务数据、完整 Key 或模型原文。
正在读取调用明细...
租户接口 · API 文档
数据分析 API
完整查看接口地址、鉴权约束、请求示例、响应协议和全部错误处理。
数据分析 API 文档
接口使用当前租户“模型与用量”中启用的文本大模型,并严格按照 result_sample 返回可稳定解析的 JSON dict。
正在读取接口地址...鉴权与 IP
Authorization: Bearer <api-key>
Key 必须 active、未过期,且来源 IP 命中该 Key 的白名单。白名单为空时拒绝全部请求。
请求限制
prompt 1–10,000 字符;data 1–1,000 条且每项为 dict;请求体最大 1 MiB。
Content-Type 必须是 application/json。
result_sample 结构契约
result_sample 必填。服务端递归生成 strict JSON Schema;所有样例字段必填且不允许额外字段。
prompt 只写分析任务,无需重复描述 JSON 格式。空数组只约束为数组,null 只允许返回 null。
返回与重试
HTTP 200 的 result 始终符合 result_sample 的字段与类型。只对 retryable=true 使用带上限的指数退避。
模型最多尝试 3 次生成符合 JSON Schema 的对象。
样例请求入参
读取中...
curl 调用样例
读取中...
Python 调用与失败处理
读取中...
成功返回样例 · HTTP 200
读取中...
全部错误返回
展开任一错误可查看完整 HTTP 状态、JSON 返回与是否建议重试。
正在读取错误协议...
开发者中心 · 接入文档
开发文档
以下内容已按 Markdown 结构排版,适合在线阅读;复制和下载仍提供原始 Markdown。
能力版本管理
真实用户会话调试
预览用户对话
使用测试用户的 SaaS 凭证建立与正式 iframe 接入完全相同的加密会话。
仅展示一次
请立即保存 API Key
关闭后无法再次查看,只能创建新 Key 进行轮换。
请存入服务端环境变量或密钥管理服务,不要写入前端、源码、URL 或日志。
灵晤盒子原生协议
可视化生成灵宝技能包
配置将被编译为标准 remote_http skill.zip,并走原技能包校验器。
定义技能基本信息
填写标准 manifest 元数据,确认后生成技能标识预览。
导入并解析 SaaS API 文档
选择文件、文档 URL 或手工接口说明,解析后才能选择 Operation。
选择 API Operation
选择一个接口作为当前技能运行入口,并确认其 method、URL 和风险。
配置请求映射与 token 注入
编辑输入字段如何进入远程接口,并明确 access token 的运行时注入位置。
编辑和校验 input/output schema
返回 Schema 的每个 properties 字段都必须填写 description;字段说明会随真实结果提供给模型。平台同步生成 examples/input.json 与 examples/output.json。
联调成功后,平台只提取实际返回字段的类型、title、description、format 和 enum,并随 observation 提供给模型。
{"store_id":"store_001","days":7}{"success":true,"content":{"summary":"发现4个风险SKU"}}配置响应标准化与 Bubble
把 SaaS 原始响应映射为 Agent observation,并由每次响应决定是否显示 Bubble。
发现 4 个高风险 SKU,预计 2 天内缺货。
表格 4 行执行真实 HTTP 联调
填写测试参数并请求远程服务,检查 URL、状态码、原始响应、Schema、映射和 Bubble。
POST https://api.qianwei.cn/inventory/risk/query- 远程 URL 安全检查通过
- HTTP 响应为 JSON 对象
- output_schema 字段与类型通过
- response_mapping 与 Bubble 预览通过
- 测试 token 未写入标准包
编译、校验、下载和发布
确认全部前置产物,编译标准 skill.zip,再执行灵晤盒子原技能包校验器。
qianwei.inventory.warning/
├── manifest.json
├── README.md
├── icon.png
└── examples/
├── input.json
└── output.json灵晤盒子原生协议
可视化生成灵晤 AI 员工包
生成 employee_manifest、知识库和私有技能,并复用原员工包校验器。
定义员工身份和职责
清晰描述能力边界,供灵宝助手选择员工。
配置 dispatch_profile
逐项填写员工的调度能力,确认后生成结构化画像预览。
配置 Agent Runtime
选择执行位置、运行预算,以及是否等待员工任务完成后再让主 Agent 继续。
通过 API 文档生成并选择私有技能
填写或粘贴 API 文档,解析生成标准私有技能,确认后再决定是否勾选到员工包。
编辑并查看 knowledge_base.md
左侧直接编辑 Markdown,右侧预览员工实际读取的知识库内容。
配置风险、确认和 Bubble 交互
为每项能力选择风险等级和用户交互;中间进度默认不显示 Bubble,终态或人类确认才显示。
试运行完整员工任务
输入任务并执行,查看 AgentTask、ReAct、技能请求、observation、Bubble 和确认节点。
已识别 4 个高风险 SKU。采购申请属于高风险操作,试运行按策略停在用户确认节点。
编译、校验、下载和发布
先编译标准员工包,再运行灵晤盒子原校验器;全部通过后才允许发布。
qianwei.business.analyst/
├── employee_manifest.json
├── knowledge_base.md
├── README.md
├── app_icon.png
└── private_skills/
├── inventory_warning/
└── sales_trend/
平台运营后台
多租户能力与商业化运营
SaaS iframe Allowed Origins 验证
平台级控制所有 SaaS 公司后台通过 iframe 发起的加密跳转是否必须命中租户 Allowed Origins。
Origin 必须合法、租户必须已经配置 Allowed Origins,并且当前 Origin 必须在白名单中,否则跳转返回 403。
允许未配置 Allowed Origins 的 SaaS 发起 iframe 跳转;加密、时效、nonce 防重放、租户隔离和 Token Vault 仍然强制执行。
SaaS 自有技能 HTTPS 强制策略
平台级控制租户自有技能、AI 员工私有技能及其 callback 是否必须使用 HTTPS。
上传、试运行和对话执行都会拒绝 HTTP 技能及 callback;存量技能保留发布状态,但调用会向用户返回错误。
允许租户使用 HTTP,但 access_token 与业务数据不受传输加密保护;公网目标和 SSRF 防护仍然生效。
企业主体认证
审核法定名称与统一社会信用代码,识别同名租户和主体冒用风险。
正在读取企业主体...
SaaS 租户与动态
自动同步平台能力市场
订阅排行
本月- PDF 报告生成 · 8 租户订阅
- 商品内容创作员工 · 5 租户订阅
- 经营数据分析员工 · 3 租户订阅
- 知识库问答员工 · 11 租户订阅
安全审计
低风险- qianwei-retail · nonce 校验通过
- haichuan-crm · token refresh 成功
- warehouse-mini · iframe 域名待审批
收入与调用趋势
近 30 天平台人员
平台所有人账号受保护;角色或状态变更后,原登录状态立即失效。
正在读取平台人员...
SaaS 账号数据清理
先查询影响范围,再执行不可撤销的数据库清理。
输入手机号后查看账号、公司和逐表数据量。