> ## Documentation Index
> Fetch the complete documentation index at: https://docs.profy.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 专家模式（expertMode）

> 0 兼容 / 1 完整两种模式的真实差异——以及为什么内部内容的保护并不依赖这个开关

Studio 里这个开关的文案是「隐藏内部内容」。名字容易让人以为：不打开它，你的人格、技能、灵魂就会被买家看到。

**实际不是这样。** 敏感内容的脱敏是无条件的，与这个开关无关。这个开关今天真正决定的是另外一件事。本页把两者分开讲清楚。

<Note>
  本页内容核对日期 2026-08-11，来源见页尾「真值来源」。
</Note>

***

## 两个取值

| 值   | 含义（列注释）                         |
| --- | ------------------------------- |
| `0` | 兼容模式（legacy compatibility mode） |
| `1` | 完整专家模式（full Expert mode）        |

数据库默认值是 `0`。

***

## 脱敏不依赖这个开关

公开的市场详情接口在查询时**根本没有 SELECT 这些列**：

* `personaMd`（人格）
* `guardContent`（GUARD 内容）

另外三个虽然在类型里，但返回值被硬编码成 null：

```ts theme={null}
// services/core/src/db/service/expert.ts —— 公开详情响应
skillContent: null,
soulContent: null,
agentContent: null,
```

这段代码里没有任何 `if (expertMode)` 判断。已上架专家和未上架专家两条读取路径都是如此。

所以：**无论开关开不开，买家都看不到这五项内容。** 保护是服务端行为，不是可选项。

***

## 这个开关今天决定什么

有两处实际生效的行为。

### 一、购买对话框的挂载

在市场页的操作区，购买弹窗组件只在 `expertMode` 为真时才挂载：

```tsx theme={null}
{expertMode && (
  <ExpertPurchaseDialog ... />
)}
```

而触发它的条件是：

```tsx theme={null}
if (!expertPurchased && price != null && price > 0 && !allowTrial) {
  setShowExpertPurchase(true);
}
```

组合起来就是：**付费 + 关闭试用 + 未购买**的专家，用户点「使用」时需要弹出购买框。如果这时 `expertMode` 是 0，弹窗组件没挂载，购买流程走不通。

<Warning>
  如果你的专家是「付费且关闭了试用」，请确认 `expertMode` 为 1，否则买家点击后可能没有可用的购买入口。

  付费但**开着试用**的专家不受影响——用户先进入试用，试用耗尽后走另一条解锁路径。
</Warning>

### 二、导入专家包时的自动推导

从专家压缩包导入配置时，这个值由包里的可见性声明推导：

```ts theme={null}
const allHidden =
  vis.persona === "hidden" && vis.skills === "hidden" && vis.knowledge === "hidden";
result.expertMode = allHidden ? 1 : 0;
```

三项**全部**声明为 hidden 才置 1，只要有一项不是就置 0。

***

## 发布时会被自动置位

发布流程里有一条强制规则：**带技能内容的专家，发布时自动把 `expertMode` 置为 1**，覆盖你的设置。

```ts theme={null}
// WHY: experts with skills auto-enable expertMode to protect creator IP
const hasSkills = !!row.skillContent?.trim();
const expertModeOverride = hasSkills ? { expertMode: 1 } : {};
```

这个覆盖发生在发布事务内，与状态更新一起写入。

所以：

* 你的专家装了技能 → 发布后这个值一定是 1，你在 Studio 关掉它也会被发布流程改回来
* 你的专家没有技能 → 保持你的设置

***

## 该怎么设置

| 你的专家      | 建议  | 理由       |
| --------- | --- | -------- |
| 装了技能      | 不用管 | 发布时自动置 1 |
| 付费 + 关闭试用 | 置 1 | 保证购买弹窗可用 |
| 免费        | 无影响 | 不涉及购买流程  |
| 付费 + 开启试用 | 无影响 | 走试用后解锁路径 |

结论：多数情况下保持 1 是安全的，代价是没有的（脱敏本来就是无条件的，开着它不会额外隐藏什么）。

***

## 边界与失败态

<AccordionGroup>
  <Accordion title="关掉开关后买家还是看不到我的人格设定">
    这是正确行为。脱敏无条件生效，与开关无关。想让买家了解专家能力，用「概览」和「案例演示」——它们本来就是给买家看的字段。
  </Accordion>

  <Accordion title="Studio 里关掉了，发布后又变回打开">
    你的专家带了技能内容，发布流程会强制置 1 以保护创作者知识产权。这是预期行为。
  </Accordion>

  <Accordion title="买家点「使用」没反应">
    如果这是一个付费且关闭试用的专家，检查 `expertMode` 是否为 1。为 0 时购买弹窗组件不会挂载。
  </Accordion>

  <Accordion title="导入专家包后这个值和我预期的不一样">
    导入时按包里 `visibility` 的三项推导，必须 persona / skills / knowledge **全部**为 hidden 才置 1。检查包里的可见性声明。
  </Accordion>
</AccordionGroup>

***

## 验证

用**非本人账号**在市场页测试：

1. **验脱敏**：打开专家详情页，确认页面上没有出现你的人格、灵魂、行为规则、技能原文。这一项无论开关如何都应该通过——不通过说明有其它问题，请反馈。
2. **验购买路径**（仅付费且关闭试用的专家）：点击「使用」，确认购买弹窗正常出现且能完成支付。

创作者本人账号测不出第 2 项——你对自己的专家有完整访问权，不会触发购买分支。

***

## 真值来源

<Note>
  核对日期 2026-08-11。来源：

  * 取值含义与默认值：`packages/db/src/schema/marketplace.ts`
  * 公开详情的无条件脱敏：`services/core/src/db/service/expert.ts`（`getExpertDetail` 两条内容读取路径均未 SELECT 敏感列）
  * 发布时自动置位：同上（发布事务中的 `expertModeOverride`）
  * 购买弹窗门控与触发条件：`apps/web/src/components/marketplace/UseInProfyAction.tsx`
  * 导入推导规则：`apps/web/src/lib/expert/parse-expert-zip.ts`
  * 开关文案：`apps/web/src/i18n/messages/{zh,en}/creatorCenter.json`
</Note>

***

## 下一步

<CardGroup cols={2}>
  <Card title="Prompt 四层结构" icon="layer-group" href="/zh/creators/expert-config/prompt-layers">
    四个输入框各自的注入位置
  </Card>

  <Card title="定价与计费" icon="tag" href="/zh/creators/pricing-and-billing">
    价格如何派生计费类型
  </Card>
</CardGroup>
