sageapi/db/schema.sql
Hermes Agent 40c480e488 fix: sageapi local deployment and test server
- Fix health check sqlExe calls: add missing ns parameter
- Fix accounting ID generation: use getID() instead of uuid4 (VARCHAR length)
- Fix accounting request_id: normalize empty to NULL to avoid UNIQUE constraint violation
- Fix test_server balance/update route: was incorrectly pointing to accounting handler
- Add test_server.py: standalone aiohttp test server for local development
- Update conf/config.yaml: local MySQL credentials (test/test)
- Update db/schema.sql and scripts/generate_ddl.py for local testing
- Fix router sync_status sqlExe call: add missing ns parameter
- Fix sync uapi_sync: use correct table/column names
2026-05-20 22:46:05 +08:00

153 lines
7.7 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- SageAPI DDL (auto-generated)
CREATE TABLE IF NOT EXISTS `accounting_records` (
`id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主键',
`customer_id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '客户ID',
`llmid` VARCHAR(32) NULL DEFAULT '' COMMENT '模型ID',
`model_name` VARCHAR(128) NULL DEFAULT '' COMMENT '模型名称',
`pricing_id` VARCHAR(32) NULL DEFAULT '' COMMENT '定价ID',
`input_tokens` BIGINT NULL COMMENT '输入token数',
`output_tokens` BIGINT NULL COMMENT '输出token数',
`total_tokens` BIGINT NULL COMMENT '总token数',
`quantity` DECIMAL(15,4) NULL COMMENT '用量(图片数/分钟数等)',
`amount` DECIMAL(15,6) NOT NULL DEFAULT 0.0 COMMENT '金额',
`currency` VARCHAR(8) NOT NULL DEFAULT 'CNY' COMMENT '货币单位',
`request_id` VARCHAR(64) NULL DEFAULT '' COMMENT '请求ID幂等键',
`transno` VARCHAR(64) NULL DEFAULT '' COMMENT '事务号',
`status` VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '状态: pending/accounted/failed',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `accounting_records` ADD INDEX `idx_customer_id` (`customer_id`);
ALTER TABLE `accounting_records` ADD INDEX `idx_llmid` (`llmid`);
ALTER TABLE `accounting_records` ADD UNIQUE `idx_request_id` (`request_id`);
ALTER TABLE `accounting_records` ADD INDEX `idx_status` (`status`);
ALTER TABLE `accounting_records` ADD INDEX `idx_created_at` (`created_at`);
CREATE TABLE IF NOT EXISTS `customer_balance` (
`id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主键,即 customer_id',
`balance` DECIMAL(15,4) NOT NULL DEFAULT 0.0 COMMENT '当前余额',
`currency` VARCHAR(8) NOT NULL DEFAULT 'CNY' COMMENT '货币单位',
`credit_limit` DECIMAL(15,4) NULL COMMENT '信用额度',
`last_recharge` DATETIME NULL COMMENT '最后充值时间',
`last_consumption` DATETIME NULL COMMENT '最后消费时间',
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态: active/suspended/arrears',
`sync_version` VARCHAR(32) NULL DEFAULT '' COMMENT '同步版本号',
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `customer_balance` ADD INDEX `idx_status` (`status`);
ALTER TABLE `customer_balance` ADD INDEX `idx_balance` (`balance`);
CREATE TABLE IF NOT EXISTS `llmage_cache` (
`id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主键',
`llmid` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '关联模型ID',
`model_name` VARCHAR(128) NULL DEFAULT '' COMMENT '模型名称',
`upappid` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '上游应用ID',
`apiname` VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'API名称',
`api_url` VARCHAR(512) NULL DEFAULT '' COMMENT 'API端点URL',
`api_params` TEXT NULL COMMENT 'API参数配置JSON',
`model_params` TEXT NULL COMMENT '模型参数配置JSONmax_tokens, temperature等',
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态: active/inactive',
`sync_version` VARCHAR(32) NULL DEFAULT '' COMMENT '同步版本号',
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存写入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `llmage_cache` ADD INDEX `idx_llmid` (`llmid`);
ALTER TABLE `llmage_cache` ADD INDEX `idx_upappid` (`upappid`);
ALTER TABLE `llmage_cache` ADD INDEX `idx_apiname` (`apiname`);
CREATE TABLE IF NOT EXISTS `pricing_cache` (
`id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主键,对应 pricing_program id (ppid)',
`llmid` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '关联模型ID',
`model_name` VARCHAR(128) NULL DEFAULT '' COMMENT '模型名称',
`pricing_type` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '计费类型: token/image/video/audio',
`input_price` DECIMAL(10,6) NULL COMMENT '输入单价每千token',
`output_price` DECIMAL(10,6) NULL COMMENT '输出单价每千token',
`unit_price` DECIMAL(10,6) NULL COMMENT '统一单价(按次/按图/按分钟等)',
`currency` VARCHAR(8) NOT NULL DEFAULT 'CNY' COMMENT '货币单位',
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态: active/inactive/deprecated',
`effective_from` DATETIME NULL COMMENT '生效时间',
`effective_to` DATETIME NULL COMMENT '失效时间',
`sync_version` VARCHAR(32) NULL DEFAULT '' COMMENT '同步版本号',
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存写入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `pricing_cache` ADD INDEX `idx_llmid` (`llmid`);
ALTER TABLE `pricing_cache` ADD INDEX `idx_pricing_type` (`pricing_type`);
ALTER TABLE `pricing_cache` ADD INDEX `idx_status` (`status`);
CREATE TABLE IF NOT EXISTS `sync_state` (
`id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主键',
`entity_type` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '实体类型: users/pricing/llmage/uapi',
`entity_id` VARCHAR(64) NULL DEFAULT '' COMMENT '实体标识(全量同步时为空)',
`last_sync_time` DATETIME NULL COMMENT '最后同步时间',
`sync_version` VARCHAR(32) NULL DEFAULT '' COMMENT 'Sage返回的版本标识',
`sync_status` VARCHAR(16) NOT NULL DEFAULT 'success' COMMENT '同步状态: success/pending/failed',
`error_msg` TEXT NULL COMMENT '失败原因',
`retry_count` INT NOT NULL DEFAULT 0 COMMENT '重试次数',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `sync_state` ADD INDEX `idx_entity_type` (`entity_type`);
ALTER TABLE `sync_state` ADD UNIQUE `idx_entity_type_id` (`entity_type`,`entity_id`);
ALTER TABLE `sync_state` ADD INDEX `idx_sync_status` (`sync_status`);
CREATE TABLE IF NOT EXISTS `uapi_cache` (
`id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主键',
`upappid` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '上游应用ID',
`apiname` VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'API名称',
`method` VARCHAR(16) NULL DEFAULT 'POST' COMMENT 'HTTP方法',
`endpoint` VARCHAR(512) NULL DEFAULT '' COMMENT 'API端点',
`auth_type` VARCHAR(32) NULL DEFAULT 'bearer' COMMENT '认证类型',
`rate_limit` INT NULL COMMENT '速率限制(次/分钟)',
`description` TEXT NULL COMMENT 'API描述',
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态',
`sync_version` VARCHAR(32) NULL DEFAULT '' COMMENT '同步版本号',
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存写入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `uapi_cache` ADD UNIQUE `idx_upappid_apiname` (`upappid`,`apiname`);
ALTER TABLE `uapi_cache` ADD INDEX `idx_status` (`status`);
CREATE TABLE IF NOT EXISTS `users_cache` (
`id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主键,对应 users 表 id',
`username` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '用户名',
`orgid` VARCHAR(32) NULL DEFAULT '' COMMENT '组织ID',
`orgname` VARCHAR(255) NULL DEFAULT '' COMMENT '组织名称',
`email` VARCHAR(128) NULL DEFAULT '' COMMENT '邮箱',
`phone` VARCHAR(32) NULL DEFAULT '' COMMENT '手机号',
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态: active/inactive/suspended',
`created_at` DATETIME NULL COMMENT '创建时间',
`updated_at` DATETIME NULL COMMENT '更新时间',
`sync_version` VARCHAR(32) NULL DEFAULT '' COMMENT '同步版本号',
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存写入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `users_cache` ADD INDEX `idx_username` (`username`);
ALTER TABLE `users_cache` ADD INDEX `idx_orgid` (`orgid`);
ALTER TABLE `users_cache` ADD INDEX `idx_sync_version` (`sync_version`);