Files
CamTalk/backend/internal/models/models.go
cfy666 51ed6aa563 feat: 添加文字输入对话功能
- 后端 WsQuery 添加 text 字段,支持文本输入模式
- Pipeline 支持文本查询时跳过 STT 直接使用输入文本
- 前端 ChatPanel 添加文字输入框,连接状态下可用
- useVisionSession 添加 sendTextMessage 方法
- 更新接口文档,添加文本输入模式说明
2026-06-14 12:52:39 +08:00

130 lines
3.5 KiB
Go
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.
package models
import "time"
// Session 会话。
type Session struct {
ID string `json:"session_id"`
CreatedAt time.Time `json:"created_at"`
Config SessionConfig `json:"config"`
}
// SessionConfig 会话配置。
type SessionConfig struct {
TTSEnabled bool `json:"tts_enabled"`
DetailLevel string `json:"detail_level"` // "low" | "high"
Language string `json:"language"`
}
// DefaultConfig 默认会话配置。
func DefaultConfig() SessionConfig {
return SessionConfig{TTSEnabled: true, DetailLevel: "low", Language: "zh-CN"}
}
// SessionConfigPatch 会话配置增量更新(指针字段表示"未传则不更新")。
type SessionConfigPatch struct {
TTSEnabled *bool `json:"tts_enabled,omitempty"`
DetailLevel *string `json:"detail_level,omitempty"`
Language *string `json:"language,omitempty"`
}
// Apply 将 patch 中的非 nil 字段覆盖到 cfg。
func (p SessionConfigPatch) Apply(cfg *SessionConfig) {
if p.TTSEnabled != nil {
cfg.TTSEnabled = *p.TTSEnabled
}
if p.DetailLevel != nil {
cfg.DetailLevel = *p.DetailLevel
}
if p.Language != nil {
cfg.Language = *p.Language
}
}
// Message 对话消息。
type Message struct {
Role string `json:"role"` // "user" | "assistant"
Content string `json:"content"`
}
// --- WebSocket 消息 ---
// WsQuery 客户端 query 消息。
type WsQuery struct {
Type string `json:"type"`
RequestID string `json:"request_id"`
Image string `json:"image"` // base64
Audio string `json:"audio"` // base64
Text string `json:"text"` // 用户手动输入的文本(有值时跳过 STT
MimeType string `json:"mime_type"` // 默认 "audio/pcm"
}
// WsConfig 客户端 config 消息。
type WsConfig struct {
Type string `json:"type"`
Payload struct {
TTSEnabled *bool `json:"tts_enabled,omitempty"`
DetailLevel *string `json:"detail_level,omitempty"`
Language *string `json:"language,omitempty"`
} `json:"payload"`
}
// WsConnected 服务端 connected 消息。
type WsConnected struct {
Type string `json:"type"`
SessionID string `json:"session_id"`
ServerVersion string `json:"server_version"`
}
// WsSTTResult 服务端 stt_result 消息。
type WsSTTResult struct {
Type string `json:"type"`
RequestID string `json:"request_id"`
Text string `json:"text"`
IsFinal bool `json:"is_final"`
}
// WsLLMChunk 服务端 llm_chunk 消息。
type WsLLMChunk struct {
Type string `json:"type"`
RequestID string `json:"request_id"`
Delta string `json:"delta"`
Role string `json:"role"`
}
// WsLLMDone 服务端 llm_done 消息。
type WsLLMDone struct {
Type string `json:"type"`
RequestID string `json:"request_id"`
FullText string `json:"full_text"`
TokensUsed struct {
Prompt int `json:"prompt"`
Completion int `json:"completion"`
Total int `json:"total"`
} `json:"tokens_used"`
Model string `json:"model"`
LatencyMs int64 `json:"latency_ms"`
}
// WsTTSAudio 服务端 tts_audio 消息。
type WsTTSAudio struct {
Type string `json:"type"`
RequestID string `json:"request_id"`
Audio string `json:"audio"` // base64
MimeType string `json:"mime_type"` // "audio/mp3" 或 "audio/pcm"
IsLast bool `json:"is_last"`
}
// WsError 服务端 error 消息。
type WsError struct {
Type string `json:"type"`
RequestID string `json:"request_id,omitempty"`
Code string `json:"code"`
Message string `json:"message"`
}
// WsPong 服务端 pong 消息。
type WsPong struct {
Type string `json:"type"`
}