sync: migrate ai-operator to Gitea (2026-08-10)
This commit is contained in:
@@ -0,0 +1,276 @@
|
||||
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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user