Files
ai-operator/internal/config/config.go
T

277 lines
13 KiB
Go

package config
import "time"
type Config struct {
App AppConfig
Asterisk AsteriskConfig
Voice VoiceConfig
Dialogue DialogueConfig
OpenAI OpenAIConfig
STT STTConfig
LLM LLMConfig
Eleven ElevenLabsConfig
Natural NaturalnessConfig
Pipeline PipelineConfig
Database DatabaseConfig
Embedding EmbeddingConfig
KB KBConfig
Handoff HandoffConfig
Fallback FallbackConfig
Audit AuditConfig
}
type AppConfig struct{ Env, LogLevel string }
type AsteriskConfig struct {
ARIURL, ARIWSURL, ARIUser, ARIPassword, ARIApp, ARIWSAuthMode string
MediaMode, MediaCodec, MediaWSBaseURL string
}
type VoiceConfig struct{ Provider, DefaultLanguage, DefaultRegionCode string }
type DialogueConfig struct {
DefaultLanguage string
DefaultRegionCode string
EnforceLanguageAndRegion bool
LanguageSelectionEnabled bool
LanguageConfidenceThreshold float64
LanguageChangeConfidenceThreshold float64
LanguageAllowChangeAfterSelection bool
LanguageDefaultOnTimeout string
RegionResolverEnabled bool
RegionConfidenceThreshold float64
RegionChangeConfidenceThreshold float64
RegionAllowChangeAfterSelection bool
RegionDefaultOnTimeout string
RegionEnableDisabledSpecial bool
}
type OpenAIConfig struct {
APIKey, RealtimeURL, RealtimeModel, RealtimeVoice, RealtimeInstructions string
RealtimeInputAudioFormat, RealtimeOutputAudioFormat string
RealtimeInputSampleRate, RealtimeOutputSampleRate int
RealtimeTurnDetection, RealtimeReasoningEffort string
RealtimeConnectTimeout, RealtimeSessionTimeout time.Duration
RealtimeMaxAudioChunkBytes int
RealtimeLiveSmokeEnabled, RealtimeInitialGreeting bool
RealtimeMaxSessionSeconds, RealtimeMaxInputAudioBytes, RealtimeMaxOutputAudioBytes int
}
type STTConfig struct {
Provider string
Mode string
Model string
LanguageAuto bool
LanguageCode string
SampleRate int
InputFormat string
PartialEnabled bool
CommittedOnlyForLLM bool
Timeout time.Duration
}
type LLMConfig struct {
Provider string
Model string
Temperature float64
MaxOutputTokens int
Timeout time.Duration
Stream bool
MaxToolLoops int
FirstChunkTimeoutMS int
StreamChunkMinChars int
StreamChunkMaxChars int
}
type ElevenLabsConfig struct {
APIKey string
VoiceIDRU string
VoiceIDKK string
STTURL string
TTSURL string
TTSMode string
TTSModelID string
TTSExpressiveModelID string
TTSOutputFormat string
TTSSampleRate int
TTSStability float64
TTSSimilarityBoost float64
TTSStyle float64
TTSUseSpeakerBoost bool
TTSOptimizeStreamingLatency int
TTSTimeout time.Duration
}
type NaturalnessConfig struct {
Enabled bool
AudioTagsEnabled bool
AudioTagsMode string
AllowNonverbalTags bool
AllowCough bool
AllowLaugh bool
MaxAudioTagsPerResponse int
RemoveAudioTagsFromTranscript bool
}
type PipelineConfig struct {
InitialGreeting bool
BargeIn bool
FlushOnUserSpeech bool
MaxTurnSeconds int
MaxResponseChars int
AllowGlobalKBWithoutRegion bool
TTFBTargetMS int
TTSStartAfterChars int
TTSStartAfterPunctuation bool
}
type DatabaseConfig struct {
URL string
MaxOpenConns int
MaxIdleConns int
ConnMaxLifetime time.Duration
MigrationsEnabled bool
}
type EmbeddingConfig struct {
Provider string
Model string
Dimensions int
BatchSize int
MaxInputChars int
OpenAILiveEnabled bool
}
type KBConfig struct {
CrossLanguageFallback bool
DefaultLimit int
MaxLimit int
MinScore float64
QueryMaxChars int
}
type HandoffConfig struct {
Mode string
Enabled bool
TargetEndpoint string
DialplanContext string
DialplanExtension string
DialplanPriority int
QueueName string
Timeout time.Duration
MaxAttempts int
PlayMessageBeforeTransfer bool
HangupAfterStub bool
AllowInTestRouteOnly bool
MaxSummaryChars int
}
type FallbackConfig struct {
MaxLanguageFailures int
MaxRegionFailures int
MaxNoAnswer int
MaxKBUnavailable int
MaxAIErrors int
MaxMediaErrors int
MaxToolErrors int
CallTimeout time.Duration
}
type AuditConfig struct {
Enabled bool
Sink string
FailClosed bool
StoreTranscripts bool
StoreTranscriptDeltas bool
StoreRawTranscripts bool
StoreRedactedTranscripts bool
StoreToolArgs bool
StoreToolResults bool
StoreKBResults bool
StoreProviderEvents bool
StoreMediaStats bool
MaxTranscriptChars int
MaxToolArgChars int
MaxToolResultChars int
MaxEventMetadataChars int
RetentionDays int
TranscriptRetentionDays int
ToolAuditRetentionDays int
ErrorAuditRetentionDays int
ExportMaxEvents int
RedactionEnabled bool
RedactionStrict bool
LogFullPhone bool
LogFullIIN bool
LogFullCard bool
}
func (c Config) Sanitized() map[string]any {
return map[string]any{
"APP_ENV": c.App.Env, "LOG_LEVEL": c.App.LogLevel,
"ASTERISK_ARI_URL": c.Asterisk.ARIURL, "ASTERISK_ARI_WS_URL": c.Asterisk.ARIWSURL,
"ASTERISK_ARI_USER": c.Asterisk.ARIUser, "ASTERISK_ARI_PASSWORD": MaskSecret(c.Asterisk.ARIPassword),
"ASTERISK_ARI_APP": c.Asterisk.ARIApp, "ASTERISK_ARI_WS_AUTH_MODE": c.Asterisk.ARIWSAuthMode,
"ASTERISK_MEDIA_MODE": c.Asterisk.MediaMode, "ASTERISK_MEDIA_CODEC": c.Asterisk.MediaCodec, "ASTERISK_MEDIA_WS_BASE_URL": c.Asterisk.MediaWSBaseURL,
"VOICE_PROVIDER": c.Voice.Provider,
"DIALOGUE_DEFAULT_LANGUAGE": c.Dialogue.DefaultLanguage, "DIALOGUE_DEFAULT_REGION_CODE": c.Dialogue.DefaultRegionCode,
"DIALOGUE_ENFORCE_LANGUAGE_REGION": c.Dialogue.EnforceLanguageAndRegion,
"LANGUAGE_SELECTION_ENABLED": c.Dialogue.LanguageSelectionEnabled, "LANGUAGE_CONFIDENCE_THRESHOLD": c.Dialogue.LanguageConfidenceThreshold,
"LANGUAGE_CHANGE_CONFIDENCE_THRESHOLD": c.Dialogue.LanguageChangeConfidenceThreshold, "LANGUAGE_ALLOW_CHANGE_AFTER_SELECTION": c.Dialogue.LanguageAllowChangeAfterSelection,
"LANGUAGE_DEFAULT_ON_TIMEOUT": c.Dialogue.LanguageDefaultOnTimeout,
"REGION_RESOLVER_ENABLED": c.Dialogue.RegionResolverEnabled, "REGION_CONFIDENCE_THRESHOLD": c.Dialogue.RegionConfidenceThreshold,
"REGION_CHANGE_CONFIDENCE_THRESHOLD": c.Dialogue.RegionChangeConfidenceThreshold, "REGION_ALLOW_CHANGE_AFTER_SELECTION": c.Dialogue.RegionAllowChangeAfterSelection,
"REGION_DEFAULT_ON_TIMEOUT": c.Dialogue.RegionDefaultOnTimeout, "REGION_ENABLE_DISABLED_SPECIAL_REGIONS": c.Dialogue.RegionEnableDisabledSpecial,
"OPENAI_API_KEY": MaskOpenAIKey(c.OpenAI.APIKey), "OPENAI_REALTIME_URL": c.OpenAI.RealtimeURL, "OPENAI_REALTIME_MODEL": c.OpenAI.RealtimeModel,
"OPENAI_REALTIME_VOICE": c.OpenAI.RealtimeVoice, "OPENAI_REALTIME_INPUT_AUDIO_FORMAT": c.OpenAI.RealtimeInputAudioFormat,
"OPENAI_REALTIME_OUTPUT_AUDIO_FORMAT": c.OpenAI.RealtimeOutputAudioFormat,
"OPENAI_REALTIME_INITIAL_GREETING": c.OpenAI.RealtimeInitialGreeting,
"STT_PROVIDER": c.STT.Provider, "ELEVENLABS_STT_MODE": c.STT.Mode, "ELEVENLABS_STT_MODEL": c.STT.Model,
"ELEVENLABS_STT_LANGUAGE_AUTO": c.STT.LanguageAuto, "ELEVENLABS_STT_LANGUAGE_CODE": c.STT.LanguageCode,
"ELEVENLABS_STT_SAMPLE_RATE": c.STT.SampleRate, "ELEVENLABS_STT_INPUT_FORMAT": c.STT.InputFormat,
"ELEVENLABS_STT_PARTIAL_ENABLED": c.STT.PartialEnabled, "ELEVENLABS_STT_COMMITTED_ONLY_FOR_LLM": c.STT.CommittedOnlyForLLM,
"LLM_PROVIDER": c.LLM.Provider, "LLM_MODEL": c.LLM.Model, "LLM_STREAM": c.LLM.Stream,
"LLM_MAX_TOOL_LOOPS": c.LLM.MaxToolLoops, "LLM_FIRST_CHUNK_TIMEOUT_MS": c.LLM.FirstChunkTimeoutMS,
"LLM_STREAM_CHUNK_MIN_CHARS": c.LLM.StreamChunkMinChars, "LLM_STREAM_CHUNK_MAX_CHARS": c.LLM.StreamChunkMaxChars,
"ELEVENLABS_API_KEY": MaskSecret(c.Eleven.APIKey), "ELEVENLABS_VOICE_ID_RU": MaskSecret(c.Eleven.VoiceIDRU), "ELEVENLABS_VOICE_ID_KK": MaskSecret(c.Eleven.VoiceIDKK),
"ELEVENLABS_TTS_MODE": c.Eleven.TTSMode, "ELEVENLABS_TTS_MODEL_ID": c.Eleven.TTSModelID, "ELEVENLABS_TTS_EXPRESSIVE_MODEL_ID": c.Eleven.TTSExpressiveModelID,
"ELEVENLABS_TTS_OUTPUT_FORMAT": c.Eleven.TTSOutputFormat, "ELEVENLABS_TTS_SAMPLE_RATE": c.Eleven.TTSSampleRate,
"VOICE_NATURALNESS_ENABLED": c.Natural.Enabled, "VOICE_AUDIO_TAGS_ENABLED": c.Natural.AudioTagsEnabled,
"VOICE_AUDIO_TAGS_MODE": c.Natural.AudioTagsMode, "VOICE_ALLOW_NONVERBAL_TAGS": c.Natural.AllowNonverbalTags,
"VOICE_ALLOW_COUGH": c.Natural.AllowCough, "VOICE_ALLOW_LAUGH": c.Natural.AllowLaugh,
"VOICE_MAX_AUDIO_TAGS_PER_RESPONSE": c.Natural.MaxAudioTagsPerResponse, "VOICE_REMOVE_AUDIO_TAGS_FROM_TRANSCRIPT": c.Natural.RemoveAudioTagsFromTranscript,
"PIPELINE_INITIAL_GREETING": c.Pipeline.InitialGreeting, "PIPELINE_BARGE_IN": c.Pipeline.BargeIn, "PIPELINE_FLUSH_ON_USER_SPEECH": c.Pipeline.FlushOnUserSpeech,
"PIPELINE_MAX_TURN_SECONDS": c.Pipeline.MaxTurnSeconds, "PIPELINE_MAX_RESPONSE_CHARS": c.Pipeline.MaxResponseChars,
"PIPELINE_ALLOW_GLOBAL_KB_WITHOUT_REGION": c.Pipeline.AllowGlobalKBWithoutRegion,
"PIPELINE_TTFB_TARGET_MS": c.Pipeline.TTFBTargetMS, "PIPELINE_TTS_START_AFTER_CHARS": c.Pipeline.TTSStartAfterChars,
"PIPELINE_TTS_START_AFTER_PUNCTUATION": c.Pipeline.TTSStartAfterPunctuation,
"DATABASE_URL": MaskURLCredentials(c.Database.URL), "DATABASE_MAX_OPEN_CONNS": c.Database.MaxOpenConns, "DATABASE_MAX_IDLE_CONNS": c.Database.MaxIdleConns,
"DATABASE_CONN_MAX_LIFETIME": c.Database.ConnMaxLifetime.String(), "DATABASE_MIGRATIONS_ENABLED": c.Database.MigrationsEnabled,
"EMBEDDING_PROVIDER": c.Embedding.Provider, "EMBEDDING_MODEL": c.Embedding.Model, "EMBEDDING_DIMENSIONS": c.Embedding.Dimensions,
"EMBEDDING_BATCH_SIZE": c.Embedding.BatchSize, "EMBEDDING_MAX_INPUT_CHARS": c.Embedding.MaxInputChars, "EMBEDDING_OPENAI_LIVE_ENABLED": c.Embedding.OpenAILiveEnabled,
"KB_CROSS_LANGUAGE_FALLBACK": c.KB.CrossLanguageFallback, "KB_DEFAULT_LIMIT": c.KB.DefaultLimit, "KB_MAX_LIMIT": c.KB.MaxLimit, "KB_MIN_SCORE": c.KB.MinScore, "KB_QUERY_MAX_CHARS": c.KB.QueryMaxChars,
"HANDOFF_MODE": c.Handoff.Mode, "HANDOFF_ENABLED": c.Handoff.Enabled, "HANDOFF_TARGET_ENDPOINT": MaskEndpoint(c.Handoff.TargetEndpoint),
"HANDOFF_DIALPLAN_CONTEXT": c.Handoff.DialplanContext, "HANDOFF_DIALPLAN_EXTENSION": c.Handoff.DialplanExtension,
"HANDOFF_DIALPLAN_PRIORITY": c.Handoff.DialplanPriority, "HANDOFF_QUEUE_NAME": c.Handoff.QueueName,
"HANDOFF_TIMEOUT": c.Handoff.Timeout.String(), "HANDOFF_MAX_ATTEMPTS": c.Handoff.MaxAttempts,
"HANDOFF_PLAY_MESSAGE_BEFORE_TRANSFER": c.Handoff.PlayMessageBeforeTransfer, "HANDOFF_HANGUP_AFTER_STUB": c.Handoff.HangupAfterStub,
"HANDOFF_ALLOW_IN_TEST_ROUTE_ONLY": c.Handoff.AllowInTestRouteOnly, "HANDOFF_MAX_SUMMARY_CHARS": c.Handoff.MaxSummaryChars,
"FALLBACK_MAX_LANGUAGE_FAILURES": c.Fallback.MaxLanguageFailures, "FALLBACK_MAX_REGION_FAILURES": c.Fallback.MaxRegionFailures,
"FALLBACK_MAX_NO_ANSWER": c.Fallback.MaxNoAnswer, "FALLBACK_MAX_KB_UNAVAILABLE": c.Fallback.MaxKBUnavailable,
"FALLBACK_MAX_AI_ERRORS": c.Fallback.MaxAIErrors, "FALLBACK_MAX_MEDIA_ERRORS": c.Fallback.MaxMediaErrors,
"FALLBACK_MAX_TOOL_ERRORS": c.Fallback.MaxToolErrors, "FALLBACK_CALL_TIMEOUT": c.Fallback.CallTimeout.String(),
"AUDIT_ENABLED": c.Audit.Enabled, "AUDIT_SINK": c.Audit.Sink, "AUDIT_FAIL_CLOSED": c.Audit.FailClosed,
"AUDIT_STORE_TRANSCRIPTS": c.Audit.StoreTranscripts, "AUDIT_STORE_TRANSCRIPT_DELTAS": c.Audit.StoreTranscriptDeltas,
"AUDIT_STORE_RAW_TRANSCRIPTS": c.Audit.StoreRawTranscripts, "AUDIT_STORE_REDACTED_TRANSCRIPTS": c.Audit.StoreRedactedTranscripts,
"AUDIT_STORE_TOOL_ARGS": c.Audit.StoreToolArgs, "AUDIT_STORE_TOOL_RESULTS": c.Audit.StoreToolResults,
"AUDIT_STORE_KB_RESULTS": c.Audit.StoreKBResults, "AUDIT_STORE_PROVIDER_EVENTS": c.Audit.StoreProviderEvents, "AUDIT_STORE_MEDIA_STATS": c.Audit.StoreMediaStats,
"AUDIT_MAX_TRANSCRIPT_CHARS": c.Audit.MaxTranscriptChars, "AUDIT_MAX_TOOL_ARG_CHARS": c.Audit.MaxToolArgChars,
"AUDIT_MAX_TOOL_RESULT_CHARS": c.Audit.MaxToolResultChars, "AUDIT_MAX_EVENT_METADATA_CHARS": c.Audit.MaxEventMetadataChars,
"AUDIT_RETENTION_DAYS": c.Audit.RetentionDays, "TRANSCRIPT_RETENTION_DAYS": c.Audit.TranscriptRetentionDays,
"TOOL_AUDIT_RETENTION_DAYS": c.Audit.ToolAuditRetentionDays, "ERROR_AUDIT_RETENTION_DAYS": c.Audit.ErrorAuditRetentionDays,
"AUDIT_EXPORT_MAX_EVENTS": c.Audit.ExportMaxEvents, "AUDIT_REDACTION_ENABLED": c.Audit.RedactionEnabled, "AUDIT_REDACTION_STRICT": c.Audit.RedactionStrict,
"AUDIT_LOG_FULL_PHONE": c.Audit.LogFullPhone, "AUDIT_LOG_FULL_IIN": c.Audit.LogFullIIN, "AUDIT_LOG_FULL_CARD": c.Audit.LogFullCard,
}
}