mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-10 07:46:02 +00:00
115 lines
6.4 KiB
Markdown
115 lines
6.4 KiB
Markdown
# QQOfficial EBA Adapter
|
|
|
|
Adapter directory: `src/langbot/pkg/platform/adapters/qqofficial/`
|
|
|
|
Manifest name: `qqofficial-eba`
|
|
|
|
Status: partial migration. The EBA adapter structure, manifest, converters, cache-backed safe APIs, platform API map, unit tests, and direct live probe scaffold are in place. A real QQ Official WebSocket bot on `dev.rockchin.top` received an inbound user message and drove LangBot into the normal pipeline path; the response path was blocked by the test environment model service returning `model_not_found` for `deepseek-v3`.
|
|
|
|
## Config
|
|
|
|
| Field | Required | Notes |
|
|
| --- | --- | --- |
|
|
| `appid` | yes | QQ Official app ID. |
|
|
| `secret` | yes | QQ Official app secret. |
|
|
| `token` | yes | QQ Official callback token. |
|
|
| `enable-webhook` | yes | Uses LangBot unified webhook when true; otherwise uses the QQ WebSocket gateway. |
|
|
| `enable-stream-reply` | yes | Enables C2C streaming replies when supported by the QQ Official endpoint. |
|
|
| `webhook_url` | no | Generated by LangBot and copied into the QQ Official callback settings in webhook mode. |
|
|
|
|
## Events
|
|
|
|
| Event | Evidence | Notes |
|
|
| --- | --- | --- |
|
|
| `message.received` | adapter-live, unit | `C2C_MESSAGE_CREATE`, `DIRECT_MESSAGE_CREATE`, `GROUP_AT_MESSAGE_CREATE`, and `AT_MESSAGE_CREATE` map to common `MessageReceivedEvent`. A real WebSocket-mode QQ Official bot reached the LangBot pipeline on `dev.rockchin.top`; plugin JSONL evidence remains pending. |
|
|
| `platform.specific` | unit, blocked | Unmapped gateway events are emitted as structured `PlatformSpecificEvent`; live evidence is pending. |
|
|
|
|
## Common APIs
|
|
|
|
| API | Evidence | Notes |
|
|
| --- | --- | --- |
|
|
| `send_message` | unit, blocked | Sends private C2C, group, and text-only channel messages through the existing QQ Official client. Live outbound UI verification is pending because the test pipeline failed before producing a bot response. |
|
|
| `reply_message` | unit, blocked | Replies using the source `QQOfficialEvent` message ID when available. Live reply was blocked by the test environment model service returning `model_not_found`. |
|
|
| `get_message` | unit | Returns cached inbound `MessageReceivedEvent`. |
|
|
| `get_user_info` | unit | Returns cached inbound sender. |
|
|
| `get_friend_list` | unit | Returns cached private senders. |
|
|
| `get_group_info` | unit | Returns cached group/channel metadata from inbound events. |
|
|
| `get_group_member_info` | unit | Returns cached group sender as a common member. |
|
|
| `get_group_member_list` | unit | Returns cached group members observed by the adapter. |
|
|
| `call_platform_api` | unit, blocked | Safe diagnostic actions are implemented; live calls are pending credentials. |
|
|
|
|
## Platform APIs
|
|
|
|
| Action | Evidence | Notes |
|
|
| --- | --- | --- |
|
|
| `check_access_token` | unit, blocked | Calls the existing client token check. |
|
|
| `refresh_access_token` | unit, blocked | Forces token refresh. |
|
|
| `get_gateway_url` | unit, blocked | Fetches the WebSocket gateway URL. |
|
|
| `get_mode` | unit | Returns webhook and stream-reply mode. |
|
|
|
|
## Components
|
|
|
|
| Receive Component | Evidence | Notes |
|
|
| --- | --- | --- |
|
|
| `Source` | unit | Uses QQ message/event IDs and timestamp. |
|
|
| `Plain` | unit | Preserves text content. |
|
|
| `At` | unit | Group and channel mention events insert an adapter bot mention marker. |
|
|
| `Image` | unit | QQ image attachment URL is converted to common `Image`; falls back to URL if download fails. |
|
|
| `Unknown` | unit | Unsupported/empty native payloads become `Unknown`. |
|
|
| `Voice`, `File`, `Quote`, `Face`, `Forward`, mixed chain | blocked | Current native parser only exposes text and image attachments; live endpoint behavior still needs verification. |
|
|
|
|
| Send Component | Evidence | Notes |
|
|
| --- | --- | --- |
|
|
| `Plain` | unit, blocked | Sends through private, group, or channel text APIs. |
|
|
| `At`, `AtAll` | unit, blocked | Converted to readable mention text. |
|
|
| `Image` | unit, blocked | Sends through the QQ Official rich media upload/send path for C2C and group targets. |
|
|
| `Voice` | unit, blocked | Sends through the QQ Official rich media upload/send path for C2C and group targets. |
|
|
| `File` | unit, blocked | Sends through the QQ Official rich media upload/send path for C2C and group targets. |
|
|
| `Quote`, `Forward`, mixed chain | unit, blocked | Flattened to ordered send payloads where possible. |
|
|
| `Face` | not-supported | No common QQ Official face mapping is implemented. |
|
|
|
|
## Verification Record
|
|
|
|
Test date: 2026-06-02
|
|
|
|
Endpoint/simulator: `dev.rockchin.top` with a real QQ Official WebSocket bot (`qqofficial-eba`, bot UUID `80a5560b-52b1-40e7-b7d6-4a2341eb4780`) and LangBot running from `/home/wgc/LangBotxg/LangBotEbaTest`.
|
|
|
|
Observed evidence:
|
|
|
|
- The QQ Official WebSocket bot was enabled with `enable-webhook=false`.
|
|
- A real user message reached LangBot and entered the standard pipeline path.
|
|
- The response path stopped at the model layer with `model_not_found` for `deepseek-v3`; this is a model/provider configuration issue, not an adapter conversion failure.
|
|
- `qq-webhook.langbot.dev` was temporarily routed through Caddy to `127.0.0.1:5301` for webhook checks, but the observed EBA bot used WebSocket mode.
|
|
|
|
Standalone runtime command:
|
|
|
|
```bash
|
|
cd langbot-plugin-sdk
|
|
uv run python -m langbot_plugin.cli.__init__ rt --debug-only --ws-control-port 5400 --ws-debug-port 5401 --skip-deps-check
|
|
```
|
|
|
|
Probe plugin: `data/plugins/LangBot__EBAEventProbe` when live credentials are available.
|
|
|
|
Adapter live probe:
|
|
|
|
```bash
|
|
uv run python -m py_compile tests/e2e/live_qqofficial_eba_probe.py
|
|
QQOFFICIAL_APPID=... QQOFFICIAL_SECRET=... QQOFFICIAL_TOKEN=... uv run python tests/e2e/live_qqofficial_eba_probe.py
|
|
```
|
|
|
|
Webhook-mode probe:
|
|
|
|
```bash
|
|
QQOFFICIAL_APPID=... QQOFFICIAL_SECRET=... QQOFFICIAL_TOKEN=... uv run python tests/e2e/live_qqofficial_eba_probe.py --webhook --host 0.0.0.0 --port 5312
|
|
```
|
|
|
|
Evidence JSONL path: `data/temp/qqofficial_eba_probe.jsonl` for direct adapter live probe; plugin E2E evidence should use `data/temp/qqofficial_eba_plugin_probe.jsonl`.
|
|
|
|
Destructive operations: none implemented.
|
|
|
|
Blocked items:
|
|
|
|
- `plugin-e2e-ui`: standalone probe plugin JSONL evidence is still pending; the observed live run reached LangBot core/pipeline but was not recorded by the EBA probe plugin.
|
|
- `plugin-e2e-outbound`: waiting for visible QQ client verification of plugin `send_message`/`reply_message` output after a working model/provider is configured.
|
|
- Inbound non-text media and platform lifecycle events require endpoint evidence before they can be marked complete.
|