* feat(line): EBA LINE adapter skeleton (WO-LINE-01-SKELETON-1018) - pkg/platform/adapters/line/ 9 files (LineAdapter hybrid inheritance + Capability + event namespace + config env load, zero hardcoded secrets) - LINE SDK calls all stub (NotImplementedError) pending WO-LINE-00/02/03 - Verified: compileall 7/7 + ruff 0 + import chain green against v4.11.0-hotfixed SDK (container-extracted, read-only) - Source: handoff box WO-LINE-01-SKELETON-1018 (sha256 9/9 matched) Co-authored-by: multica-agent <[email protected]> * feat(line): implement WO-LINE-02 message.received loop and converter Co-authored-by: multica-agent <[email protected]> * feat(line): implement WO-LINE-03 streaming and send API Co-authored-by: multica-agent <[email protected]> * feat(line): implement WO-LINE-04 group and user event extensions Co-authored-by: multica-agent <[email protected]> * feat(line): implement WO-LINE-05 group and user event extensions Co-authored-by: multica-agent <[email protected]> * docs(line): add EBA LINE adapter architecture guide and documentation Co-authored-by: multica-agent <[email protected]> * feat(line): resolve Ruff warnings and manifest spec update Co-authored-by: multica-agent <[email protected]> * feat(line): add webhook_url config and help_links to PR_DESCRIPTION.md Co-authored-by: multica-agent <[email protected]> * feat(line): add webhook_url config and help_links for PR #2736 Co-authored-by: multica-agent <[email protected]> * fix(line): ruff format, update help_links, remove nested duplicate dir Co-authored-by: multica-agent <[email protected]> * fix(line): resolve 12 test failures, align types, and move architecture docs to dev-docs Co-authored-by: multica-agent <[email protected]> * fix(line): resolve ruff lint and formatting issues for CI Co-authored-by: multica-agent <[email protected]> * docs(line): sanitize internal orchestration notes and standardize documentation Co-authored-by: multica-agent <[email protected]> * clean(line): remove internal tracking ticket references from source code Co-authored-by: multica-agent <[email protected]> * fix(line): resolve MessageReceivedEvent and Friend entity mapping for 100% test pass Co-authored-by: multica-agent <[email protected]> * fix(line): resolve E402 import order in event_converter.py Co-authored-by: multica-agent <[email protected]> * feat(line): implement the LINE Omni adapter on the legacy messaging flow Replace the placeholder skeleton with a working unified-webhook adapter: - verify X-Line-Signature with WebhookParser and acknowledge before dispatch - build real LINE messaging clients from channel_access_token and drop the adapter's own messages using the account id from get_bot_info - map message/image/voice events to message.received, unsend to message.deleted, membership changes to group/bot events, and the remaining LINE event types to platform.specific with chat identity - send and reply through MessagingApi with LINE's five-message budget, a reply-token to push fallback, and honest NotSupportedError paths - expose get_user_info, get_group_info, leave_group and the get_bot_info, get_profile, get_group_summary pass-through actions - keep the legacy FriendMessage/GroupMessage listeners working - move tests to tests/unit_tests/platform, add the adapter doc, and register line in OMNI_ADAPTER_NAMES Co-authored-by: multica-agent <[email protected]> --------- Co-authored-by: multica-agent <[email protected]> Co-authored-by: RockChinQ <[email protected]>
3.6 KiB
LINE EBA Adapter
Structure
LINE is migrated into src/langbot/pkg/platform/adapters/line/ with the standard EBA adapter layout:
adapter.pyowns lifecycle, unified webhook handling, signature verification, listener dispatch, and outbound send/reply.event_converter.pymaps LINE webhook events tomessage.received,message.deleted, group membership events, andplatform.specific.message_converter.pymaps commonMessageChaincomponents to LINE message objects and maps inbound LINE text/image/voice payloads back to EBA components.api_impl.pyimplements the optional common APIs against the LINE Messaging API.platform_api.pydeclares the safe LINE-specific pass-through actions.manifest.yamldeclaresline-omni.
The legacy src/langbot/pkg/platform/sources/line.py adapter is kept unchanged.
Request handling reuses the proven behaviour of the legacy adapter: WebhookParser verifies X-Line-Signature, the webhook acknowledges immediately, and each event is converted and dispatched in a background task.
Configuration
| Field | Required | Notes |
|---|---|---|
webhook_url |
No | Generated by LangBot. Paste it into the LINE Developers console and enable "Use webhook". |
channel_access_token |
Yes | Long-lived channel access token, used for all outbound calls. |
channel_secret |
Yes | Channel secret, used to verify X-Line-Signature. |
bot_account_id is resolved through get_bot_info on startup and is used to drop the adapter's own messages.
Events
| Event | Notes |
|---|---|
message.received |
Text, image, voice, and other message types. Group and room chats are mapped to group chat identity. LINE mentions become At components. |
message.deleted |
Emitted for LINE unsend events. |
group.member_joined |
Emitted for memberJoined; the first listed member is the event subject. |
group.member_left |
Emitted for memberLeft. |
bot.invited_to_group |
Emitted when the Official Account joins a group or room (join). |
bot.removed_from_group |
Emitted when the Official Account leaves (leave). |
platform.specific |
line.follow, line.unfollow, line.postback, line.beacon, and any other LINE event type, with chat_id in data. |
Legacy pipeline bindings still receive FriendMessage / GroupMessage; the adapter converts the unified event for them.
Common APIs
Required:
send_messagereply_message
Optional:
get_user_infoget_group_infoleave_groupcall_platform_api
reply_message uses the event's reply token and falls back to push_message when the token is rejected or already used, so multi-message answers still arrive.
Platform APIs
| Action | Notes |
|---|---|
get_bot_info |
Returns the Official Account profile. |
get_profile |
Calls get_profile for a user id. |
get_group_summary |
Calls get_group_summary for a group id. |
Known Limits
- LINE has no group member listing API, so
get_group_member_listraisesNotSupportedError. - Outbound images require a public URL: the Messaging API fetches
originalContentUrl, so a base64-onlyImagecomponent raisesNotSupportedErrorinstead of sending nothing. - LINE has no message edit API;
edit_messageraisesNotSupportedError. Streaming output is not supported. - Requests are capped at five messages per call and 5000 characters per text message; longer chains are split into multiple requests.
- Offline coverage lives in
tests/unit_tests/platform/test_line_eba_adapter.py. A real channel (webhook delivery, reply tokens, media download) still needs verification against a live LINE Official Account.