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

# API 参考

> React SDK 暴露的 Props、hook、组件与事件。

## `<AdsProvider>` props

<ParamField path="publisherToken" type="string" required>
  你的 publisher token。
</ParamField>

<ParamField path="userId" type="string" required>
  在用户整个生命周期内保持不变的唯一标识（用于再营销与奖励广告）。
</ParamField>

<ParamField path="userEmail" type="string" optional>
  用户邮箱。
</ParamField>

<ParamField path="conversationId" type="string" required>
  对话的唯一 ID。
</ParamField>

<ParamField path="enabledPlacementCodes" type="array" optional>
  本次对话启用的 placement code。默认为 `['inlineAd']`。
</ParamField>

<ParamField path="character" type="object" optional>
  本次对话使用的 character 对象。

  <Expandable title="字段">
    <ParamField path="id" type="string" required>
      角色的唯一 ID。
    </ParamField>

    <ParamField path="name" type="string" required>
      角色名称。
    </ParamField>

    <ParamField path="avatarUrl" type="string" required>
      角色头像 URL。
    </ParamField>

    <ParamField path="isNsfw" type="boolean" optional>
      标识该角色是否面向成人受众。
    </ParamField>

    <ParamField path="greeting" type="string" optional>
      角色的问候语。
    </ParamField>

    <ParamField path="persona" type="string" optional>
      角色性格的简要描述。
    </ParamField>

    <ParamField path="tags" type="array" optional>
      描述角色的标签。
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="regulatory" type="object" optional>
  本次对话的合规对象。

  <Expandable title="字段">
    <ParamField path="gdpr" type="integer" optional>
      请求是否受 GDPR 约束。（0 = 否，1 = 是，null = 未知）
    </ParamField>

    <ParamField path="gdprConsent" type="string" optional>
      IAB 透明度与同意框架（TCF）的 consent 字符串。
    </ParamField>

    <ParamField path="coppa" type="integer" optional>
      请求是否受 COPPA 约束。（0 = 否，1 = 是，null = 未知）
    </ParamField>

    <ParamField path="gpp" type="string" optional>
      Global Privacy Platform (GPP) consent 字符串。
    </ParamField>

    <ParamField path="gppSid" type="array" optional>
      本次请求适用的 GPP section ID 列表。
    </ParamField>

    <ParamField path="usPrivacy" type="string" optional>
      美国隐私法规（如 CCPA、LSPA）相关的消费者信号。
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="variantId" type="string" optional>
  发布方提供的用户分群标识（用于 A/B 测试）。
</ParamField>

<ParamField path="onEvent" type="function" optional>
  事件发生时的回调。详见下方"支持的事件"章节。
</ParamField>

<ParamField path="onDebugEvent" type="function" optional>
  SDK 内部诊断事件的回调。接收 `(name, data?)`——在接入期间排查 preload / session 行为时很有用。默认关闭。
</ParamField>

## `useAds()` hook

返回 `addMessage`，一个总是路由到当前会话的转发函数。如果 `<AdsProvider>` 切换了会话（例如 `publisherToken` 改变），下一次调用会自动指向新的会话。

<ParamField path="addMessage" type="function" required>
  `(message: Message, options?: AddMessageOptions) => void` —— 向 SDK 注册一条新消息。下一次预加载会被自动安排。

  `AddMessageOptions` 目前提供一个开关：

  <Expandable title="AddMessageOptions">
    <ParamField path="trackOnly" type="boolean" optional>
      当为 `true` 时，preload 请求仍会发出（用于分析），但本条消息不会展示广告。可用于在不丢失追踪数据的前提下抑制广告。
    </ParamField>
  </Expandable>
</ParamField>

## `Message` 结构

<ParamField path="id" type="string" required>
  消息的唯一 ID。
</ParamField>

<ParamField path="role" type="string" required>
  消息角色（`user` 或 `assistant`）。
</ParamField>

<ParamField path="content" type="string" required>
  消息文本。
</ParamField>

<ParamField path="createdAt" type="Date" required>
  消息创建时间戳。
</ParamField>

## `<InlineAd>` props

