277 lines
13 KiB
Go
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,
|
|
}
|
|
}
|