128_add_channel_monitor_request_templates.sql 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. -- Migration: 128_add_channel_monitor_request_templates
  2. -- 加请求模板表 + 给 channel_monitors 加 4 个快照字段(template_id 关联引用 + extra_headers /
  3. -- body_override_mode / body_override 三个真正运行时使用的快照)。
  4. --
  5. -- 设计要点:
  6. -- 1) 模板与监控之间是「应用即拷贝」的快照语义,运行时 checker 不再回查模板表。
  7. -- 模板 UPDATE 不会自动影响监控;只有用户主动「应用到关联监控」才会刷新快照。
  8. -- 2) ON DELETE SET NULL:模板删除不级联清理监控;监控保留快照继续工作。
  9. -- 3) extra_headers / body_override 都是 JSONB;body_override_mode 用 varchar(不是 enum)
  10. -- 便于将来加新模式无需 ALTER TYPE。
  11. -- 4) 同一 provider 内模板 name 唯一(允许 Anthropic + OpenAI 重名 "伪装官方客户端")。
  12. CREATE TABLE IF NOT EXISTS channel_monitor_request_templates (
  13. id BIGSERIAL PRIMARY KEY,
  14. name VARCHAR(100) NOT NULL,
  15. provider VARCHAR(20) NOT NULL,
  16. description VARCHAR(500) NOT NULL DEFAULT '',
  17. extra_headers JSONB NOT NULL DEFAULT '{}'::jsonb,
  18. body_override_mode VARCHAR(10) NOT NULL DEFAULT 'off',
  19. body_override JSONB NULL,
  20. created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  21. updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  22. CONSTRAINT channel_monitor_request_templates_provider_check
  23. CHECK (provider IN ('openai', 'anthropic', 'gemini')),
  24. CONSTRAINT channel_monitor_request_templates_body_mode_check
  25. CHECK (body_override_mode IN ('off', 'merge', 'replace'))
  26. );
  27. CREATE UNIQUE INDEX IF NOT EXISTS channel_monitor_request_templates_provider_name
  28. ON channel_monitor_request_templates (provider, name);
  29. -- channel_monitors 加 4 列(ADD COLUMN IF NOT EXISTS 需要 PG 9.6+,生产使用 PG 16)
  30. ALTER TABLE channel_monitors
  31. ADD COLUMN IF NOT EXISTS template_id BIGINT NULL;
  32. ALTER TABLE channel_monitors
  33. ADD COLUMN IF NOT EXISTS extra_headers JSONB NOT NULL DEFAULT '{}'::jsonb;
  34. ALTER TABLE channel_monitors
  35. ADD COLUMN IF NOT EXISTS body_override_mode VARCHAR(10) NOT NULL DEFAULT 'off';
  36. ALTER TABLE channel_monitors
  37. ADD COLUMN IF NOT EXISTS body_override JSONB NULL;
  38. -- 约束 + 外键(DO 块里 IF NOT EXISTS 判断,保证幂等)
  39. DO $$
  40. BEGIN
  41. IF NOT EXISTS (
  42. SELECT 1 FROM information_schema.table_constraints
  43. WHERE constraint_name = 'channel_monitors_body_mode_check'
  44. AND table_name = 'channel_monitors'
  45. ) THEN
  46. ALTER TABLE channel_monitors
  47. ADD CONSTRAINT channel_monitors_body_mode_check
  48. CHECK (body_override_mode IN ('off', 'merge', 'replace'));
  49. END IF;
  50. IF NOT EXISTS (
  51. SELECT 1 FROM information_schema.table_constraints
  52. WHERE constraint_name = 'channel_monitors_template_id_fkey'
  53. AND table_name = 'channel_monitors'
  54. ) THEN
  55. ALTER TABLE channel_monitors
  56. ADD CONSTRAINT channel_monitors_template_id_fkey
  57. FOREIGN KEY (template_id)
  58. REFERENCES channel_monitor_request_templates (id)
  59. ON DELETE SET NULL;
  60. END IF;
  61. END $$;
  62. CREATE INDEX IF NOT EXISTS idx_channel_monitors_template_id
  63. ON channel_monitors (template_id)
  64. WHERE template_id IS NOT NULL;