create_final_model_tables.sql 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. -- =====================================================
  2. -- 最终版模型表结构
  3. -- models_new : 模型主表
  4. -- model_price_new : 价格表(对应爬虫 parsed_prices / discounted_prices)
  5. -- crawler_sync_log: 爬虫同步版本记录
  6. -- =====================================================
  7. DROP TABLE IF EXISTS aigcspace.model_price_new CASCADE;
  8. DROP TABLE IF EXISTS aigcspace.models_new CASCADE;
  9. DROP TABLE IF EXISTS aigcspace.crawler_sync_log CASCADE;
  10. -- =====================================================
  11. -- 1. 模型主表
  12. -- =====================================================
  13. CREATE TABLE aigcspace.models_new (
  14. id SERIAL PRIMARY KEY,
  15. model_code VARCHAR(200) NOT NULL UNIQUE,
  16. -- 爬虫自动更新字段
  17. description TEXT,
  18. display_tags TEXT[],
  19. input_modalities TEXT[],
  20. output_modalities TEXT[],
  21. features JSONB,
  22. rate_limits JSONB,
  23. tool_call_prices JSONB,
  24. raw_prices JSONB, -- models[].prices 原始结构,供前端展示用
  25. source_url TEXT,
  26. crawled_at TIMESTAMP,
  27. -- 分类(由爬虫 input/output_modalities 自动推断,管理员可覆盖)
  28. -- 0=LLM,1=多模态,2=TTS,3=STT,4=图像生成,5=视频生成,6=图像编辑,7=Embedding,8=Rerank
  29. categories INTEGER[] NOT NULL DEFAULT '{}',
  30. -- 管理员手动配置字段(爬虫不覆盖)
  31. display_name VARCHAR(255),
  32. img TEXT,
  33. supplier VARCHAR(100) NOT NULL DEFAULT 'Qwen',
  34. tag1 VARCHAR(100),
  35. tag2 VARCHAR(100),
  36. keywords TEXT,
  37. custom_description TEXT,
  38. is_featured BOOLEAN NOT NULL DEFAULT false,
  39. is_show_enabled BOOLEAN NOT NULL DEFAULT true,
  40. is_api_enabled BOOLEAN NOT NULL DEFAULT false,
  41. is_search BOOLEAN NOT NULL DEFAULT false,
  42. is_thinking BOOLEAN NOT NULL DEFAULT false,
  43. source_keys TEXT[],
  44. normalized_keys TEXT[],
  45. -- 本地模型字段
  46. is_local BOOLEAN NOT NULL DEFAULT false,
  47. user_id VARCHAR(50) REFERENCES aigcspace.users(id),
  48. base_url VARCHAR(500),
  49. local_api_key VARCHAR(500),
  50. visibility VARCHAR(20) DEFAULT 'user',
  51. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  52. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  53. );
  54. COMMENT ON TABLE aigcspace.models_new IS '模型主表';
  55. COMMENT ON COLUMN aigcspace.models_new.raw_prices IS 'models[].prices 原始结构,供前端详情页展示完整价格子项';
  56. COMMENT ON COLUMN aigcspace.models_new.categories IS '多分类数组:0=LLM,1=多模态,2=TTS,3=STT,4=图像生成,5=视频生成,6=图像编辑,7=Embedding,8=Rerank';
  57. -- =====================================================
  58. -- 2. 价格表
  59. -- 直接对应爬虫 parsed_prices(原价)+ discounted_prices(折扣价)
  60. -- 每个 model_code + label 一条记录
  61. -- =====================================================
  62. CREATE TABLE aigcspace.model_price_new (
  63. id SERIAL PRIMARY KEY,
  64. model_code VARCHAR(200) NOT NULL,
  65. -- 对应 parsed_prices / discounted_prices 的 label 字段
  66. -- 例:'语音合成'、'input<=32k'、'视频生成(720P)'
  67. label VARCHAR(200) NOT NULL,
  68. -- 阶梯范围(来自 parsed_prices 的 tier_min/tier_max/tier_unit)
  69. tier_min NUMERIC(20, 2),
  70. tier_max NUMERIC(20, 2),
  71. tier_unit VARCHAR(50), -- tokens / seconds / images / characters
  72. -- 原价(来自 parsed_prices 的 input_price / output_price)
  73. input_price_original NUMERIC(20, 8) NOT NULL DEFAULT 0,
  74. output_price_original NUMERIC(20, 8) NOT NULL DEFAULT 0,
  75. -- 折扣价(来自 discounted_prices 的 input_price / output_price)
  76. input_price_discounted NUMERIC(20, 8) NOT NULL DEFAULT 0,
  77. output_price_discounted NUMERIC(20, 8) NOT NULL DEFAULT 0,
  78. -- 折扣率(来自 discounted_prices 的 discount 字段,如 0.8)
  79. discount_rate NUMERIC(5, 4) NOT NULL DEFAULT 1.0000,
  80. -- 折扣标签(由 discount_rate 计算,如 '8折',无折扣时为 NULL)
  81. discount_label VARCHAR(20),
  82. -- 单位信息
  83. currency VARCHAR(10) NOT NULL DEFAULT 'CNY',
  84. unit VARCHAR(100) NOT NULL DEFAULT '',
  85. -- 计价基数:元/百万tokens=1000000,元/秒或元/张=1
  86. display_multiplier INTEGER NOT NULL DEFAULT 1,
  87. source_url TEXT,
  88. crawled_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  89. is_active BOOLEAN NOT NULL DEFAULT true,
  90. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  91. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  92. );
  93. COMMENT ON TABLE aigcspace.model_price_new IS '价格表:对应爬虫 parsed_prices(原价)+ discounted_prices(折扣价)';
  94. COMMENT ON COLUMN aigcspace.model_price_new.label IS '价格标签,对应爬虫 parsed_prices.label';
  95. COMMENT ON COLUMN aigcspace.model_price_new.input_price_original IS '原价输入,来自 parsed_prices.input_price';
  96. COMMENT ON COLUMN aigcspace.model_price_new.output_price_original IS '原价输出,来自 parsed_prices.output_price';
  97. COMMENT ON COLUMN aigcspace.model_price_new.input_price_discounted IS '折扣价输入,来自 discounted_prices.input_price';
  98. COMMENT ON COLUMN aigcspace.model_price_new.output_price_discounted IS '折扣价输出,来自 discounted_prices.output_price';
  99. COMMENT ON COLUMN aigcspace.model_price_new.discount_rate IS '折扣率 0~1,来自 discounted_prices.discount,如 0.8';
  100. COMMENT ON COLUMN aigcspace.model_price_new.discount_label IS '折扣标签,如 "8折",discount_rate=1 时为 NULL';
  101. COMMENT ON COLUMN aigcspace.model_price_new.display_multiplier IS '计价基数:元/百万tokens=1000000,元/秒或元/张=1';
  102. COMMENT ON COLUMN aigcspace.model_price_new.is_active IS '是否为当前生效版本';
  103. -- =====================================================
  104. -- 3. 爬虫同步版本记录表
  105. -- =====================================================
  106. CREATE TABLE aigcspace.crawler_sync_log (
  107. id SERIAL PRIMARY KEY,
  108. crawler_version INTEGER NOT NULL,
  109. synced_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  110. model_count INTEGER NOT NULL DEFAULT 0,
  111. price_count INTEGER NOT NULL DEFAULT 0,
  112. status VARCHAR(20) NOT NULL DEFAULT 'success',
  113. error_message TEXT
  114. );
  115. COMMENT ON TABLE aigcspace.crawler_sync_log IS '爬虫同步版本记录';
  116. COMMENT ON COLUMN aigcspace.crawler_sync_log.crawler_version IS '爬虫全局版本号';
  117. -- =====================================================
  118. -- 4. 索引
  119. -- =====================================================
  120. CREATE INDEX idx_models_new_categories ON aigcspace.models_new USING GIN(categories);
  121. CREATE INDEX idx_models_new_supplier ON aigcspace.models_new(supplier);
  122. CREATE INDEX idx_models_new_is_show_enabled ON aigcspace.models_new(is_show_enabled);
  123. CREATE INDEX idx_models_new_is_api_enabled ON aigcspace.models_new(is_api_enabled);
  124. CREATE INDEX idx_models_new_is_local ON aigcspace.models_new(is_local);
  125. CREATE INDEX idx_models_new_crawled_at ON aigcspace.models_new(crawled_at);
  126. CREATE INDEX idx_models_new_display_tags ON aigcspace.models_new USING GIN(display_tags);
  127. CREATE INDEX idx_models_new_source_keys ON aigcspace.models_new USING GIN(source_keys);
  128. CREATE INDEX idx_model_price_model_code ON aigcspace.model_price_new(model_code);
  129. CREATE INDEX idx_model_price_label ON aigcspace.model_price_new(label);
  130. CREATE INDEX idx_model_price_active ON aigcspace.model_price_new(model_code, is_active) WHERE is_active = true;
  131. CREATE INDEX idx_crawler_sync_log_version ON aigcspace.crawler_sync_log(crawler_version);