<ParamField path="messageId" type="string" required>
  本广告所属消息的唯一 ID。
</ParamField>

<ParamField path="code" type="string" optional>
  Onboarding 时提供的 placement code。默认为 `'inlineAd'`。
</ParamField>

<ParamField path="theme" type="string" optional>
  广告主题，例如 `light` 或 `dark`。
</ParamField>

<ParamField path="wrapper" type="function" optional>
  render-prop 形式的包装函数，允许你用自己的 DOM 结构包裹广告 iframe。函数接收已渲染的广告作为 React 节点：

  ```tsx theme={null}
  <InlineAd
    messageId={m.id}
    wrapper={(ad) => <div className="my-ad-card">{ad}</div>}
  />
  ```
</ParamField>

## `<ErrorBoundary>`

`<InlineAd>` 内部已经被一个 `ErrorBoundary` 包裹，确保广告出错不会拖垮宿主应用。该组件同样被导出，方便你用它包裹自己的逻辑：

```tsx theme={null}
import { ErrorBoundary } from '@kontextso/sdk-react'

<ErrorBoundary>
  <YourComponent />
</ErrorBoundary>
```

## 支持的事件

### `ad.clicked`

用户点击了广告。

<Expandable title="Payload">
  <ParamField path="id" type="string">
    广告 ID。
  </ParamField>

  <ParamField path="content" type="string">
    生成的广告内容。
  </ParamField>

  <ParamField path="messageId" type="string">
    消息 ID。
  </ParamField>

  <ParamField path="url" type="string">
    点击跳转的 URL。
  </ParamField>

  <ParamField path="format" type="string">
    广告形式。
  </ParamField>

  <ParamField path="area" type="string">
    用户点击的素材区域（例如 `'cta'`、`'banner'`）。
  </ParamField>
</Expandable>

### `ad.viewed`

用户已查看广告。

<Expandable title="Payload">
  <ParamField path="id" type="string">
    广告 ID。
  </ParamField>

  <ParamField path="content" type="string">
    生成的广告内容。
  </ParamField>

  <ParamField path="messageId" type="string">
    消息 ID。
  </ParamField>

  <ParamField path="format" type="string">
    广告形式。
  </ParamField>

  <ParamField path="revenue" type="number" optional>
    广告收入（美元计的 eCPM）。
  </ParamField>
</Expandable>

### `ad.filled`

有可投放的广告。

<Expandable title="Payload">
  <ParamField path="id" type="string">
    广告 ID。
  </ParamField>

  <ParamField path="code" type="string">
    与该广告匹配的 placement code。
  </ParamField>

  <ParamField path="revenue" type="number" optional>
    广告收入（美元计的 eCPM）。
  </ParamField>
</Expandable>

### `ad.no-fill`

没有可投放的广告。

<Expandable title="Payload">
  <ParamField path="skipCode" type="string">
    指示广告被跳过原因的代码。
  </ParamField>
</Expandable>

### `ad.render-started`

在第一个 token 到达之前触发。

<Expandable title="Payload">
  <ParamField path="id" type="string">
    广告 ID。
  </ParamField>
</Expandable>

### `ad.render-completed`

在最后一个 token 到达之后触发。

<Expandable title="Payload">
  <ParamField path="id" type="string">
    广告 ID。
  </ParamField>
</Expandable>

### `ad.error`

出现错误时触发。

<Expandable title="Payload">
  <ParamField path="message" type="string">
    错误信息。
  </ParamField>

  <ParamField path="errCode" type="string">
    错误代码。
  </ParamField>
</Expandable>

### `video.started`

视频开始播放时触发。

<Expandable title="Payload">
  <ParamField path="id" type="string">
    广告 ID。
  </ParamField>
</Expandable>

### `video.completed`

视频播放完成时触发。

<Expandable title="Payload">
  <ParamField path="id" type="string">
    广告 ID。
  </ParamField>
</Expandable>

### `reward.granted`

激励广告向用户发放奖励时触发。

<Expandable title="Payload">
  <ParamField path="id" type="string">
    广告 ID。
  </ParamField>
</Expandable>
