diff --git a/ruoyi-server/src/main/resources/application-dev.yml b/ruoyi-server/src/main/resources/application-dev.yml index 438ebec..f5d35d5 100644 --- a/ruoyi-server/src/main/resources/application-dev.yml +++ b/ruoyi-server/src/main/resources/application-dev.yml @@ -47,9 +47,9 @@ spring: master: type: ${spring.datasource.type} driverClassName: org.postgresql.Driver - url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true - username: postgres - password: 123456 + url: jdbc:postgresql://112.74.106.216:15432/pet?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true + username: pet + password: 4ZdTwkFrBSZphB7B # # 从库数据源 # slave: # lazy: true @@ -96,13 +96,13 @@ spring: spring.data: redis: # 地址 - host: localhost + host: 47.115.140.38 # 端口,默认为6379 - port: 6379 + port: 16379 # 数据库索引 database: 0 # redis 密码必须配置 - password: 123456 + password: redis_hpKXtt # 连接超时时间 timeout: 10s # 是否开启ssl连接 diff --git a/script/sql/postgres/postgres-ruoyi-ai.sql b/script/sql/postgres/postgres-ruoyi-ai.sql new file mode 100644 index 0000000..9294957 --- /dev/null +++ b/script/sql/postgres/postgres-ruoyi-ai.sql @@ -0,0 +1,398 @@ +-- ---------------------------- +-- AI模块数据库表结构 (PostgreSQL版本) +-- ---------------------------- + +-- ---------------------------- +-- AI Provider配置表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_provider_config; +CREATE TABLE ai_provider_config ( + id BIGSERIAL PRIMARY KEY, + provider_name VARCHAR(100) NOT NULL, + provider_type VARCHAR(50) NOT NULL, + enabled BOOLEAN NOT NULL DEFAULT TRUE, + priority INTEGER NOT NULL DEFAULT 0, + weight INTEGER NOT NULL DEFAULT 1, + max_concurrency INTEGER NOT NULL DEFAULT 10, + timeout_seconds INTEGER NOT NULL DEFAULT 30, + max_retries INTEGER NOT NULL DEFAULT 3, + circuit_breaker_config JSONB, + rate_limit_config JSONB, + api_config JSONB, + model_config JSONB, + extension_config JSONB, + health_check_url VARCHAR(500), + health_check_interval INTEGER NOT NULL DEFAULT 60, + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + create_by VARCHAR(64), + update_by VARCHAR(64), + remark VARCHAR(500) +); + +COMMENT ON TABLE ai_provider_config IS 'AI Provider配置表'; +COMMENT ON COLUMN ai_provider_config.id IS 'ID'; +COMMENT ON COLUMN ai_provider_config.provider_name IS 'Provider名称'; +COMMENT ON COLUMN ai_provider_config.provider_type IS 'Provider类型'; +COMMENT ON COLUMN ai_provider_config.enabled IS '是否启用(0=禁用 1=启用)'; +COMMENT ON COLUMN ai_provider_config.priority IS '优先级(数字越小优先级越高)'; +COMMENT ON COLUMN ai_provider_config.weight IS '权重(用于负载均衡)'; +COMMENT ON COLUMN ai_provider_config.max_concurrency IS '最大并发数'; +COMMENT ON COLUMN ai_provider_config.timeout_seconds IS '超时时间(秒)'; +COMMENT ON COLUMN ai_provider_config.max_retries IS '最大重试次数'; +COMMENT ON COLUMN ai_provider_config.circuit_breaker_config IS '熔断器配置'; +COMMENT ON COLUMN ai_provider_config.rate_limit_config IS '限流配置'; +COMMENT ON COLUMN ai_provider_config.api_config IS 'API配置'; +COMMENT ON COLUMN ai_provider_config.model_config IS '模型配置'; +COMMENT ON COLUMN ai_provider_config.extension_config IS '扩展配置'; +COMMENT ON COLUMN ai_provider_config.health_check_url IS '健康检查URL'; +COMMENT ON COLUMN ai_provider_config.health_check_interval IS '健康检查间隔(秒)'; +COMMENT ON COLUMN ai_provider_config.create_time IS '创建时间'; +COMMENT ON COLUMN ai_provider_config.update_time IS '更新时间'; +COMMENT ON COLUMN ai_provider_config.create_by IS '创建者'; +COMMENT ON COLUMN ai_provider_config.update_by IS '更新者'; +COMMENT ON COLUMN ai_provider_config.remark IS '备注'; + +CREATE UNIQUE INDEX uk_provider_name ON ai_provider_config(provider_name); +CREATE INDEX idx_provider_type ON ai_provider_config(provider_type); +CREATE INDEX idx_enabled ON ai_provider_config(enabled); +CREATE INDEX idx_priority ON ai_provider_config(priority); + +-- ---------------------------- +-- AI Provider配置历史表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_provider_config_history; +CREATE TABLE ai_provider_config_history ( + id BIGSERIAL PRIMARY KEY, + config_id BIGINT NOT NULL, + provider_name VARCHAR(100) NOT NULL, + config_data JSONB NOT NULL, + operation_type VARCHAR(20) NOT NULL, + operation_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + operation_by VARCHAR(64), + remark VARCHAR(500) +); + +COMMENT ON TABLE ai_provider_config_history IS 'AI Provider配置历史表'; +COMMENT ON COLUMN ai_provider_config_history.id IS 'ID'; +COMMENT ON COLUMN ai_provider_config_history.config_id IS '配置ID'; +COMMENT ON COLUMN ai_provider_config_history.provider_name IS 'Provider名称'; +COMMENT ON COLUMN ai_provider_config_history.config_data IS '配置数据'; +COMMENT ON COLUMN ai_provider_config_history.operation_type IS '操作类型(CREATE/UPDATE/DELETE)'; +COMMENT ON COLUMN ai_provider_config_history.operation_time IS '操作时间'; +COMMENT ON COLUMN ai_provider_config_history.operation_by IS '操作者'; +COMMENT ON COLUMN ai_provider_config_history.remark IS '备注'; + +CREATE INDEX idx_config_id ON ai_provider_config_history(config_id); +CREATE INDEX idx_provider_name ON ai_provider_config_history(provider_name); +CREATE INDEX idx_operation_time ON ai_provider_config_history(operation_time); + +-- ---------------------------- +-- AI聊天记录表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_chat_record; +CREATE TABLE ai_chat_record ( + id BIGSERIAL PRIMARY KEY, + session_id VARCHAR(100) NOT NULL, + user_id BIGINT NOT NULL, + provider_name VARCHAR(100) NOT NULL, + model_name VARCHAR(100), + message_type VARCHAR(20) NOT NULL, + content TEXT NOT NULL, + tokens_used INTEGER, + cost DECIMAL(10,6), + response_time INTEGER, + is_stream BOOLEAN NOT NULL DEFAULT FALSE, + error_message TEXT, + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +COMMENT ON TABLE ai_chat_record IS 'AI聊天记录表'; +COMMENT ON COLUMN ai_chat_record.id IS 'ID'; +COMMENT ON COLUMN ai_chat_record.session_id IS '会话ID'; +COMMENT ON COLUMN ai_chat_record.user_id IS '用户ID'; +COMMENT ON COLUMN ai_chat_record.provider_name IS 'Provider名称'; +COMMENT ON COLUMN ai_chat_record.model_name IS '模型名称'; +COMMENT ON COLUMN ai_chat_record.message_type IS '消息类型(USER/ASSISTANT)'; +COMMENT ON COLUMN ai_chat_record.content IS '消息内容'; +COMMENT ON COLUMN ai_chat_record.tokens_used IS '使用的Token数'; +COMMENT ON COLUMN ai_chat_record.cost IS '成本'; +COMMENT ON COLUMN ai_chat_record.response_time IS '响应时间(毫秒)'; +COMMENT ON COLUMN ai_chat_record.is_stream IS '是否流式响应'; +COMMENT ON COLUMN ai_chat_record.error_message IS '错误信息'; +COMMENT ON COLUMN ai_chat_record.create_time IS '创建时间'; + +CREATE INDEX idx_session_id ON ai_chat_record(session_id); +CREATE INDEX idx_user_id ON ai_chat_record(user_id); +CREATE INDEX idx_provider_name ON ai_chat_record(provider_name); +CREATE INDEX idx_create_time ON ai_chat_record(create_time); + +-- ---------------------------- +-- AI使用统计表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_usage_stats; +CREATE TABLE ai_usage_stats ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL, + provider_name VARCHAR(100) NOT NULL, + model_name VARCHAR(100), + stat_date DATE NOT NULL, + request_count INTEGER NOT NULL DEFAULT 0, + success_count INTEGER NOT NULL DEFAULT 0, + error_count INTEGER NOT NULL DEFAULT 0, + total_tokens BIGINT NOT NULL DEFAULT 0, + total_cost DECIMAL(10,6) NOT NULL DEFAULT 0.000000, + avg_response_time INTEGER NOT NULL DEFAULT 0, + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +COMMENT ON TABLE ai_usage_stats IS 'AI使用统计表'; +COMMENT ON COLUMN ai_usage_stats.id IS 'ID'; +COMMENT ON COLUMN ai_usage_stats.user_id IS '用户ID'; +COMMENT ON COLUMN ai_usage_stats.provider_name IS 'Provider名称'; +COMMENT ON COLUMN ai_usage_stats.model_name IS '模型名称'; +COMMENT ON COLUMN ai_usage_stats.stat_date IS '统计日期'; +COMMENT ON COLUMN ai_usage_stats.request_count IS '请求次数'; +COMMENT ON COLUMN ai_usage_stats.success_count IS '成功次数'; +COMMENT ON COLUMN ai_usage_stats.error_count IS '错误次数'; +COMMENT ON COLUMN ai_usage_stats.total_tokens IS '总Token数'; +COMMENT ON COLUMN ai_usage_stats.total_cost IS '总成本'; +COMMENT ON COLUMN ai_usage_stats.avg_response_time IS '平均响应时间(毫秒)'; +COMMENT ON COLUMN ai_usage_stats.create_time IS '创建时间'; +COMMENT ON COLUMN ai_usage_stats.update_time IS '更新时间'; + +CREATE UNIQUE INDEX uk_user_provider_date ON ai_usage_stats(user_id, provider_name, stat_date); +CREATE INDEX idx_provider_name ON ai_usage_stats(provider_name); +CREATE INDEX idx_stat_date ON ai_usage_stats(stat_date); + +-- ---------------------------- +-- AI评价记录表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_rating_record; +CREATE TABLE ai_rating_record ( + id BIGSERIAL PRIMARY KEY, + message_id VARCHAR(100) NOT NULL, + user_id BIGINT NOT NULL, + provider_name VARCHAR(100) NOT NULL, + rating INTEGER NOT NULL, + feedback TEXT, + dimension VARCHAR(50), + anonymous BOOLEAN NOT NULL DEFAULT FALSE, + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +COMMENT ON TABLE ai_rating_record IS 'AI评价记录表'; +COMMENT ON COLUMN ai_rating_record.id IS 'ID'; +COMMENT ON COLUMN ai_rating_record.message_id IS '消息ID'; +COMMENT ON COLUMN ai_rating_record.user_id IS '用户ID'; +COMMENT ON COLUMN ai_rating_record.provider_name IS 'Provider名称'; +COMMENT ON COLUMN ai_rating_record.rating IS '评分(1-5)'; +COMMENT ON COLUMN ai_rating_record.feedback IS '反馈内容'; +COMMENT ON COLUMN ai_rating_record.dimension IS '评价维度'; +COMMENT ON COLUMN ai_rating_record.anonymous IS '是否匿名'; +COMMENT ON COLUMN ai_rating_record.create_time IS '创建时间'; + +CREATE UNIQUE INDEX uk_message_user ON ai_rating_record(message_id, user_id); +CREATE INDEX idx_provider_name ON ai_rating_record(provider_name); +CREATE INDEX idx_rating ON ai_rating_record(rating); +CREATE INDEX idx_create_time ON ai_rating_record(create_time); + +-- ---------------------------- +-- AI敏感词库表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_sensitive_word; +CREATE TABLE ai_sensitive_word ( + id BIGSERIAL PRIMARY KEY, + word VARCHAR(100) NOT NULL, + word_type VARCHAR(50) NOT NULL, + enabled BOOLEAN NOT NULL DEFAULT TRUE, + priority INTEGER NOT NULL DEFAULT 0, + remark VARCHAR(500), + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + create_by VARCHAR(64), + update_by VARCHAR(64) +); + +COMMENT ON TABLE ai_sensitive_word IS 'AI敏感词库表'; +COMMENT ON COLUMN ai_sensitive_word.id IS 'ID'; +COMMENT ON COLUMN ai_sensitive_word.word IS '敏感词'; +COMMENT ON COLUMN ai_sensitive_word.word_type IS '词类型(PROFANITY/HATE_SPEECH/VIOLENCE/SEXUAL_CONTENT/ILLEGAL_ACTIVITY/PERSONAL_INFO/SPAM/MALICIOUS_CODE/POLITICAL_SENSITIVE/COMMERCIAL_AD)'; +COMMENT ON COLUMN ai_sensitive_word.enabled IS '是否启用(0=禁用 1=启用)'; +COMMENT ON COLUMN ai_sensitive_word.priority IS '优先级(数字越大优先级越高)'; +COMMENT ON COLUMN ai_sensitive_word.remark IS '备注'; +COMMENT ON COLUMN ai_sensitive_word.create_time IS '创建时间'; +COMMENT ON COLUMN ai_sensitive_word.update_time IS '更新时间'; +COMMENT ON COLUMN ai_sensitive_word.create_by IS '创建者'; +COMMENT ON COLUMN ai_sensitive_word.update_by IS '更新者'; + +CREATE UNIQUE INDEX uk_word ON ai_sensitive_word(word); +CREATE INDEX idx_word_type ON ai_sensitive_word(word_type); +CREATE INDEX idx_enabled ON ai_sensitive_word(enabled); + +-- ---------------------------- +-- AI绘画历史记录表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_painting_record; +CREATE TABLE ai_painting_record ( + id BIGSERIAL PRIMARY KEY, + task_id VARCHAR(100) NOT NULL, + user_id BIGINT, + engine_type VARCHAR(50) NOT NULL, + prompt TEXT NOT NULL, + params JSONB, + status VARCHAR(50) NOT NULL, + progress INTEGER NOT NULL DEFAULT 0, + images JSONB, + message TEXT, + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + share_code VARCHAR(64), + is_public BOOLEAN NOT NULL DEFAULT FALSE +); + +COMMENT ON TABLE ai_painting_record IS 'AI绘画历史记录表'; +COMMENT ON COLUMN ai_painting_record.id IS 'ID'; +COMMENT ON COLUMN ai_painting_record.task_id IS '任务ID'; +COMMENT ON COLUMN ai_painting_record.user_id IS '用户ID'; +COMMENT ON COLUMN ai_painting_record.engine_type IS '绘画引擎类型(DALL_E_3/MIDJOURNEY/STABLE_DIFFUSION)'; +COMMENT ON COLUMN ai_painting_record.prompt IS '提示词'; +COMMENT ON COLUMN ai_painting_record.params IS '绘画参数(JSON)'; +COMMENT ON COLUMN ai_painting_record.status IS '状态(PENDING/RUNNING/SUCCESS/FAILED)'; +COMMENT ON COLUMN ai_painting_record.progress IS '进度(0-100)'; +COMMENT ON COLUMN ai_painting_record.images IS '生成的图片URL列表(JSON数组)'; +COMMENT ON COLUMN ai_painting_record.message IS '错误消息'; +COMMENT ON COLUMN ai_painting_record.create_time IS '创建时间'; +COMMENT ON COLUMN ai_painting_record.update_time IS '更新时间'; +COMMENT ON COLUMN ai_painting_record.share_code IS '分享码(用于分享作品)'; +COMMENT ON COLUMN ai_painting_record.is_public IS '是否公开分享(0=私有 1=公开)'; + +CREATE UNIQUE INDEX uk_task_id ON ai_painting_record(task_id); +CREATE UNIQUE INDEX uk_share_code ON ai_painting_record(share_code); +CREATE INDEX idx_user_id ON ai_painting_record(user_id); +CREATE INDEX idx_engine_type ON ai_painting_record(engine_type); +CREATE INDEX idx_status ON ai_painting_record(status); +CREATE INDEX idx_create_time ON ai_painting_record(create_time); +CREATE INDEX idx_is_public ON ai_painting_record(is_public); + +-- ---------------------------- +-- AI绘画参数模板表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_painting_template; +CREATE TABLE ai_painting_template ( + id BIGSERIAL PRIMARY KEY, + template_name VARCHAR(100) NOT NULL, + user_id BIGINT, + engine_type VARCHAR(50) NOT NULL, + params JSONB NOT NULL, + description VARCHAR(500), + is_public BOOLEAN NOT NULL DEFAULT FALSE, + sort INTEGER NOT NULL DEFAULT 0, + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + create_by VARCHAR(64), + update_by VARCHAR(64) +); + +COMMENT ON TABLE ai_painting_template IS 'AI绘画参数模板表'; +COMMENT ON COLUMN ai_painting_template.id IS 'ID'; +COMMENT ON COLUMN ai_painting_template.template_name IS '模板名称'; +COMMENT ON COLUMN ai_painting_template.user_id IS '用户ID(为空表示系统模板)'; +COMMENT ON COLUMN ai_painting_template.engine_type IS '绘画引擎类型(DALL_E_3/MIDJOURNEY/STABLE_DIFFUSION)'; +COMMENT ON COLUMN ai_painting_template.params IS '绘画参数(JSON)'; +COMMENT ON COLUMN ai_painting_template.description IS '模板描述'; +COMMENT ON COLUMN ai_painting_template.is_public IS '是否公开(0=私有 1=公开)'; +COMMENT ON COLUMN ai_painting_template.sort IS '排序'; +COMMENT ON COLUMN ai_painting_template.create_time IS '创建时间'; +COMMENT ON COLUMN ai_painting_template.update_time IS '更新时间'; +COMMENT ON COLUMN ai_painting_template.create_by IS '创建者'; +COMMENT ON COLUMN ai_painting_template.update_by IS '更新者'; + +CREATE INDEX idx_user_id ON ai_painting_template(user_id); +CREATE INDEX idx_engine_type ON ai_painting_template(engine_type); +CREATE INDEX idx_is_public ON ai_painting_template(is_public); +CREATE INDEX idx_create_time ON ai_painting_template(create_time); + +-- ---------------------------- +-- AI用户配额管理表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_user_quota; +CREATE TABLE ai_user_quota ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL, + permission_level VARCHAR(50) NOT NULL DEFAULT 'BASIC', + daily_quota BIGINT NOT NULL DEFAULT 0, + monthly_quota BIGINT NOT NULL DEFAULT 0, + daily_used BIGINT NOT NULL DEFAULT 0, + monthly_used BIGINT NOT NULL DEFAULT 0, + last_reset_daily TIMESTAMP, + last_reset_monthly TIMESTAMP, + custom_limits JSONB, + remark VARCHAR(500), + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + create_by VARCHAR(64), + update_by VARCHAR(64) +); + +COMMENT ON TABLE ai_user_quota IS 'AI用户配额管理表'; +COMMENT ON COLUMN ai_user_quota.id IS 'ID'; +COMMENT ON COLUMN ai_user_quota.user_id IS '用户ID'; +COMMENT ON COLUMN ai_user_quota.permission_level IS '权限级别(GUEST/BASIC/PREMIUM/VIP/ADMIN)'; +COMMENT ON COLUMN ai_user_quota.daily_quota IS '每日配额限制(0表示无限制)'; +COMMENT ON COLUMN ai_user_quota.monthly_quota IS '每月配额限制(0表示无限制)'; +COMMENT ON COLUMN ai_user_quota.daily_used IS '每日已使用配额'; +COMMENT ON COLUMN ai_user_quota.monthly_used IS '每月已使用配额'; +COMMENT ON COLUMN ai_user_quota.last_reset_daily IS '上次重置日配额时间'; +COMMENT ON COLUMN ai_user_quota.last_reset_monthly IS '上次重置月配额时间'; +COMMENT ON COLUMN ai_user_quota.custom_limits IS '自定义限制(JSON)'; +COMMENT ON COLUMN ai_user_quota.remark IS '备注'; +COMMENT ON COLUMN ai_user_quota.create_time IS '创建时间'; +COMMENT ON COLUMN ai_user_quota.update_time IS '更新时间'; +COMMENT ON COLUMN ai_user_quota.create_by IS '创建者'; +COMMENT ON COLUMN ai_user_quota.update_by IS '更新者'; + +CREATE UNIQUE INDEX uk_user_id ON ai_user_quota(user_id); +CREATE INDEX idx_permission_level ON ai_user_quota(permission_level); +CREATE INDEX idx_create_time ON ai_user_quota(create_time); + +-- ---------------------------- +-- AI绘画作品收藏表 +-- ---------------------------- +DROP TABLE IF EXISTS ai_painting_favorite; +CREATE TABLE ai_painting_favorite ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL, + painting_record_id BIGINT NOT NULL, + task_id VARCHAR(100), + remark VARCHAR(500), + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +COMMENT ON TABLE ai_painting_favorite IS 'AI绘画作品收藏表'; +COMMENT ON COLUMN ai_painting_favorite.id IS 'ID'; +COMMENT ON COLUMN ai_painting_favorite.user_id IS '用户ID'; +COMMENT ON COLUMN ai_painting_favorite.painting_record_id IS '绘画记录ID'; +COMMENT ON COLUMN ai_painting_favorite.task_id IS '任务ID'; +COMMENT ON COLUMN ai_painting_favorite.remark IS '备注'; +COMMENT ON COLUMN ai_painting_favorite.create_time IS '收藏时间'; + +CREATE UNIQUE INDEX uk_user_painting ON ai_painting_favorite(user_id, painting_record_id); +CREATE INDEX idx_user_id ON ai_painting_favorite(user_id); +CREATE INDEX idx_painting_record_id ON ai_painting_favorite(painting_record_id); +CREATE INDEX idx_create_time ON ai_painting_favorite(create_time); + +-- ---------------------------- +-- 初始化AI Provider配置数据 +-- ---------------------------- +INSERT INTO ai_provider_config (provider_name, provider_type, enabled, priority, weight, max_concurrency, timeout_seconds, max_retries, api_config, model_config, remark) VALUES + ('openai', 'OPENAI', FALSE, 1, 10, 10, 30, 3, '{"apiKey":"","baseUrl":"https://api.openai.com/v1","organization":""}', '{"defaultModel":"gpt-3.5-turbo","supportedModels":["gpt-3.5-turbo","gpt-4","gpt-4-turbo"]}', 'OpenAI官方API'), + ('azure-openai', 'AZURE_OPENAI', FALSE, 2, 8, 8, 30, 3, '{"apiKey":"","endpoint":"","apiVersion":"2023-12-01-preview"}', '{"defaultModel":"gpt-35-turbo","supportedModels":["gpt-35-turbo","gpt-4"]}', 'Azure OpenAI服务'), + ('chatglm', 'CHATGLM', FALSE, 3, 6, 6, 30, 3, '{"apiKey":"","baseUrl":"https://open.bigmodel.cn/api/paas/v4"}', '{"defaultModel":"glm-4","supportedModels":["glm-4","glm-3-turbo"]}', '智谱AI ChatGLM'), + ('qwen', 'QWEN', FALSE, 4, 6, 6, 30, 3, '{"apiKey":"","baseUrl":"https://dashscope.aliyuncs.com/api/v1"}', '{"defaultModel":"qwen-turbo","supportedModels":["qwen-turbo","qwen-plus","qwen-max"]}', '阿里云通义千问'), + ('zhipu', 'ZHIPU', FALSE, 5, 5, 5, 30, 3, '{"apiKey":"","baseUrl":"https://open.bigmodel.cn/api/paas/v4"}', '{"defaultModel":"glm-4","supportedModels":["glm-4","glm-3-turbo"]}', '智谱AI'), + ('fastgpt', 'FASTGPT', FALSE, 6, 4, 4, 30, 3, '{"apiKey":"","baseUrl":"","chatId":""}', '{"defaultModel":"fastgpt","supportedModels":["fastgpt"]}', 'FastGPT平台'), + ('coze', 'COZE', FALSE, 7, 3, 3, 30, 3, '{"apiKey":"","baseUrl":"https://www.coze.cn/api","botId":""}', '{"defaultModel":"coze","supportedModels":["coze"]}', 'Coze平台'), + ('dify', 'DIFY', FALSE, 8, 3, 3, 30, 3, '{"apiKey":"","baseUrl":"","appId":""}', '{"defaultModel":"dify","supportedModels":["dify"]}', 'Dify平台'), + ('knowledge', 'KNOWLEDGE', TRUE, 9, 2, 2, 30, 3, '{"enabled":true}', '{"defaultModel":"knowledge","supportedModels":["knowledge"]}', '内部知识库');