package models import "time" // AIConfig 大模型接入配置(存在 settings 表里,APIKey 加密保存)。 // // 设计取向:只支持 OpenAI 兼容协议 —— DeepSeek / 通义 / 内网 vLLM / Ollama / // 任意 OpenAI 兼容网关都覆盖了,不针对厂商写适配器,保持"通用"。 type AIConfig struct { Enabled bool `json:"enabled"` Provider string `json:"provider"` // 固定 openai-compatible(保留字段便于将来扩展) BaseURL string `json:"baseUrl"` // 如 https://api.deepseek.com/v1 // APIKey 返回给前端时永远是掩码(sk-***abcd);保存时为空表示"不改动" APIKey string `json:"apiKey"` Model string `json:"model"` Temperature float64 `json:"temperature"` MaxTokens int `json:"maxTokens"` TimeoutSec int `json:"timeoutSec"` // DailyTokenCap 每用户每日 token 上限(成本闸门);0 = 不限制 DailyTokenCap int `json:"dailyTokenCap"` // MaxScanBytes 单次分析允许扫描的日志字节上限(成本闸门);0 = 用默认 2GB MaxScanBytes int64 `json:"maxScanBytes"` // RedactExtra 额外脱敏正则(每行一个),命中的内容替换为 *** RedactExtra []string `json:"redactExtra"` } // AIAnalysisRun 一次 AI 分析的审计记录。 // // 之所以连 PromptPayload 一起存:出问题时能回答"你到底把什么发给了模型", // 这是脱敏与合规的底线。payload 已脱敏,且长度在主流程里截断。 type AIAnalysisRun struct { ID uint `json:"id"` UserID uint `json:"userId"` Username string `json:"username"` SourceID uint `json:"sourceId"` SourceName string `json:"sourceName"` RangeMinutes int `json:"rangeMinutes"` Model string `json:"model"` Question string `json:"question"` Status string `json:"status"` // ok | failed | no-model | quota-exceeded Error string `json:"error"` Conclusion string `json:"conclusion"` // 模型返回的结构化 JSON(字符串) PromptPayload string `json:"promptPayload"` PromptTokens int `json:"promptTokens"` CompletionTokens int `json:"completionTokens"` ScanBytes int64 `json:"scanBytes"` DurationMs int64 `json:"durationMs"` CreatedAt time.Time `json:"createdAt"` }