Files
company-ai-platform/app/modules/feishu/constants.py
JiuContinent eb8267ed18 ```
feat(feishu): 添加飞书入站事件inbox和混合数据库协调功能

- 实现飞书入站事件持久化inbox机制,支持状态管理、租约锁定和重试退避
- 添加混合数据库基线协调工具,确保平台PostgreSQL结构安全对齐
- 增加运行组件心跳检测和readiness就绪检查机制
- 实现app_ticket事件的安全轮换和验证处理
- 添加生产环境运行编排和fail-closed安全机制
- 支持webhook快速确认和长连接独立进程处理
- 完善个人数据擦除时的待处理事件清理功能
```
2026-07-27 17:14:37 +08:00

205 lines
5.6 KiB
Python

from enum import StrEnum
class FeishuReceiveIdType(StrEnum):
CHAT_ID = "chat_id"
OPEN_ID = "open_id"
class FeishuAppType(StrEnum):
SELF = "self"
STORE = "store"
class FeishuMessageType(StrEnum):
TEXT = "text"
INTERACTIVE = "interactive"
class FeishuEventSource(StrEnum):
WEBHOOK = "webhook"
LONG_CONNECTION = "long_connection"
class FeishuInboundStatus(StrEnum):
PENDING = "pending"
PROCESSING = "processing"
SUCCEEDED = "succeeded"
RETRY = "retry"
FAILED = "failed"
class FeishuEventTransport(StrEnum):
DISABLED = "disabled"
WEBHOOK = "webhook"
LONG_CONNECTION = "long_connection"
class FeishuPayloadKey(StrEnum):
APP_ACCESS_TOKEN = "app_access_token"
APP_ID = "app_id"
APP_SECRET = "app_secret"
APP_TICKET = "app_ticket"
CARD = "card"
CHALLENGE = "challenge"
CHAT_TYPE = "chat_type"
CODE = "code"
CONFIG = "config"
CONTENT = "content"
DIV = "div"
DATA = "data"
ELEMENTS = "elements"
ENCRYPT = "encrypt"
EXPIRE = "expire"
FEISHU_ERROR = "feishu_error"
HEADER = "header"
IMAGE = "image"
IMAGE_KEY = "image_key"
IMAGE_TYPE = "image_type"
ID = "id"
IMG = "img"
IMG_KEY = "img_key"
KEY = "key"
ALT = "alt"
EVENT = "event"
EVENT_ID = "event_id"
EVENT_TYPE = "event_type"
LARK_MARKDOWN = "lark_md"
MESSAGE = "message"
MESSAGE_ID = "message_id"
MESSAGE_TYPE = "msg_type"
MENTIONS = "mentions"
NAME = "name"
OPEN_ID = "open_id"
PLAIN_TEXT = "plain_text"
RECEIVE_ID = "receive_id"
RECEIVE_ID_TYPE = "receive_id_type"
SENDER = "sender"
SENDER_ID = "sender_id"
TAG = "tag"
TENANT_ACCESS_TOKEN = "tenant_access_token"
TENANT_KEY = "tenant_key"
TEXT = "text"
TITLE = "title"
TOKEN = "token"
UNION_ID = "union_id"
USER_ID = "user_id"
UUID = "uuid"
WIDE_SCREEN_MODE = "wide_screen_mode"
class FeishuCommandKey(StrEnum):
TEXT = "text"
CHAT_ID = "chat_id"
CHAT_TYPE = "chat_type"
ACTOR = "actor"
MENTIONS = "mentions"
PRINCIPAL = "principal"
class FeishuResponseKey(StrEnum):
OK = "ok"
ACCEPTED = "accepted"
HANDLED = "handled"
DUPLICATE = "duplicate"
RESULT = "result"
CHALLENGE = "challenge"
PROVIDER_RESPONSE = "provider_response"
STATUS = "status"
APPROVER = "approver"
class FeishuCommandResultKey(StrEnum):
COMMAND = "command"
REPLY_TYPE = "reply_type"
TITLE = "title"
CONTENT = "content"
LINES = "lines"
PROVIDER_RESPONSE = "provider_response"
class FeishuCommandName(StrEnum):
PERMISSION_DENIED = "permission_denied"
HELP = "help"
USER_SET_ADMIN = "user_set_admin"
USER_SET_USER = "user_set_user"
USER_DISABLE = "user_disable"
USER_ENABLE = "user_enable"
PREFERENCE_SET = "preference_set"
PREFERENCE_LIST = "preference_list"
PREFERENCE_DELETE = "preference_delete"
CONVERSATION_RESET = "conversation_reset"
PERSONAL_DATA_SUMMARY = "personal_data_summary"
PERSONAL_DATA_ERASURE_REQUEST = "personal_data_erasure_request"
PERSONAL_DATA_ERASURE_CONFIRM = "personal_data_erasure_confirm"
SUBSCRIPTION_CREATE = "subscription_create"
SUBSCRIPTION_LIST = "subscription_list"
SUBSCRIPTION_PAUSE = "subscription_pause"
SUBSCRIPTION_RESUME = "subscription_resume"
SUBSCRIPTION_CANCEL = "subscription_cancel"
SUBSCRIPTION_TIMEZONE = "subscription_timezone"
SUBSCRIPTION_QUIET_HOURS = "subscription_quiet_hours"
RULE_CREATE = "rule_create"
RULE_LIST = "rule_list"
RULE_DISABLE = "rule_disable"
RULE_ENABLE = "rule_enable"
RULE_UPDATE = "rule_update"
RULE_DELETE = "rule_delete"
FINANCE_NEEDS = "finance_needs"
PROJECT_FINANCE = "project_finance"
MARKET_OVERVIEW = "market_overview"
MARKET_MACRO = "market_macro"
MARKET_ANNOUNCEMENTS = "market_announcements"
STOCK_ANALYSIS = "stock_analysis"
WATCHLIST_ADD = "watchlist_add"
WATCHLIST_LIST = "watchlist_list"
DAILY_BRIEF = "daily_brief"
PROJECT_WEEKLY = "project_weekly"
ATTENDANCE_SUMMARY = "attendance_summary"
RISK_SUMMARY = "risk_summary"
AI_ASK = "ai_ask"
FALLBACK_AI = "fallback_ai"
class FeishuReplyType(StrEnum):
CARD = "card"
TEXT = "text"
class FeishuEventReceiptKey(StrEnum):
EVENT_KEY = "event_key"
SOURCE = "source"
EVENT_ID = "event_id"
MESSAGE_ID = "message_id"
class FeishuCardKey(StrEnum):
ACTIONS = "actions"
BUTTON_TYPE = "type"
VALUE = "value"
FEISHU_APP_TOKEN_PATH = "/auth/v3/app_access_token"
FEISHU_STORE_TENANT_TOKEN_PATH = "/auth/v3/tenant_access_token"
FEISHU_TENANT_TOKEN_PATH = "/auth/v3/tenant_access_token/internal"
FEISHU_MESSAGE_PATH = "/im/v1/messages"
FEISHU_IMAGE_PATH = "/im/v1/images"
FEISHU_DEFAULT_OPEN_API_DOMAIN = "https://open.feishu.cn"
FEISHU_AUTH_MISSING = "Feishu app credentials are not configured"
FEISHU_APP_TICKET_MISSING = "Feishu store app ticket is not available"
FEISHU_TENANT_KEY_MISSING = "tenant_key is required for Feishu store apps"
FEISHU_VERIFICATION_TOKEN_REQUIRED = "FEISHU_VERIFICATION_TOKEN is required"
FEISHU_INVALID_TOKEN = "Invalid Feishu token"
FEISHU_RECEIVE_ID_MISSING = "receive_id or FEISHU_DEFAULT_CHAT_ID is required"
FEISHU_SUCCESS_CODE = 0
FEISHU_DEFAULT_TOKEN_EXPIRE_SECONDS = 7200
FEISHU_TOKEN_EXPIRE_SAFETY_SECONDS = 300
FEISHU_INBOUND_BATCH_SIZE = 100
FEISHU_INBOUND_LEASE_SECONDS = 300
FEISHU_INBOUND_MAX_ATTEMPTS = 4
FEISHU_INBOUND_RETRY_DELAYS_SECONDS = (60, 300, 900)
FEISHU_AI_REPLY_TITLE = "AI 回复"
FEISHU_EMPTY_CARD_TEXT = "暂无数据"
FEISHU_MENTION_PATTERN = r"@\S+"
FEISHU_ZERO_WIDTH_SPACE = "\u200b"