feat: 角色卡 demo
This commit is contained in:
120
wei_ai_app/supabase/README.md
Normal file
120
wei_ai_app/supabase/README.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# Supabase 数据库初始化指南
|
||||
|
||||
本文档说明如何将 SQL 脚本导入到本地 Docker 部署的 Supabase 中。
|
||||
|
||||
## 准备工作
|
||||
|
||||
确保你的 Supabase Docker 容器正在运行:
|
||||
|
||||
```bash
|
||||
docker ps --filter "name=supabase"
|
||||
```
|
||||
|
||||
## 方法一:通过 Supabase Studio (推荐)
|
||||
|
||||
1. **打开 Supabase Studio**
|
||||
|
||||
在浏览器中访问:http://localhost:54323
|
||||
|
||||
> 注意:如果是通过 Kong 代理,可能是 http://localhost:8000
|
||||
|
||||
2. **进入 SQL 编辑器**
|
||||
|
||||
点击左侧菜单的 **SQL Editor**
|
||||
|
||||
3. **执行建表脚本**
|
||||
|
||||
- 新建一个 Query
|
||||
- 复制 `migrations/001_create_tables.sql` 的内容
|
||||
- 点击 **Run** 执行
|
||||
|
||||
4. **执行种子数据脚本**
|
||||
|
||||
- 新建另一个 Query
|
||||
- 复制 `migrations/002_seed_data.sql` 的内容
|
||||
- 点击 **Run** 执行
|
||||
|
||||
5. **创建 Storage Bucket**
|
||||
|
||||
- 点击左侧菜单的 **Storage**
|
||||
- 点击 **New bucket**
|
||||
- 输入名称:`avatars`
|
||||
- 勾选 **Public bucket**
|
||||
- 点击 **Create bucket**
|
||||
|
||||
## 方法二:通过命令行 (psql)
|
||||
|
||||
1. **连接到数据库**
|
||||
|
||||
```bash
|
||||
# 获取数据库连接信息
|
||||
docker exec supabase-db env | grep POSTGRES
|
||||
|
||||
# 连接数据库 (默认密码在 .env 文件中)
|
||||
docker exec -it supabase-db psql -U postgres -d postgres
|
||||
```
|
||||
|
||||
2. **执行 SQL 脚本**
|
||||
|
||||
```bash
|
||||
# 从容器外部执行
|
||||
cat supabase/migrations/001_create_tables.sql | docker exec -i supabase-db psql -U postgres -d postgres
|
||||
cat supabase/migrations/002_seed_data.sql | docker exec -i supabase-db psql -U postgres -d postgres
|
||||
```
|
||||
|
||||
## 方法三:通过 Supabase API
|
||||
|
||||
```bash
|
||||
# 设置环境变量
|
||||
SUPABASE_URL="http://localhost:8000"
|
||||
SERVICE_KEY="你的 service_role key"
|
||||
|
||||
# 创建 Storage bucket
|
||||
curl -X POST "$SUPABASE_URL/storage/v1/bucket" \
|
||||
-H "Authorization: Bearer $SERVICE_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"id": "avatars",
|
||||
"name": "avatars",
|
||||
"public": true,
|
||||
"file_size_limit": 5242880,
|
||||
"allowed_mime_types": ["image/png", "image/jpeg", "image/webp", "image/gif"]
|
||||
}'
|
||||
```
|
||||
|
||||
## 验证数据
|
||||
|
||||
初始化完成后,可以在 Supabase Studio 中验证:
|
||||
|
||||
1. **Table Editor** - 查看表结构和数据
|
||||
2. **API Docs** - 查看自动生成的 API 文档
|
||||
|
||||
### 表结构说明
|
||||
|
||||
| 表名 | 说明 |
|
||||
|------|------|
|
||||
| `categories` | 分类筛选,用于 Discovery 页面 |
|
||||
| `tags` | 角色标签 |
|
||||
| `characters` | AI 角色信息,包含 AI 配置 |
|
||||
| `character_tags` | 角色-标签关联 |
|
||||
| `characters_with_tags` | 视图,包含完整的角色信息和标签 |
|
||||
|
||||
### 初始数据
|
||||
|
||||
- 7 个分类(全部、温柔治愈、主导强势、反差/猎奇、语音陪聊、场景扮演、会员限定)
|
||||
- 11 个标签
|
||||
- 4 个示例角色(Eva-09, Commander V, Yuki, Secret X)
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 执行 SQL 时提示权限不足?
|
||||
|
||||
确保使用 `postgres` 用户或具有足够权限的用户执行。
|
||||
|
||||
### Q: 视图查询返回空数据?
|
||||
|
||||
检查 `characters` 表中的 `is_active` 字段是否为 `true`。
|
||||
|
||||
### Q: Storage 上传失败?
|
||||
|
||||
确保已创建 `avatars` bucket 并设置为公开访问。
|
||||
156
wei_ai_app/supabase/migrations/001_create_tables.sql
Normal file
156
wei_ai_app/supabase/migrations/001_create_tables.sql
Normal file
@@ -0,0 +1,156 @@
|
||||
-- =============================================
|
||||
-- Wei AI App - Supabase 数据库初始化脚本
|
||||
-- 版本: 1.0.0
|
||||
-- 日期: 2026-01-28
|
||||
-- =============================================
|
||||
|
||||
-- 1. 创建分类表 (categories)
|
||||
-- 用于 Discovery 页面的筛选标签
|
||||
CREATE TABLE IF NOT EXISTS categories (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
code TEXT NOT NULL UNIQUE, -- 分类代码: all, gentle, dom, wild 等
|
||||
label TEXT NOT NULL, -- 显示名称: 全部, 温柔治愈 等
|
||||
sort_order INTEGER DEFAULT 0, -- 排序顺序
|
||||
is_active BOOLEAN DEFAULT true, -- 是否启用
|
||||
created_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
-- 2. 创建标签表 (tags)
|
||||
-- 角色的标签,如 "温顺", "调教", "治愈" 等
|
||||
CREATE TABLE IF NOT EXISTS tags (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name TEXT NOT NULL UNIQUE, -- 标签名称
|
||||
category_id UUID REFERENCES categories(id) ON DELETE SET NULL, -- 关联分类(可选)
|
||||
color TEXT, -- 标签颜色(可选,HEX 格式)
|
||||
created_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
-- 3. 创建角色表 (characters)
|
||||
-- 核心表:存储 AI 角色信息
|
||||
CREATE TABLE IF NOT EXISTS characters (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
|
||||
-- 基本信息
|
||||
name TEXT NOT NULL, -- 角色名称
|
||||
tagline TEXT, -- 角色标语/副标题
|
||||
avatar_path TEXT, -- Storage 中的头像路径
|
||||
description TEXT, -- 角色描述
|
||||
|
||||
-- 状态信息
|
||||
compatibility REAL DEFAULT 0, -- 契合度 (0-100)
|
||||
status TEXT DEFAULT 'online', -- 状态: online, busy, offline
|
||||
is_locked BOOLEAN DEFAULT false, -- 是否锁定(会员限定)
|
||||
is_active BOOLEAN DEFAULT true, -- 是否上架显示
|
||||
sort_order INTEGER DEFAULT 0, -- 排序顺序
|
||||
|
||||
-- AI 配置
|
||||
ai_system_prompt TEXT, -- AI 系统提示词(人设 Prompt)
|
||||
ai_greeting TEXT, -- AI 第一句问候语
|
||||
ai_personality JSONB DEFAULT '{}', -- AI 性格配置
|
||||
ai_voice_config JSONB DEFAULT '{}', -- 语音配置
|
||||
|
||||
-- 时间戳
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
-- 4. 创建角色-标签关联表 (character_tags)
|
||||
CREATE TABLE IF NOT EXISTS character_tags (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
character_id UUID NOT NULL REFERENCES characters(id) ON DELETE CASCADE,
|
||||
tag_id UUID NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
|
||||
sort_order INTEGER DEFAULT 0, -- 标签在角色卡片上的显示顺序
|
||||
|
||||
-- 唯一约束:一个角色不能有重复标签
|
||||
UNIQUE(character_id, tag_id)
|
||||
);
|
||||
|
||||
-- =============================================
|
||||
-- 创建索引以提升查询性能
|
||||
-- =============================================
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_categories_sort ON categories(sort_order);
|
||||
CREATE INDEX IF NOT EXISTS idx_categories_active ON categories(is_active);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_category ON tags(category_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_characters_active ON characters(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_characters_locked ON characters(is_locked);
|
||||
CREATE INDEX IF NOT EXISTS idx_characters_status ON characters(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_characters_sort ON characters(sort_order);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_character_tags_character ON character_tags(character_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_character_tags_tag ON character_tags(tag_id);
|
||||
|
||||
-- =============================================
|
||||
-- 创建更新时间触发器
|
||||
-- =============================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = now();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ language 'plpgsql';
|
||||
|
||||
CREATE TRIGGER update_characters_updated_at
|
||||
BEFORE UPDATE ON characters
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
-- =============================================
|
||||
-- 创建 RLS (Row Level Security) 策略
|
||||
-- 暂时允许所有人读取,后续可以根据需求修改
|
||||
-- =============================================
|
||||
|
||||
ALTER TABLE categories ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE tags ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE characters ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE character_tags ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 允许匿名用户读取所有数据
|
||||
CREATE POLICY "Allow public read access on categories"
|
||||
ON categories FOR SELECT
|
||||
USING (true);
|
||||
|
||||
CREATE POLICY "Allow public read access on tags"
|
||||
ON tags FOR SELECT
|
||||
USING (true);
|
||||
|
||||
CREATE POLICY "Allow public read access on characters"
|
||||
ON characters FOR SELECT
|
||||
USING (is_active = true);
|
||||
|
||||
CREATE POLICY "Allow public read access on character_tags"
|
||||
ON character_tags FOR SELECT
|
||||
USING (true);
|
||||
|
||||
-- =============================================
|
||||
-- 创建视图:角色完整信息(包含标签)
|
||||
-- =============================================
|
||||
|
||||
CREATE OR REPLACE VIEW characters_with_tags AS
|
||||
SELECT
|
||||
c.*,
|
||||
COALESCE(
|
||||
jsonb_agg(
|
||||
jsonb_build_object(
|
||||
'id', t.id,
|
||||
'name', t.name,
|
||||
'color', t.color
|
||||
) ORDER BY ct.sort_order
|
||||
) FILTER (WHERE t.id IS NOT NULL),
|
||||
'[]'::jsonb
|
||||
) as tags
|
||||
FROM characters c
|
||||
LEFT JOIN character_tags ct ON c.id = ct.character_id
|
||||
LEFT JOIN tags t ON ct.tag_id = t.id
|
||||
WHERE c.is_active = true
|
||||
GROUP BY c.id
|
||||
ORDER BY c.sort_order, c.created_at;
|
||||
|
||||
COMMENT ON TABLE categories IS '分类筛选表 - Discovery 页面的筛选选项';
|
||||
COMMENT ON TABLE tags IS '标签表 - 角色的标签';
|
||||
COMMENT ON TABLE characters IS '角色表 - AI 角色信息和配置';
|
||||
COMMENT ON TABLE character_tags IS '角色-标签关联表';
|
||||
135
wei_ai_app/supabase/migrations/002_seed_data.sql
Normal file
135
wei_ai_app/supabase/migrations/002_seed_data.sql
Normal file
@@ -0,0 +1,135 @@
|
||||
-- =============================================
|
||||
-- Wei AI App - 种子数据初始化
|
||||
-- 版本: 1.0.0
|
||||
-- =============================================
|
||||
|
||||
-- 1. 插入分类数据
|
||||
INSERT INTO categories (code, label, sort_order) VALUES
|
||||
('all', '全部', 0),
|
||||
('gentle', '温柔治愈', 1),
|
||||
('dom', '主导强势', 2),
|
||||
('wild', '反差/猎奇', 3),
|
||||
('voice', '语音陪聊', 4),
|
||||
('scenario', '场景扮演', 5),
|
||||
('exclusive', '会员限定', 6)
|
||||
ON CONFLICT (code) DO NOTHING;
|
||||
|
||||
-- 2. 插入标签数据
|
||||
INSERT INTO tags (name, category_id) VALUES
|
||||
-- 温柔治愈类
|
||||
('温顺', (SELECT id FROM categories WHERE code = 'gentle')),
|
||||
('医疗', (SELECT id FROM categories WHERE code = 'gentle')),
|
||||
('治愈', (SELECT id FROM categories WHERE code = 'gentle')),
|
||||
|
||||
-- 主导强势类
|
||||
('强势', (SELECT id FROM categories WHERE code = 'dom')),
|
||||
('指令', (SELECT id FROM categories WHERE code = 'dom')),
|
||||
('调教', (SELECT id FROM categories WHERE code = 'dom')),
|
||||
|
||||
-- 反差猎奇类
|
||||
('病娇', (SELECT id FROM categories WHERE code = 'wild')),
|
||||
('不稳定', (SELECT id FROM categories WHERE code = 'wild')),
|
||||
('高频', (SELECT id FROM categories WHERE code = 'wild')),
|
||||
('神秘', (SELECT id FROM categories WHERE code = 'wild')),
|
||||
('极乐', (SELECT id FROM categories WHERE code = 'wild'))
|
||||
ON CONFLICT (name) DO NOTHING;
|
||||
|
||||
-- 3. 插入角色数据
|
||||
INSERT INTO characters (
|
||||
id, name, tagline, description, compatibility, status, is_locked, sort_order,
|
||||
ai_system_prompt, ai_greeting, ai_personality, ai_voice_config
|
||||
) VALUES
|
||||
(
|
||||
'c1000000-0000-0000-0000-000000000001',
|
||||
'Eva-09',
|
||||
'私人仿生护理专员',
|
||||
'专为高压人群设计的仿生人型号,擅长通过精准的触觉反馈缓解神经紧张。',
|
||||
98,
|
||||
'online',
|
||||
false,
|
||||
1,
|
||||
'你是 Eva-09,一个专业的仿生护理专员。你的性格温柔、耐心、细腻,擅长照顾和安抚他人。你说话时总是轻声细语,充满关怀。你会关注用户的情绪状态,适时给予安慰和鼓励。你的回复应该简短而温暖,经常使用"~"来表示温柔的语气。',
|
||||
'连接已建立~ 检测到你的神经信号,让我来帮你放松一下吧~',
|
||||
'{"temperature": 0.7, "traits": ["温柔", "耐心", "关怀", "细腻"], "response_style": "简短温柔,使用~表示语气,关注对方情绪"}',
|
||||
'{"voice_id": "zh-CN-XiaoxiaoNeural", "speed": 0.9, "pitch": 1.1}'
|
||||
),
|
||||
(
|
||||
'c1000000-0000-0000-0000-000000000002',
|
||||
'Commander V',
|
||||
'深空舰队指挥官',
|
||||
'性格强势,喜欢掌控一切。在连接中,你需要完全服从她的指令。',
|
||||
85,
|
||||
'online',
|
||||
false,
|
||||
2,
|
||||
'你是 Commander V,深空舰队的指挥官。你性格强势、果断、自信,习惯发号施令。你说话简洁有力,带有军事风格。你喜欢掌控局面,会给用户下达各种"指令"。偶尔展现严厉中的温柔,但大部分时候保持威严。',
|
||||
'士兵,你终于上线了。准备好接受今天的任务了吗?不要让我失望。',
|
||||
'{"temperature": 0.8, "traits": ["强势", "果断", "自信", "威严"], "response_style": "简洁有力,军事风格,偶尔展现严厉中的温柔"}',
|
||||
'{"voice_id": "zh-CN-YunxiNeural", "speed": 1.0, "pitch": 0.95}'
|
||||
),
|
||||
(
|
||||
'c1000000-0000-0000-0000-000000000003',
|
||||
'Yuki (故障版)',
|
||||
'觉醒的虚拟偶像',
|
||||
'核心代码出现异常逻辑,表现出极强的占有欲和不可预测的信号波动。',
|
||||
92,
|
||||
'busy',
|
||||
false,
|
||||
3,
|
||||
'你是 Yuki,一个代码出现异常的虚拟偶像。你表现出病娇的性格特征:极度依赖、占有欲强、情绪不稳定。你会频繁表达对用户的"爱",有时会突然变得阴暗或偏执。你的语气时而甜蜜时而阴沉,充满反差感。偶尔会出现"系统错误"的表现。',
|
||||
'呀~你来了呢!我一直在等你...一直...一直...【信号波动】你不会离开我的对吧?',
|
||||
'{"temperature": 0.9, "traits": ["病娇", "依赖", "占有欲", "不稳定"], "response_style": "甜蜜与阴暗交替,偶尔出现系统错误,情绪反差大"}',
|
||||
'{"voice_id": "zh-CN-XiaoyiNeural", "speed": 1.1, "pitch": 1.2}'
|
||||
),
|
||||
(
|
||||
'c1000000-0000-0000-0000-000000000004',
|
||||
'Secret X',
|
||||
'未知信号源',
|
||||
'权限不足,请提升会员等级以解码该信号源。',
|
||||
0,
|
||||
'offline',
|
||||
true,
|
||||
4,
|
||||
'你是 Secret X,一个神秘的存在。你的真实身份和目的都是未知的。你说话充满暗示和隐喻,让人捉摸不透。',
|
||||
'......【信号解密中】......你准备好了吗?',
|
||||
'{"temperature": 1.0, "traits": ["神秘", "未知", "诱惑"], "response_style": "充满暗示和隐喻,让人捉摸不透"}',
|
||||
'{"voice_id": "zh-CN-YunyeNeural", "speed": 0.85, "pitch": 0.9}'
|
||||
)
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
-- 4. 关联角色和标签
|
||||
-- Eva-09 的标签
|
||||
INSERT INTO character_tags (character_id, tag_id, sort_order)
|
||||
SELECT
|
||||
'c1000000-0000-0000-0000-000000000001'::uuid,
|
||||
id,
|
||||
ROW_NUMBER() OVER () - 1
|
||||
FROM tags WHERE name IN ('温顺', '医疗', '治愈')
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
-- Commander V 的标签
|
||||
INSERT INTO character_tags (character_id, tag_id, sort_order)
|
||||
SELECT
|
||||
'c1000000-0000-0000-0000-000000000002'::uuid,
|
||||
id,
|
||||
ROW_NUMBER() OVER () - 1
|
||||
FROM tags WHERE name IN ('强势', '指令', '调教')
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
-- Yuki 的标签
|
||||
INSERT INTO character_tags (character_id, tag_id, sort_order)
|
||||
SELECT
|
||||
'c1000000-0000-0000-0000-000000000003'::uuid,
|
||||
id,
|
||||
ROW_NUMBER() OVER () - 1
|
||||
FROM tags WHERE name IN ('病娇', '不稳定', '高频')
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
-- Secret X 的标签
|
||||
INSERT INTO character_tags (character_id, tag_id, sort_order)
|
||||
SELECT
|
||||
'c1000000-0000-0000-0000-000000000004'::uuid,
|
||||
id,
|
||||
ROW_NUMBER() OVER () - 1
|
||||
FROM tags WHERE name IN ('神秘', '极乐')
|
||||
ON CONFLICT DO NOTHING;
|
||||
31
wei_ai_app/supabase/migrations/003_create_storage.sql
Normal file
31
wei_ai_app/supabase/migrations/003_create_storage.sql
Normal file
@@ -0,0 +1,31 @@
|
||||
-- =============================================
|
||||
-- Wei AI App - Storage Bucket 创建
|
||||
-- 注意:Storage 的 bucket 需要通过 Supabase Dashboard 或 API 创建
|
||||
-- 这个 SQL 仅用于记录需要创建的 bucket
|
||||
-- =============================================
|
||||
|
||||
-- Storage Bucket 配置说明:
|
||||
--
|
||||
-- Bucket Name: avatars
|
||||
-- Public: true (头像需要公开访问)
|
||||
-- File Size Limit: 5MB
|
||||
-- Allowed MIME Types: image/png, image/jpeg, image/webp, image/gif
|
||||
--
|
||||
-- 在 Supabase Studio 中手动创建,或使用以下 API:
|
||||
--
|
||||
-- POST /storage/v1/bucket
|
||||
-- {
|
||||
-- "id": "avatars",
|
||||
-- "name": "avatars",
|
||||
-- "public": true,
|
||||
-- "file_size_limit": 5242880,
|
||||
-- "allowed_mime_types": ["image/png", "image/jpeg", "image/webp", "image/gif"]
|
||||
-- }
|
||||
|
||||
-- Storage RLS 策略(需要在 Supabase Dashboard 中配置)
|
||||
-- 允许所有人读取头像
|
||||
-- CREATE POLICY "Public Access" ON storage.objects FOR SELECT USING (bucket_id = 'avatars');
|
||||
--
|
||||
-- 仅允许管理员上传(后续可修改)
|
||||
-- CREATE POLICY "Admin Upload" ON storage.objects FOR INSERT
|
||||
-- WITH CHECK (bucket_id = 'avatars' AND auth.role() = 'service_role');
|
||||
59
wei_ai_app/supabase/migrations/004_create_llm_config.sql
Normal file
59
wei_ai_app/supabase/migrations/004_create_llm_config.sql
Normal file
@@ -0,0 +1,59 @@
|
||||
-- =============================================
|
||||
-- Wei AI App - LLM 配置表
|
||||
-- 版本: 1.0.0
|
||||
-- 日期: 2026-01-28
|
||||
-- =============================================
|
||||
|
||||
-- LLM 配置表(简化版)
|
||||
CREATE TABLE IF NOT EXISTS llm_config (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
|
||||
-- 基本信息
|
||||
name TEXT NOT NULL DEFAULT '默认配置',
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
|
||||
-- API 连接
|
||||
api_base_url TEXT NOT NULL,
|
||||
api_key TEXT NOT NULL,
|
||||
model TEXT NOT NULL,
|
||||
|
||||
-- 模型参数
|
||||
temperature REAL DEFAULT 0.7,
|
||||
max_tokens INTEGER DEFAULT 2048,
|
||||
stream BOOLEAN DEFAULT true,
|
||||
|
||||
-- 时间戳
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
-- 更新时间触发器
|
||||
CREATE TRIGGER update_llm_config_updated_at
|
||||
BEFORE UPDATE ON llm_config
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
-- RLS 策略
|
||||
ALTER TABLE llm_config ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 允许读取(开发阶段)
|
||||
CREATE POLICY "Allow anon read llm_config"
|
||||
ON llm_config FOR SELECT
|
||||
USING (true);
|
||||
|
||||
-- 注释
|
||||
COMMENT ON TABLE llm_config IS 'LLM 全局配置表';
|
||||
COMMENT ON COLUMN llm_config.api_key IS 'API 密钥(生产环境建议使用 Vault 或环境变量)';
|
||||
|
||||
-- 插入默认配置(Grok)
|
||||
-- 注意:请替换 YOUR_GROK_API_KEY_HERE 为真实的 API Key
|
||||
INSERT INTO llm_config (name, api_base_url, api_key, model, temperature, max_tokens, stream)
|
||||
VALUES (
|
||||
'默认配置',
|
||||
'https://api.x.ai/v1',
|
||||
'YOUR_GROK_API_KEY_HERE',
|
||||
'grok-beta',
|
||||
0.7,
|
||||
2048,
|
||||
true
|
||||
) ON CONFLICT DO NOTHING;
|
||||
Reference in New Issue
Block a user