mirror of
https://github.com/vercel/chat.git
synced 2026-09-14 18:32:29 +08:00
79227ae991
## Summary
Refreshes the adapter docs end-to-end so every adapter — official,
vendor-official, and community — now ships hand-authored MDX, lives
under a clean URL structure, and renders on a polished
sidebar/right-rail layout dedicated to `/adapters` (the shared `/docs`
chrome is untouched).
```mermaid
flowchart LR
subgraph Before
direction TB
OB[official] --> CB[community<br/>incl. 5 vendor pages]
end
subgraph After
direction TB
OA[official] --> VA[vendor-official<br/>5 pages] --> CA[community]
end
Before -.-> After
```
### Content & routing
- **New `/adapters/vendor-official/<slug>` route** for vendor-maintained
adapters (Beeper Matrix, Photon iMessage, Liveblocks, Resend, Zernio).
Sidebar gets a third labelled group ("Vendor-Official Adapters") between
Official and Community, with a top divider matching the existing
Community treatment.
- **All 13 vendor-official + community adapters migrated** from runtime
README fetching to hand-authored MDX with rich `features:` matrices and
full body content (install, quick start, configuration, auth,
gateway/streaming, troubleshooting). README fetch stays as a fallback
for any future community adapter that hasn't been migrated yet, gated by
a new `mdxBody: true` frontmatter flag.
- **Messenger filter pages removed** (`/adapters/for/<messenger>` + the
"Browse by messenger" chip row on `/adapters`). Existing URLs
308-redirect to `/adapters`.
- **Permanent redirects** from
`/adapters/community/{matrix,imessage,resend,zernio,liveblocks}` to
their new `/adapters/vendor-official/...` paths.
- **Fixed** `/docs/adapters` and `/docs/state` so the bare pages are
accessible again — the previous catch-all redirect (`:slug*`) was
swallowing them. Switched to `:slug+` so subpath URLs still 308 while
the bare pages render.
### Visual polish
- **Adapter-only sidebar variant** (`AdaptersDocsLayout` +
`AdaptersSidebar`) with uppercase eyebrow separators, tighter rows, and
a thin themed scrollbar utility class. The shared `/docs` sidebar is
untouched.
- **Restyled `AdapterHero`**: drops the badges row + packageName, sits
the title inline with the logo, larger 17 px tagline, horizontal divider
beneath the block.
- **Restyled `PackageInstall`** as a tabbed dark single-line snippet
with a `$` prompt prefix and a copy button — replaces the previous
multi-line `CodeBlock` layout.
- **New "Deploy your chat app on Vercel" upsell card** (`<Upsell />`)
replaces the old `EditSource / ScrollTop / Feedback / CopyPage` footer
cluster on every adapter detail page.
- **Listing & messenger pages**: align the H1 to a tighter `text-4xl
sm:text-[44px]`, and the section headers to `text-base font-medium
tracking-tight` with a one-line muted lede.
### Tooling & tests
- Added `mdxBody: true` opt-in to the adapter frontmatter schema
(`source.config.ts`), and updated both detail-page handlers
(`community/[slug]` and the new `vendor-official/[slug]`) to render the
MDX body when present, falling back to README fetch otherwise.
- Refactored both detail-page handlers to flatten the body-render
branches into a `renderBody()` helper, removing the nested ternaries
that were tripping `lint/style/noNestedTernary`.
- New test file
[`packages/integration-tests/src/docs-adapters.test.ts`](https://github.com/vercel/chat/blob/docs/refresh-adapters/packages/integration-tests/src/docs-adapters.test.ts)
— **220 new assertions** covering:
- Adapter MDX frontmatter completeness, slug ↔ filename consistency, and
`type ∈ {platform, state}`.
- Vendor-official invariants: exactly the expected slugs,
`vendorOfficial: true`, `community: true`, `author`, `mdxBody: true`,
`<FeatureSupport />` rendered.
- Community invariants: `community: true` (never vendor-official),
`mdxBody: true`, `<FeatureSupport />`.
- Official invariants: never flagged, `packageName` always under
`@chat-adapter/*`.
- `adapters.json` ↔ MDX sync on `packageName` / `type` / `community` /
`vendorOfficial`.
- Extended `VALID_DOC_PACKAGES` so `docs-content.test.ts` accepts the
new vendor-official + community packages, plus `@chat-adapter/web`,
`@chat-adapter/web/react`, and `@chat-adapter/messenger`.
### Per-package AGENTS.md
- Added `AGENTS.md` to every official adapter and state adapter (14
packages), each tailored to that adapter's surface — overview, directory
layout, build/test commands, public exports, thread ID format, webhook
flow, authentication, format conversion, cards/streaming, platform
quirks, testing approach, coding conventions, and release rules.
- Added a one-line `CLAUDE.md` (`@AGENTS.md`) beside each so Claude Code
picks up the same instructions through its built-in resolver — same
convention as the root.
### Web adapter copy
- Cleaned up the Web adapter tagline (removed inline backticks) and
dropped the now-redundant "v1 scope" section from the body.
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
192 lines
5.0 KiB
Plaintext
192 lines
5.0 KiB
Plaintext
---
|
|
title: Messenger
|
|
description: Facebook Messenger adapter using the Messenger Platform API.
|
|
packageName: "@chat-adapter/messenger"
|
|
slug: messenger
|
|
type: platform
|
|
logo: messenger
|
|
tagline: Build bots for Facebook Messenger with templates, buttons, reactions, and postbacks.
|
|
beta: true
|
|
features:
|
|
postMessage: yes
|
|
editMessage: no
|
|
deleteMessage: no
|
|
fileUploads: no
|
|
streaming:
|
|
status: partial
|
|
label: Buffered
|
|
scheduledMessages: no
|
|
cardFormat:
|
|
status: partial
|
|
label: Generic / Button Templates
|
|
buttons:
|
|
status: partial
|
|
label: Max 3, postback
|
|
linkButtons:
|
|
status: yes
|
|
label: web_url
|
|
selectMenus: no
|
|
tables:
|
|
status: partial
|
|
label: ASCII
|
|
fields:
|
|
status: partial
|
|
label: ASCII
|
|
imagesInCards: yes
|
|
modals: no
|
|
slashCommands: no
|
|
mentions: yes
|
|
addReactions: no
|
|
removeReactions: no
|
|
typingIndicator: yes
|
|
directMessages: yes
|
|
ephemeralMessages: no
|
|
customApiEndpoint: yes
|
|
fetchMessages:
|
|
status: partial
|
|
label: Cached sent only
|
|
fetchSingleMessage:
|
|
status: partial
|
|
label: Cached
|
|
fetchThreadInfo: yes
|
|
fetchChannelMessages:
|
|
status: partial
|
|
label: Cached
|
|
listThreads: no
|
|
fetchChannelInfo: yes
|
|
postChannelMessage: yes
|
|
---
|
|
|
|
## Install
|
|
|
|
<PackageInstall package="@chat-adapter/messenger" />
|
|
|
|
## Quick start
|
|
|
|
<Callout type="info">
|
|
The adapter auto-detects `FACEBOOK_APP_SECRET`, `FACEBOOK_PAGE_ACCESS_TOKEN`, `FACEBOOK_VERIFY_TOKEN`, and `FACEBOOK_BOT_USERNAME` from the environment.
|
|
</Callout>
|
|
|
|
```typescript title="lib/bot.ts" lineNumbers
|
|
import { Chat } from "chat";
|
|
import { createMessengerAdapter } from "@chat-adapter/messenger";
|
|
|
|
const bot = new Chat({
|
|
userName: "mybot",
|
|
adapters: {
|
|
messenger: createMessengerAdapter(),
|
|
},
|
|
});
|
|
|
|
bot.onDirectMessage(async (thread, message) => {
|
|
await thread.post("Hello from Messenger!");
|
|
});
|
|
```
|
|
|
|
```typescript title="app/api/webhooks/messenger/route.ts" lineNumbers
|
|
import { bot } from "@/lib/bot";
|
|
|
|
export async function GET(request: Request) {
|
|
return bot.webhooks.messenger(request);
|
|
}
|
|
|
|
export async function POST(request: Request) {
|
|
return bot.webhooks.messenger(request);
|
|
}
|
|
```
|
|
|
|
## Configuration
|
|
|
|
<TypeTable
|
|
type={{
|
|
appSecret: {
|
|
type: "string",
|
|
description:
|
|
"App secret for `X-Hub-Signature-256` verification. Auto-detected from `FACEBOOK_APP_SECRET`.",
|
|
},
|
|
pageAccessToken: {
|
|
type: "string",
|
|
description:
|
|
"Page access token. Auto-detected from `FACEBOOK_PAGE_ACCESS_TOKEN`.",
|
|
},
|
|
verifyToken: {
|
|
type: "string",
|
|
description:
|
|
"Webhook verification secret. Auto-detected from `FACEBOOK_VERIFY_TOKEN`.",
|
|
},
|
|
userName: {
|
|
type: "string",
|
|
default: '"messenger-bot"',
|
|
description: "Bot username. Auto-detected from `FACEBOOK_BOT_USERNAME`.",
|
|
},
|
|
apiUrl: {
|
|
type: "string",
|
|
description: "Override the Meta Graph API base URL.",
|
|
},
|
|
}}
|
|
/>
|
|
|
|
## Authentication
|
|
|
|
### 1. Create a Meta app
|
|
|
|
1. Go to [developers.facebook.com/apps](https://developers.facebook.com/apps).
|
|
2. Create an app and select **"Engage with customers on Messenger from Meta"**.
|
|
3. Under **App Settings** then **Basic**, copy the **App Secret** to `FACEBOOK_APP_SECRET`.
|
|
|
|
### 2. Create a Facebook Page
|
|
|
|
Your Messenger bot needs a Facebook Page to send and receive messages. Create one under a Facebook Business profile if you don't already have one — users message the Page to interact with your bot.
|
|
|
|
### 3. Configure Messenger API
|
|
|
|
In your Meta app dashboard, open **Use Cases** then **Messenger API Settings**.
|
|
|
|
**Configure webhooks:**
|
|
|
|
1. Click **Add Callback URL** and enter `https://your-domain.com/api/webhooks/messenger`.
|
|
2. Set a **Verify Token** of your choice — this becomes `FACEBOOK_VERIFY_TOKEN`.
|
|
3. Click **Verify and Save**.
|
|
4. Add subscriptions: `messages`, `messaging_postbacks`, `messaging_reactions`, `message_deliveries`, `message_reads`.
|
|
|
|
**Generate a Page Access Token:**
|
|
|
|
1. Under **Generate access tokens** click **Add or remove Pages** and select your Page.
|
|
2. Generate the token and copy it to `FACEBOOK_PAGE_ACCESS_TOKEN`.
|
|
|
|
## Advanced
|
|
|
|
### Webhook flow
|
|
|
|
Messenger uses two webhook mechanisms:
|
|
|
|
- **Verification handshake** (GET) — Meta sends a `hub.verify_token` challenge that must match your `FACEBOOK_VERIFY_TOKEN`.
|
|
- **Event delivery** (POST) — incoming messages, reactions, and postbacks, verified via `X-Hub-Signature-256`.
|
|
|
|
### Interactive messages
|
|
|
|
Card elements are automatically converted to Messenger templates:
|
|
|
|
- **Generic Template** — used when the card has a `title` or `imageUrl`. Up to 3 buttons.
|
|
- **Button Template** — used when the card has text content and buttons but no title/image. Max 640 characters.
|
|
- **Text Fallback** — used when the card contains unsupported elements (tables, select menus) or exceeds constraints.
|
|
|
|
Constraints:
|
|
|
|
- Max 3 buttons per template.
|
|
- Button titles limited to 20 characters (truncated with ellipsis).
|
|
- Subtitles limited to 80 characters.
|
|
- Button Template text limited to 640 characters.
|
|
|
|
### Thread ID format
|
|
|
|
```
|
|
messenger:{recipientId}
|
|
```
|
|
|
|
Example: `messenger:27161130920158013`.
|
|
|
|
## Feature support
|
|
|
|
<FeatureSupport />
|