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, } }