ForcePilot/backend/package/yuxi/channels/plugins/dingtalk/manifest.json
Kris ce0a7e7232 refactor(dingtalk): 完成钉钉适配器全量优化与功能完善
本次提交对钉钉插件进行了多维度改进:
1.  代码整洁优化:移除多余空行、调整导入顺序
2.  签名逻辑修正:修复hmac签名参数顺序,对齐官方文档
3.  消息撤回增强:使用枚举替代硬编码字符串,添加缓存未命中日志
4.  配置与能力扩展:新增互动卡片模板ID、Bot命令配置项,重构机器人编码获取逻辑
5.  流式会话优化:移除硬编码默认卡片ID,动态读取账户配置
6.  健康检查增强:新增流式端点连通性校验,替代原有简化校验逻辑
7.  附件下载升级:适配钉钉图片下载API,新增图片附件下载能力
8.  封装改进:将私有配置读取方法封装为公开接口,避免破坏封装性
2026-07-09 04:18:06 +08:00

119 lines
7.1 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"id": "com.yuxi.channels.dingtalk",
"name": "钉钉",
"version": "1.0.0",
"channel_type": "dingtalk",
"icon": "message-square",
"entry_module": "yuxi.channels.plugins.dingtalk.entry",
"provides": ["dingtalk"],
"lifecycle": ["init", "start", "stop", "pause", "resume", "unload", "reconfigure", "fail"],
"compatibility": {
"min_host_version": "1.0.0",
"dingtalk_api_version": "v2",
"stream_protocol": "websocket"
},
"failure_policy": "degrade",
"depends": [],
"critical": false,
"requires_dm_pairing": true,
"requires_outbound_delivery": true,
"credential_strategy": {
"type": "hybrid",
"acquire_method": "manual",
"required_fields": ["client_id", "client_secret", "robot_code"],
"optional_fields": ["sign_secret"],
"supports_rotation": false,
"supports_revocation": false
},
"max_message_length": 5000,
"supports_credential_cloning": false,
"transport_mode": "stream",
"capabilities": {
"rich_message": true,
"streaming": true,
"typing_indicator": false,
"message_edit": false,
"message_recall": true,
"supports_reaction": false,
"supports_pin": false,
"supports_card_update": true,
"supports_card_update_streaming": true,
"supports_image_inbound": true,
"supports_video_inbound": false,
"supports_image_outbound": true,
"supports_video_outbound": false,
"mention": true,
"command": true,
"directory": true,
"doctor": true,
"whitelist": true,
"wizard": true,
"tools": false,
"status": true,
"probeable": true,
"identity_resolver": true,
"lifecycle": true,
"supports_qr_login": false,
"agent_collaboration": false
},
"capability_requirements": [
["supports_image_inbound", ["client_id", "client_secret"]],
["supports_image_outbound", ["client_id", "client_secret", "robot_code"]],
["supports_card_update", ["client_id", "client_secret", "robot_code"]],
["supports_card_update_streaming", ["client_id", "client_secret", "robot_code"]],
["rich_message", ["client_id", "client_secret", "robot_code"]],
["streaming", ["client_id", "client_secret", "robot_code"]],
["mention", ["client_id", "client_secret"]],
["directory", ["client_id", "client_secret"]],
["lifecycle", []],
["probeable", []],
["status", []]
],
"resource_quota": {
"max_cpu": "20.0",
"max_memory": "256MB",
"max_connections": 50,
"max_calls_per_sec": 20
},
"accessible_ports": [
"ConfigPort",
"LoggerPort",
"PersistencePort",
"CachePort",
"TracerPort",
"ConversationPort",
"IdentityResolverPort"
],
"injectable_pipelines": ["inbound", "outbound"],
"config_schema": [
{"key": "client_id", "type": "string", "required": true, "default": null, "hot_reloadable": false, "scope": "account", "constraints": {"pattern": "^ding[a-zA-Z0-9]+$"}},
{"key": "client_secret", "type": "string", "required": true, "default": null, "hot_reloadable": false, "sensitive": true, "scope": "account", "constraints": {}},
{"key": "robot_code", "type": "string", "required": true, "default": null, "hot_reloadable": false, "scope": "account", "constraints": {}},
{"key": "event_mode", "type": "enum", "required": false, "default": "stream", "hot_reloadable": false, "scope": "channel", "constraints": {"values": ["stream", "http"]}},
{"key": "webhook_url", "type": "string", "required": false, "default": null, "hot_reloadable": true, "scope": "channel", "constraints": {"pattern": "^https://"}},
{"key": "sign_secret", "type": "string", "required": false, "default": null, "hot_reloadable": true, "sensitive": true, "scope": "channel", "constraints": {}},
{"key": "bot_name", "type": "string", "required": false, "default": "ForcePilot", "hot_reloadable": true, "scope": "channel", "constraints": {}},
{"key": "group_session_scope", "type": "enum", "required": false, "default": "group_sender", "hot_reloadable": true, "scope": "channel", "constraints": {"values": ["group", "group_sender"]}},
{"key": "enable_streaming", "type": "boolean", "required": false, "default": true, "hot_reloadable": true, "scope": "channel", "constraints": {}},
{"key": "streaming_strategy", "type": "enum", "required": false, "default": "delayed", "hot_reloadable": true, "scope": "channel", "constraints": {"values": ["fast", "delayed"]}},
{"key": "token_cache_ttl", "type": "integer", "required": false, "default": 7200, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 60, "max": 7200}},
{"key": "user_cache_ttl", "type": "integer", "required": false, "default": 1800, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 60, "max": 3600}},
{"key": "api_base_url", "type": "string", "required": false, "default": "https://api.dingtalk.com", "hot_reloadable": true, "scope": "channel", "constraints": {}},
{"key": "stream_endpoint_path", "type": "string", "required": false, "default": "/v1.0/gateway/connections/open", "hot_reloadable": true, "scope": "channel", "constraints": {}, "description": "钉钉 Stream 端点 API 路径,与 api_base_url 组合获取长连接接入点"},
{"key": "request_timeout_ms", "type": "integer", "required": false, "default": 30000, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 5000, "max": 60000}},
{"key": "max_retries", "type": "integer", "required": false, "default": 3, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 0, "max": 5}},
{"key": "identity_cache_ttl_sec", "type": "integer", "required": false, "default": 60, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 30, "max": 600}},
{"key": "commands", "type": "json", "required": false, "default": null, "hot_reloadable": true, "scope": "channel", "constraints": {}, "description": "钉钉 Bot 菜单命令列表,每项为 {name, description, permission, is_silent}"},
{"key": "card_template_id", "type": "string", "required": false, "default": null, "hot_reloadable": true, "scope": "account", "constraints": {}, "description": "钉钉互动卡片模板 ID用于流式输出与富消息卡片渲染未配置时卡片类能力不可用"}
],
"env_vars": [
{"name": "DINGTALK_CLIENT_ID", "description": "钉钉应用 Client ID原 AppKey", "required": true, "default": null, "sensitive": false},
{"name": "DINGTALK_CLIENT_SECRET", "description": "钉钉应用 Client Secret原 AppSecret", "required": true, "default": null, "sensitive": true},
{"name": "DINGTALK_ROBOT_CODE", "description": "机器人 RobotCode", "required": true, "default": null, "sensitive": false},
{"name": "DINGTALK_EVENT_MODE", "description": "事件接收模式stream/http", "required": false, "default": "stream", "sensitive": false},
{"name": "DINGTALK_WEBHOOK_URL", "description": "HTTP 模式回调地址", "required": false, "default": null, "sensitive": false},
{"name": "DINGTALK_SIGN_SECRET", "description": "HTTP 模式签名密钥", "required": false, "default": null, "sensitive": true},
{"name": "DINGTALK_BOT_NAME", "description": "机器人显示名称", "required": false, "default": "ForcePilot", "sensitive": false}
]
}