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

> ## Agent Instructions
> 对外开放的服务端接口有两组前缀，都用同一套鉴权：`/server/v1/...`（SRTC 与 SMeeting 的主接口）和 `/stm/srvapi/v1/...`（SMeeting 的用户体系，服务端极简对接会用到）。鉴权是 app_id + nonce + timestamp + signature 四个请求头，用 app_key 做 HMAC-SHA256 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上。
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。

# 错误码

> Python SDK 的 SdkError：code 的三类取值（SDK 自身 180xxx、服务端 1xxx 原样透传、-1 内部错误），常见错误的原因与排查，以及入会失败时的处理建议。

接口失败时抛出 `srtc.SdkError`，带两个字段：

| 字段     | 类型    | 说明   |
| ------ | ----- | ---- |
| `code` | `int` | 错误码  |
| `msg`  | `str` | 错误原因 |

```python theme={null}
try:
    ch = await srtc.Channel.join(token)
except srtc.SdkError as e:
    print(e.code, e.msg)
```

`code` 分三类：

| 取值                | 来源     | 说明                                                                                   |
| ----------------- | ------ | ------------------------------------------------------------------------------------ |
| `180xxx`          | SDK 自身 | 与 [C SDK · 错误码](/zh/rtc/capi/error-codes#日志里的-180xxx：sdk-层错误) 同一套，服务端接入方式共用 `180` 前缀 |
| `≥1000`（如 `1033`） | 服务端    | 业务层面的拒绝原因，SDK 原样透传，完整清单见 [服务端 API · 错误码](/zh/rtc/server-api/error-codes)             |
| `-1`              | SDK 内部 | 没有具体错误码的失败（如 Token 格式不对、网络不通），看 `msg`                                                |

***

## 常见错误

| 码                   | 含义           | 常见原因与处理                                         |
| ------------------- | ------------ | ----------------------------------------------- |
| `180001`            | 不在频道内        | 频道已断开（`ch.closed` 为 `True`）后又调了会中接口             |
| `180002`            | Token 已过期    | Token 超时未使用。**每次 `join` 都要新签发**                 |
| `180003`            | 流轨道不存在       | 订阅的 uid / track\_id 写错，或对方已取消发布                 |
| `180300` / `180301` | 发布 / 订阅失败    | 媒体协商未通过，检查网络                                    |
| `180302` / `180303` | 发布 / 订阅协商超时  | 服务端媒体端口不可达，检查防火墙                                |
| `1021`              | Token 已被使用   | 同一个 Token 用了两次                                  |
| `1032`              | 该会话不在线       | 复用了已离开频道的 Token                                 |
| `1033`              | 并发已达上限       | 应用的并发授权额度已用完，扩容授权或等待其他会话结束                      |
| `1034` / `1035`     | 无可用节点 / 节点满载 | 服务端媒体节点繁忙。SDK 在**重连**时会自动退避重试；**首次入会**失败需要你稍后重试 |

<Tip>
  入会失败时，按错误码区分处理：`1021` / `1032` / `180002` 是 Token 问题，重试前要**重新签发 Token**；`1034` / `1035` 是暂时性的，稍后用新 Token 重试即可；`1033` 是授权额度问题，重试没有用。
</Tip>

***

## 日志

SDK 使用 Python 标准 `logging`，logger 名为 `srtc`：

```python theme={null}
import logging

logging.basicConfig(level=logging.INFO)
logging.getLogger("srtc").setLevel(logging.DEBUG)     # 排查问题时打开
```

原生内核（信令、媒体连接）的日志直接输出到进程的标准输出 / 标准错误，不经过 `logging`。
