226_channel_monitor_quota_mode.sql 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. -- Migration: 226_channel_monitor_quota_mode
  2. -- 渠道监控配额模式:
  3. -- 1. provider 扩容到全部 8 平台(antigravity/kimi/zhipu/deepseek)
  4. -- (antigravity 仅支持配额模式,无探活 adapter;国产 3 家复用 OpenAI 兼容探活)
  5. -- 2. check_mode:probe(默认,现状探活)/ quota(仅查关联账号用量,零 LLM 成本)
  6. -- / quota_probe(探活 + 配额并存)
  7. -- 3. account_id 关联已有账号(配额模式的数据源,复用账号侧用量服务);
  8. -- 账号删除时置空,监控保留并报「账号未关联」
  9. -- 4. channel_monitor_histories.quota 持久化归一化配额快照(JSONB)
  10. -- 5. 新增公开设置 channel_monitor_show_quota(默认关闭):
  11. -- 控制用户端监控页是否展示配额/余额;管理端始终可见
  12. DO $$
  13. DECLARE
  14. monitor_constraint_def TEXT;
  15. template_constraint_def TEXT;
  16. BEGIN
  17. SELECT pg_get_constraintdef(c.oid)
  18. INTO monitor_constraint_def
  19. FROM pg_constraint c
  20. JOIN pg_class t ON t.oid = c.conrelid
  21. WHERE t.relname = 'channel_monitors'
  22. AND c.conname = 'channel_monitors_provider_check';
  23. IF monitor_constraint_def IS NULL OR position('kimi' IN monitor_constraint_def) = 0 THEN
  24. ALTER TABLE channel_monitors
  25. DROP CONSTRAINT IF EXISTS channel_monitors_provider_check;
  26. ALTER TABLE channel_monitors
  27. ADD CONSTRAINT channel_monitors_provider_check
  28. CHECK (provider IN ('openai', 'anthropic', 'gemini', 'grok',
  29. 'antigravity', 'kimi', 'zhipu', 'deepseek'));
  30. END IF;
  31. SELECT pg_get_constraintdef(c.oid)
  32. INTO template_constraint_def
  33. FROM pg_constraint c
  34. JOIN pg_class t ON t.oid = c.conrelid
  35. WHERE t.relname = 'channel_monitor_request_templates'
  36. AND c.conname = 'channel_monitor_request_templates_provider_check';
  37. IF template_constraint_def IS NULL OR position('kimi' IN template_constraint_def) = 0 THEN
  38. ALTER TABLE channel_monitor_request_templates
  39. DROP CONSTRAINT IF EXISTS channel_monitor_request_templates_provider_check;
  40. ALTER TABLE channel_monitor_request_templates
  41. ADD CONSTRAINT channel_monitor_request_templates_provider_check
  42. CHECK (provider IN ('openai', 'anthropic', 'gemini', 'grok',
  43. 'antigravity', 'kimi', 'zhipu', 'deepseek'));
  44. END IF;
  45. END $$;
  46. ALTER TABLE channel_monitors
  47. ADD COLUMN IF NOT EXISTS check_mode VARCHAR(32) NOT NULL DEFAULT 'probe';
  48. ALTER TABLE channel_monitors
  49. ADD CONSTRAINT channel_monitors_check_mode_check
  50. CHECK (check_mode IN ('probe', 'quota', 'quota_probe'));
  51. ALTER TABLE channel_monitors
  52. ADD COLUMN IF NOT EXISTS account_id BIGINT REFERENCES accounts(id) ON DELETE SET NULL;
  53. CREATE INDEX IF NOT EXISTS idx_channel_monitors_account_id ON channel_monitors(account_id);
  54. COMMENT ON COLUMN channel_monitors.check_mode IS
  55. 'probe = LLM 探活(默认);quota = 仅查关联账号用量;quota_probe = 探活 + 配额';
  56. COMMENT ON COLUMN channel_monitors.account_id IS
  57. '配额模式关联的账号 ID(数据源);账号删除时置空';
  58. ALTER TABLE channel_monitor_histories
  59. ADD COLUMN IF NOT EXISTS quota JSONB;
  60. COMMENT ON COLUMN channel_monitor_histories.quota IS
  61. '配额模式监控的归一化配额快照(domain.MonitorQuotaSnapshot);探活模式为 NULL';
  62. -- 用户端是否展示配额/余额(默认关闭,fail-closed 解析:仅 "true" 视为开启)。
  63. -- 管理端不受此开关影响。
  64. INSERT INTO settings (key, value)
  65. VALUES ('channel_monitor_show_quota', 'false')
  66. ON CONFLICT (key) DO NOTHING;