{"repo": "211840040/ai-interview", "files": {"app/src/main/resources/application.yml": {"f63e2a6e90face496a13ceeb6ffb2de3ab77bc62": {"t": 1785745254.351818, "n": 11156, "h": "b84146e1fafa6d02", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n config:\n import: optional:classpath:voice-interview-opening.yml\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n\n # Spring AI 配置(chat + embedding 统一由 app.ai.providers 驱动,不使用自动配置)\n ai:\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n default-embedding-provider: dashscope\n embedding-dimensions: ${APP_AI_EMBEDDING_DIMENSIONS:1024}\n security:\n api-key-encryption-key: ${APP_AI_CONFIG_ENCRYPTION_KEY:}\n require-encryption-key: ${APP_AI_CONFIG_REQUIRE_ENCRYPTION_KEY:false}\n # 运行时可写的 Provider 配置落点(与 classpath 主 application.yml 隔离)。\n # 开发环境默认写到用户主目录下,避免污染源码目录或 jar 内 classpath 资源。\n config-yaml-path: ${APP_AI_CONFIG_YAML_PATH:${user.home}/.interview-guide/llm-providers.yml}\n config-env-path: ${APP_AI_CONFIG_ENV_PATH:${user.home}/.interview-guide/llm-providers.env}\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode/v1\n api-key: ${AI_BAILIAN_API_KEY}\n model: ${AI_MODEL:qwen3.5-flash}\n embedding-model: text-embedding-v3\n embedding-dimensions: 1024\n supports-embedding: true\n lmstudio:\n base-url: http://localhost:1234\n api-key: ${PROVIDER_LMSTUDIO_API_KEY:lm-studio}\n model: qwen2.5-7b-instruct\n supports-embedding: false\n # ===== 预设 Provider(填完 API Key 后即可使用)=====\n # Moonshot AI / Kimi(OpenAI 兼容) https://platform.moonshot.cn/\n kimi:\n base-url: https://api.moonshot.cn/v1\n api-key: ${PROVIDER_KIMI_API_KEY:}\n model: ${PROVIDER_KIMI_MODEL:kimi-latest}\n temperature: 1\n supports-embedding: false\n # DeepSeek(OpenAI 兼容) https://api-docs.deepseek.com/\n deepseek:\n base-url: https://api.deepseek.com\n api-key: ${PROVIDER_DEEPSEEK_API_KEY:}\n model: ${PROVIDER_DEEPSEEK_MODEL:deepseek-v4-flash}\n supports-embedding: false\n # 智谱 AI / GLM(OpenAI 兼容) https://open.bigmodel.cn/\n glm:\n base-url: https://open.bigmodel.cn/api/coding/paas/v4\n api-key: ${PROVIDER_GLM_API_KEY:}\n model: ${PROVIDER_GLM_MODEL:glm-5}\n embedding-model: embedding-3\n embedding-dimensions: 1024\n supports-embedding: true\n advisors:\n enabled: ${APP_AI_ADVISORS_ENABLED:true}\n tool-call-enabled: ${APP_AI_ADVISORS_TOOL_CALL_ENABLED:true}\n tool-call-conversation-history-enabled: ${APP_AI_ADVISORS_TOOL_CALL_CONVERSATION_HISTORY_ENABLED:false}\n stream-tool-call-responses: ${APP_AI_ADVISORS_STREAM_TOOL_CALL_RESPONSES:false}\n message-chat-memory-enabled: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_ENABLED:false}\n message-chat-memory-max-messages: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_MAX_MESSAGES:120}\n simple-logger-enabled: ${APP_AI_ADVISORS_SIMPLE_LOGGER_ENABLED:false}\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n # 是否启用“修复型重试提示词”(关闭后每次重试沿用原始 system prompt)\n structured-retry-use-repair-prompt: ${APP_AI_STRUCTURED_RETRY_USE_REPAIR_PROMPT:true}\n # 修复型重试提示词中是否追加严格 JSON 指令\n structured-retry-append-strict-json-instruction: ${APP_AI_STRUCTURED_RETRY_APPEND_STRICT_JSON_INSTRUCTION:true}\n # 注入到重试提示词中的错误信息最大长度\n structured-error-message-max-length: ${APP_AI_STRUCTURED_ERROR_MESSAGE_MAX_LENGTH:200}\n # 是否开启结构化输出调用指标(invocations/attempts/latency)\n structured-metrics-enabled: ${APP_AI_STRUCTURED_METRICS_ENABLED:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:rustfsadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:rustfsadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n\n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;中文面试思考停顿常见 2-3s,设 2000 避免句中切段\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:2000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;需大于 VAD 静音阈值以确保用户继续说话时 partials 能取消\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:2500}\n # 触发提交前要求的最小静音时长(毫秒),从最后一次 STT 活动(含 partial)算起\n min-silence-before-commit-ms: ${APP_VOICE_MIN_SILENCE_BEFORE_COMMIT_MS:2500}\n # 当内容较短时先不提交,等待继续说(字符数)\n min-commit-chars: ${APP_VOICE_MIN_COMMIT_CHARS:20}\n # 最长等待用户继续补充的时间(毫秒),超时后强制提交\n max-wait-for-continuation-ms: ${APP_VOICE_MAX_WAIT_FOR_CONTINUATION_MS:7000}\n # 语音面试单轮面试官回复最大长度(字符)\n ai-question-max-chars: ${APP_VOICE_AI_QUESTION_MAX_CHARS:120}\n # 是否按句子边合成边推送语音;开启后首段语音不用等待完整回复生成结束\n chunked-audio-enabled: ${APP_VOICE_CHUNKED_AUDIO_ENABLED:true}\n # 单句 TTS 合成超时,避免某一句卡住整轮播放\n tts-timeout-seconds: ${APP_VOICE_TTS_TIMEOUT_SECONDS:8}\n # 单会话并发 TTS 上限,控制首段语音速度和服务连接压力\n max-concurrent-tts-per-session: ${APP_VOICE_MAX_CONCURRENT_TTS_PER_SESSION:3}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "af0dcc253a75ff0d441247f418bdcddff703b34f": {"t": 1785749290.8197901, "n": 11181, "h": "d80decf22f69bf2f", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n config:\n import: optional:classpath:voice-interview-opening.yml\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI 配置(chat + embedding 统一由 app.ai.providers 驱动,不使用自动配置)\n ai:\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n default-embedding-provider: dashscope\n embedding-dimensions: ${APP_AI_EMBEDDING_DIMENSIONS:1024}\n security:\n api-key-encryption-key: ${APP_AI_CONFIG_ENCRYPTION_KEY:}\n require-encryption-key: ${APP_AI_CONFIG_REQUIRE_ENCRYPTION_KEY:false}\n # 运行时可写的 Provider 配置落点(与 classpath 主 application.yml 隔离)。\n # 开发环境默认写到用户主目录下,避免污染源码目录或 jar 内 classpath 资源。\n config-yaml-path: ${APP_AI_CONFIG_YAML_PATH:${user.home}/.interview-guide/llm-providers.yml}\n config-env-path: ${APP_AI_CONFIG_ENV_PATH:${user.home}/.interview-guide/llm-providers.env}\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode/v1\n api-key: ${AI_BAILIAN_API_KEY}\n model: ${AI_MODEL:qwen3.5-flash}\n embedding-model: text-embedding-v3\n embedding-dimensions: 1024\n supports-embedding: true\n lmstudio:\n base-url: http://localhost:1234\n api-key: ${PROVIDER_LMSTUDIO_API_KEY:lm-studio}\n model: qwen2.5-7b-instruct\n supports-embedding: false\n # ===== 预设 Provider(填完 API Key 后即可使用)=====\n # Moonshot AI / Kimi(OpenAI 兼容) https://platform.moonshot.cn/\n kimi:\n base-url: https://api.moonshot.cn/v1\n api-key: ${PROVIDER_KIMI_API_KEY:}\n model: ${PROVIDER_KIMI_MODEL:kimi-latest}\n temperature: 1\n supports-embedding: false\n # DeepSeek(OpenAI 兼容) https://api-docs.deepseek.com/\n deepseek:\n base-url: https://api.deepseek.com\n api-key: ${PROVIDER_DEEPSEEK_API_KEY:}\n model: ${PROVIDER_DEEPSEEK_MODEL:deepseek-v4-flash}\n supports-embedding: false\n # 智谱 AI / GLM(OpenAI 兼容) https://open.bigmodel.cn/\n glm:\n base-url: https://open.bigmodel.cn/api/coding/paas/v4\n api-key: ${PROVIDER_GLM_API_KEY:}\n model: ${PROVIDER_GLM_MODEL:glm-5}\n embedding-model: embedding-3\n embedding-dimensions: 1024\n supports-embedding: true\n advisors:\n enabled: ${APP_AI_ADVISORS_ENABLED:true}\n tool-call-enabled: ${APP_AI_ADVISORS_TOOL_CALL_ENABLED:true}\n tool-call-conversation-history-enabled: ${APP_AI_ADVISORS_TOOL_CALL_CONVERSATION_HISTORY_ENABLED:false}\n stream-tool-call-responses: ${APP_AI_ADVISORS_STREAM_TOOL_CALL_RESPONSES:false}\n message-chat-memory-enabled: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_ENABLED:false}\n message-chat-memory-max-messages: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_MAX_MESSAGES:120}\n simple-logger-enabled: ${APP_AI_ADVISORS_SIMPLE_LOGGER_ENABLED:false}\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n # 是否启用“修复型重试提示词”(关闭后每次重试沿用原始 system prompt)\n structured-retry-use-repair-prompt: ${APP_AI_STRUCTURED_RETRY_USE_REPAIR_PROMPT:true}\n # 修复型重试提示词中是否追加严格 JSON 指令\n structured-retry-append-strict-json-instruction: ${APP_AI_STRUCTURED_RETRY_APPEND_STRICT_JSON_INSTRUCTION:true}\n # 注入到重试提示词中的错误信息最大长度\n structured-error-message-max-length: ${APP_AI_STRUCTURED_ERROR_MESSAGE_MAX_LENGTH:200}\n # 是否开启结构化输出调用指标(invocations/attempts/latency)\n structured-metrics-enabled: ${APP_AI_STRUCTURED_METRICS_ENABLED:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;中文面试思考停顿常见 2-3s,设 2000 避免句中切段\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:2000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;需大于 VAD 静音阈值以确保用户继续说话时 partials 能取消\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:2500}\n # 触发提交前要求的最小静音时长(毫秒),从最后一次 STT 活动(含 partial)算起\n min-silence-before-commit-ms: ${APP_VOICE_MIN_SILENCE_BEFORE_COMMIT_MS:2500}\n # 当内容较短时先不提交,等待继续说(字符数)\n min-commit-chars: ${APP_VOICE_MIN_COMMIT_CHARS:20}\n # 最长等待用户继续补充的时间(毫秒),超时后强制提交\n max-wait-for-continuation-ms: ${APP_VOICE_MAX_WAIT_FOR_CONTINUATION_MS:7000}\n # 语音面试单轮面试官回复最大长度(字符)\n ai-question-max-chars: ${APP_VOICE_AI_QUESTION_MAX_CHARS:120}\n # 是否按句子边合成边推送语音;开启后首段语音不用等待完整回复生成结束\n chunked-audio-enabled: ${APP_VOICE_CHUNKED_AUDIO_ENABLED:true}\n # 单句 TTS 合成超时,避免某一句卡住整轮播放\n tts-timeout-seconds: ${APP_VOICE_TTS_TIMEOUT_SECONDS:8}\n # 单会话并发 TTS 上限,控制首段语音速度和服务连接压力\n max-concurrent-tts-per-session: ${APP_VOICE_MAX_CONCURRENT_TTS_PER_SESSION:3}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "4f6ec567698197d1ff8f0e146c935a4b4e1f6824": {"t": 1785749291.9471583, "n": 10867, "h": "c890fd6ba31c51f7", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n config:\n import: optional:classpath:voice-interview-opening.yml\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI 配置(chat + embedding 统一由 app.ai.providers 驱动,不使用自动配置)\n ai:\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n default-embedding-provider: dashscope\n embedding-dimensions: ${APP_AI_EMBEDDING_DIMENSIONS:1024}\n security:\n api-key-encryption-key: ${APP_AI_CONFIG_ENCRYPTION_KEY:}\n require-encryption-key: ${APP_AI_CONFIG_REQUIRE_ENCRYPTION_KEY:false}\n # 运行时可写的 Provider 配置落点(与 classpath 主 application.yml 隔离)。\n # 开发环境默认写到用户主目录下,避免污染源码目录或 jar 内 classpath 资源。\n config-yaml-path: ${APP_AI_CONFIG_YAML_PATH:${user.home}/.interview-guide/llm-providers.yml}\n config-env-path: ${APP_AI_CONFIG_ENV_PATH:${user.home}/.interview-guide/llm-providers.env}\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode/v1\n api-key: ${AI_BAILIAN_API_KEY}\n model: ${AI_MODEL:qwen3.5-flash}\n embedding-model: text-embedding-v3\n embedding-dimensions: 1024\n supports-embedding: true\n lmstudio:\n base-url: http://localhost:1234\n api-key: ${PROVIDER_LMSTUDIO_API_KEY:lm-studio}\n model: qwen2.5-7b-instruct\n supports-embedding: false\n # ===== 预设 Provider(填完 API Key 后即可使用)=====\n # Moonshot AI / Kimi(OpenAI 兼容) https://platform.moonshot.cn/\n kimi:\n base-url: https://api.moonshot.cn/v1\n api-key: ${PROVIDER_KIMI_API_KEY:}\n model: ${PROVIDER_KIMI_MODEL:kimi-latest}\n temperature: 1\n supports-embedding: false\n # DeepSeek(OpenAI 兼容) https://api-docs.deepseek.com/\n deepseek:\n base-url: https://api.deepseek.com\n api-key: ${PROVIDER_DEEPSEEK_API_KEY:}\n model: ${PROVIDER_DEEPSEEK_MODEL:deepseek-v4-flash}\n supports-embedding: false\n # 智谱 AI / GLM(OpenAI 兼容) https://open.bigmodel.cn/\n glm:\n base-url: https://open.bigmodel.cn/api/coding/paas/v4\n api-key: ${PROVIDER_GLM_API_KEY:}\n model: ${PROVIDER_GLM_MODEL:glm-5}\n embedding-model: embedding-3\n embedding-dimensions: 1024\n supports-embedding: true\n advisors:\n enabled: ${APP_AI_ADVISORS_ENABLED:true}\n tool-call-enabled: ${APP_AI_ADVISORS_TOOL_CALL_ENABLED:true}\n tool-call-conversation-history-enabled: ${APP_AI_ADVISORS_TOOL_CALL_CONVERSATION_HISTORY_ENABLED:false}\n stream-tool-call-responses: ${APP_AI_ADVISORS_STREAM_TOOL_CALL_RESPONSES:false}\n message-chat-memory-enabled: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_ENABLED:false}\n message-chat-memory-max-messages: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_MAX_MESSAGES:120}\n simple-logger-enabled: ${APP_AI_ADVISORS_SIMPLE_LOGGER_ENABLED:false}\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n # 是否启用“修复型重试提示词”(关闭后每次重试沿用原始 system prompt)\n structured-retry-use-repair-prompt: ${APP_AI_STRUCTURED_RETRY_USE_REPAIR_PROMPT:true}\n # 修复型重试提示词中是否追加严格 JSON 指令\n structured-retry-append-strict-json-instruction: ${APP_AI_STRUCTURED_RETRY_APPEND_STRICT_JSON_INSTRUCTION:true}\n # 注入到重试提示词中的错误信息最大长度\n structured-error-message-max-length: ${APP_AI_STRUCTURED_ERROR_MESSAGE_MAX_LENGTH:200}\n # 是否开启结构化输出调用指标(invocations/attempts/latency)\n structured-metrics-enabled: ${APP_AI_STRUCTURED_METRICS_ENABLED:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;中文面试思考停顿常见 2-3s,设 2000 避免句中切段\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:2000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;需大于 VAD 静音阈值以确保用户继续说话时 partials 能取消\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:2500}\n # 触发提交前要求的最小静音时长(毫秒),从最后一次 STT 活动(含 partial)算起\n min-silence-before-commit-ms: ${APP_VOICE_MIN_SILENCE_BEFORE_COMMIT_MS:2500}\n # 当内容较短时先不提交,等待继续说(字符数)\n min-commit-chars: ${APP_VOICE_MIN_COMMIT_CHARS:20}\n # 最长等待用户继续补充的时间(毫秒),超时后强制提交\n max-wait-for-continuation-ms: ${APP_VOICE_MAX_WAIT_FOR_CONTINUATION_MS:7000}\n # 语音面试单轮面试官回复最大长度(字符)\n ai-question-max-chars: ${APP_VOICE_AI_QUESTION_MAX_CHARS:120}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "0d34b4a45af7c99e3c8487f3769aeb60048b4059": {"t": 1785749293.086037, "n": 10735, "h": "d4936f65f5c4119f", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n config:\n import: optional:classpath:voice-interview-opening.yml\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI 配置(chat + embedding 统一由 app.ai.providers 驱动,不使用自动配置)\n ai:\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n default-embedding-provider: dashscope\n security:\n api-key-encryption-key: ${APP_AI_CONFIG_ENCRYPTION_KEY:}\n require-encryption-key: ${APP_AI_CONFIG_REQUIRE_ENCRYPTION_KEY:false}\n # 运行时可写的 Provider 配置落点(与 classpath 主 application.yml 隔离)。\n # 开发环境默认写到用户主目录下,避免污染源码目录或 jar 内 classpath 资源。\n config-yaml-path: ${APP_AI_CONFIG_YAML_PATH:${user.home}/.interview-guide/llm-providers.yml}\n config-env-path: ${APP_AI_CONFIG_ENV_PATH:${user.home}/.interview-guide/llm-providers.env}\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode/v1\n api-key: ${AI_BAILIAN_API_KEY}\n model: ${AI_MODEL:qwen3.5-flash}\n embedding-model: text-embedding-v3\n supports-embedding: true\n lmstudio:\n base-url: http://localhost:1234\n api-key: ${PROVIDER_LMSTUDIO_API_KEY:lm-studio}\n model: qwen2.5-7b-instruct\n supports-embedding: false\n # ===== 预设 Provider(填完 API Key 后即可使用)=====\n # Moonshot AI / Kimi(OpenAI 兼容) https://platform.moonshot.cn/\n kimi:\n base-url: https://api.moonshot.cn/v1\n api-key: ${PROVIDER_KIMI_API_KEY:}\n model: ${PROVIDER_KIMI_MODEL:kimi-latest}\n temperature: 1\n supports-embedding: false\n # DeepSeek(OpenAI 兼容) https://api-docs.deepseek.com/\n deepseek:\n base-url: https://api.deepseek.com\n api-key: ${PROVIDER_DEEPSEEK_API_KEY:}\n model: ${PROVIDER_DEEPSEEK_MODEL:deepseek-v4-flash}\n supports-embedding: false\n # 智谱 AI / GLM(OpenAI 兼容) https://open.bigmodel.cn/\n glm:\n base-url: https://open.bigmodel.cn/api/coding/paas/v4\n api-key: ${PROVIDER_GLM_API_KEY:}\n model: ${PROVIDER_GLM_MODEL:glm-5}\n embedding-model: embedding-3\n supports-embedding: true\n advisors:\n enabled: ${APP_AI_ADVISORS_ENABLED:true}\n tool-call-enabled: ${APP_AI_ADVISORS_TOOL_CALL_ENABLED:true}\n tool-call-conversation-history-enabled: ${APP_AI_ADVISORS_TOOL_CALL_CONVERSATION_HISTORY_ENABLED:false}\n stream-tool-call-responses: ${APP_AI_ADVISORS_STREAM_TOOL_CALL_RESPONSES:false}\n message-chat-memory-enabled: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_ENABLED:false}\n message-chat-memory-max-messages: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_MAX_MESSAGES:120}\n simple-logger-enabled: ${APP_AI_ADVISORS_SIMPLE_LOGGER_ENABLED:false}\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n # 是否启用“修复型重试提示词”(关闭后每次重试沿用原始 system prompt)\n structured-retry-use-repair-prompt: ${APP_AI_STRUCTURED_RETRY_USE_REPAIR_PROMPT:true}\n # 修复型重试提示词中是否追加严格 JSON 指令\n structured-retry-append-strict-json-instruction: ${APP_AI_STRUCTURED_RETRY_APPEND_STRICT_JSON_INSTRUCTION:true}\n # 注入到重试提示词中的错误信息最大长度\n structured-error-message-max-length: ${APP_AI_STRUCTURED_ERROR_MESSAGE_MAX_LENGTH:200}\n # 是否开启结构化输出调用指标(invocations/attempts/latency)\n structured-metrics-enabled: ${APP_AI_STRUCTURED_METRICS_ENABLED:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;中文面试思考停顿常见 2-3s,设 2000 避免句中切段\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:2000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;需大于 VAD 静音阈值以确保用户继续说话时 partials 能取消\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:2500}\n # 触发提交前要求的最小静音时长(毫秒),从最后一次 STT 活动(含 partial)算起\n min-silence-before-commit-ms: ${APP_VOICE_MIN_SILENCE_BEFORE_COMMIT_MS:2500}\n # 当内容较短时先不提交,等待继续说(字符数)\n min-commit-chars: ${APP_VOICE_MIN_COMMIT_CHARS:20}\n # 最长等待用户继续补充的时间(毫秒),超时后强制提交\n max-wait-for-continuation-ms: ${APP_VOICE_MAX_WAIT_FOR_CONTINUATION_MS:7000}\n # 语音面试单轮面试官回复最大长度(字符)\n ai-question-max-chars: ${APP_VOICE_AI_QUESTION_MAX_CHARS:120}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "c2322267c9e711a26c8688d014bed037d13d6533": {"t": 1785749294.1872084, "n": 10372, "h": "b37c798eb177ea13", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n config:\n import: optional:classpath:voice-interview-opening.yml\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI 配置(chat + embedding 统一由 app.ai.providers 驱动,不使用自动配置)\n ai:\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n # 运行时可写的 Provider 配置落点(与 classpath 主 application.yml 隔离)。\n # 开发环境默认写到用户主目录下,避免污染源码目录或 jar 内 classpath 资源。\n config-yaml-path: ${APP_AI_CONFIG_YAML_PATH:${user.home}/.interview-guide/llm-providers.yml}\n config-env-path: ${APP_AI_CONFIG_ENV_PATH:${user.home}/.interview-guide/llm-providers.env}\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode/v1\n api-key: ${AI_BAILIAN_API_KEY}\n model: ${AI_MODEL:qwen3.5-flash}\n embedding-model: text-embedding-v3\n lmstudio:\n base-url: http://localhost:1234\n api-key: ${PROVIDER_LMSTUDIO_API_KEY:lm-studio}\n model: qwen2.5-7b-instruct\n # ===== 预设 Provider(填完 API Key 后即可使用)=====\n # Moonshot AI / Kimi(OpenAI 兼容) https://platform.moonshot.cn/\n kimi:\n base-url: https://api.moonshot.cn/v1\n api-key: ${PROVIDER_KIMI_API_KEY:}\n model: ${PROVIDER_KIMI_MODEL:kimi-latest}\n temperature: 1\n # DeepSeek(OpenAI 兼容) https://api-docs.deepseek.com/\n deepseek:\n base-url: https://api.deepseek.com\n api-key: ${PROVIDER_DEEPSEEK_API_KEY:}\n model: ${PROVIDER_DEEPSEEK_MODEL:deepseek-v4-flash}\n # 智谱 AI / GLM(OpenAI 兼容) https://open.bigmodel.cn/\n glm:\n base-url: https://open.bigmodel.cn/api/coding/paas/v4\n api-key: ${PROVIDER_GLM_API_KEY:}\n model: ${PROVIDER_GLM_MODEL:glm-5}\n embedding-model: embedding-3\n advisors:\n enabled: ${APP_AI_ADVISORS_ENABLED:true}\n tool-call-enabled: ${APP_AI_ADVISORS_TOOL_CALL_ENABLED:true}\n tool-call-conversation-history-enabled: ${APP_AI_ADVISORS_TOOL_CALL_CONVERSATION_HISTORY_ENABLED:false}\n stream-tool-call-responses: ${APP_AI_ADVISORS_STREAM_TOOL_CALL_RESPONSES:false}\n message-chat-memory-enabled: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_ENABLED:false}\n message-chat-memory-max-messages: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_MAX_MESSAGES:120}\n simple-logger-enabled: ${APP_AI_ADVISORS_SIMPLE_LOGGER_ENABLED:false}\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n # 是否启用“修复型重试提示词”(关闭后每次重试沿用原始 system prompt)\n structured-retry-use-repair-prompt: ${APP_AI_STRUCTURED_RETRY_USE_REPAIR_PROMPT:true}\n # 修复型重试提示词中是否追加严格 JSON 指令\n structured-retry-append-strict-json-instruction: ${APP_AI_STRUCTURED_RETRY_APPEND_STRICT_JSON_INSTRUCTION:true}\n # 注入到重试提示词中的错误信息最大长度\n structured-error-message-max-length: ${APP_AI_STRUCTURED_ERROR_MESSAGE_MAX_LENGTH:200}\n # 是否开启结构化输出调用指标(invocations/attempts/latency)\n structured-metrics-enabled: ${APP_AI_STRUCTURED_METRICS_ENABLED:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;中文面试思考停顿常见 2-3s,设 2000 避免句中切段\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:2000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;需大于 VAD 静音阈值以确保用户继续说话时 partials 能取消\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:2500}\n # 触发提交前要求的最小静音时长(毫秒),从最后一次 STT 活动(含 partial)算起\n min-silence-before-commit-ms: ${APP_VOICE_MIN_SILENCE_BEFORE_COMMIT_MS:2500}\n # 当内容较短时先不提交,等待继续说(字符数)\n min-commit-chars: ${APP_VOICE_MIN_COMMIT_CHARS:20}\n # 最长等待用户继续补充的时间(毫秒),超时后强制提交\n max-wait-for-continuation-ms: ${APP_VOICE_MAX_WAIT_FOR_CONTINUATION_MS:7000}\n # 语音面试单轮面试官回复最大长度(字符)\n ai-question-max-chars: ${APP_VOICE_AI_QUESTION_MAX_CHARS:120}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "28e97a3212fa886388f8ec218da2110968bbbf4a": {"t": 1785749295.4437547, "n": 10153, "h": "f15d19c0a097d1cf", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n config:\n import: optional:classpath:voice-interview-opening.yml\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI 配置(chat + embedding 统一由 app.ai.providers 驱动,不使用自动配置)\n ai:\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n # 运行时可写的 Provider 配置落点(与 classpath 主 application.yml 隔离)。\n # 开发环境默认写到用户主目录下,避免污染源码目录或 jar 内 classpath 资源。\n config-yaml-path: ${APP_AI_CONFIG_YAML_PATH:${user.home}/.interview-guide/llm-providers.yml}\n config-env-path: ${APP_AI_CONFIG_ENV_PATH:${user.home}/.interview-guide/llm-providers.env}\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode/v1\n api-key: ${AI_BAILIAN_API_KEY}\n model: ${AI_MODEL:qwen3.5-flash}\n embedding-model: text-embedding-v3\n lmstudio:\n base-url: http://localhost:1234\n api-key: ${PROVIDER_LMSTUDIO_API_KEY:lm-studio}\n model: qwen2.5-7b-instruct\n # ===== 预设 Provider(填完 API Key 后即可使用)=====\n # Moonshot AI / Kimi(OpenAI 兼容) https://platform.moonshot.cn/\n kimi:\n base-url: https://api.moonshot.cn/v1\n api-key: ${PROVIDER_KIMI_API_KEY:}\n model: ${PROVIDER_KIMI_MODEL:kimi-latest}\n temperature: 1\n # 智谱 AI / GLM(OpenAI 兼容) https://open.bigmodel.cn/\n glm:\n base-url: https://open.bigmodel.cn/api/coding/paas/v4\n api-key: ${PROVIDER_GLM_API_KEY:}\n model: ${PROVIDER_GLM_MODEL:glm-4-flash}\n embedding-model: embedding-3\n advisors:\n enabled: ${APP_AI_ADVISORS_ENABLED:true}\n tool-call-enabled: ${APP_AI_ADVISORS_TOOL_CALL_ENABLED:true}\n tool-call-conversation-history-enabled: ${APP_AI_ADVISORS_TOOL_CALL_CONVERSATION_HISTORY_ENABLED:false}\n stream-tool-call-responses: ${APP_AI_ADVISORS_STREAM_TOOL_CALL_RESPONSES:false}\n message-chat-memory-enabled: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_ENABLED:false}\n message-chat-memory-max-messages: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_MAX_MESSAGES:120}\n simple-logger-enabled: ${APP_AI_ADVISORS_SIMPLE_LOGGER_ENABLED:false}\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n # 是否启用“修复型重试提示词”(关闭后每次重试沿用原始 system prompt)\n structured-retry-use-repair-prompt: ${APP_AI_STRUCTURED_RETRY_USE_REPAIR_PROMPT:true}\n # 修复型重试提示词中是否追加严格 JSON 指令\n structured-retry-append-strict-json-instruction: ${APP_AI_STRUCTURED_RETRY_APPEND_STRICT_JSON_INSTRUCTION:true}\n # 注入到重试提示词中的错误信息最大长度\n structured-error-message-max-length: ${APP_AI_STRUCTURED_ERROR_MESSAGE_MAX_LENGTH:200}\n # 是否开启结构化输出调用指标(invocations/attempts/latency)\n structured-metrics-enabled: ${APP_AI_STRUCTURED_METRICS_ENABLED:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;中文面试思考停顿常见 2-3s,设 2000 避免句中切段\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:2000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;需大于 VAD 静音阈值以确保用户继续说话时 partials 能取消\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:2500}\n # 触发提交前要求的最小静音时长(毫秒),从最后一次 STT 活动(含 partial)算起\n min-silence-before-commit-ms: ${APP_VOICE_MIN_SILENCE_BEFORE_COMMIT_MS:2500}\n # 当内容较短时先不提交,等待继续说(字符数)\n min-commit-chars: ${APP_VOICE_MIN_COMMIT_CHARS:20}\n # 最长等待用户继续补充的时间(毫秒),超时后强制提交\n max-wait-for-continuation-ms: ${APP_VOICE_MAX_WAIT_FOR_CONTINUATION_MS:7000}\n # 语音面试单轮面试官回复最大长度(字符)\n ai-question-max-chars: ${APP_VOICE_AI_QUESTION_MAX_CHARS:120}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "26b6e1aeebcbb5e7cfe8d750849b6e0c49f05b8d": {"t": 1785749296.726112, "n": 9641, "h": "78f37b31c8790d04", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n config:\n import: optional:classpath:voice-interview-opening.yml\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n model: qwen-plus\n lmstudio:\n base-url: http://localhost:1234\n api-key: lm-studio\n model: qwen2.5-7b-instruct\n advisors:\n enabled: ${APP_AI_ADVISORS_ENABLED:true}\n tool-call-enabled: ${APP_AI_ADVISORS_TOOL_CALL_ENABLED:true}\n tool-call-conversation-history-enabled: ${APP_AI_ADVISORS_TOOL_CALL_CONVERSATION_HISTORY_ENABLED:false}\n stream-tool-call-responses: ${APP_AI_ADVISORS_STREAM_TOOL_CALL_RESPONSES:false}\n message-chat-memory-enabled: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_ENABLED:false}\n message-chat-memory-max-messages: ${APP_AI_ADVISORS_MESSAGE_CHAT_MEMORY_MAX_MESSAGES:120}\n simple-logger-enabled: ${APP_AI_ADVISORS_SIMPLE_LOGGER_ENABLED:false}\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n # 是否启用“修复型重试提示词”(关闭后每次重试沿用原始 system prompt)\n structured-retry-use-repair-prompt: ${APP_AI_STRUCTURED_RETRY_USE_REPAIR_PROMPT:true}\n # 修复型重试提示词中是否追加严格 JSON 指令\n structured-retry-append-strict-json-instruction: ${APP_AI_STRUCTURED_RETRY_APPEND_STRICT_JSON_INSTRUCTION:true}\n # 注入到重试提示词中的错误信息最大长度\n structured-error-message-max-length: ${APP_AI_STRUCTURED_ERROR_MESSAGE_MAX_LENGTH:200}\n # 是否开启结构化输出调用指标(invocations/attempts/latency)\n structured-metrics-enabled: ${APP_AI_STRUCTURED_METRICS_ENABLED:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;中文面试思考停顿常见 2-3s,设 2000 避免句中切段\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:2000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;需大于 VAD 静音阈值以确保用户继续说话时 partials 能取消\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:2500}\n # 触发提交前要求的最小静音时长(毫秒),从最后一次 STT 活动(含 partial)算起\n min-silence-before-commit-ms: ${APP_VOICE_MIN_SILENCE_BEFORE_COMMIT_MS:2500}\n # 当内容较短时先不提交,等待继续说(字符数)\n min-commit-chars: ${APP_VOICE_MIN_COMMIT_CHARS:20}\n # 最长等待用户继续补充的时间(毫秒),超时后强制提交\n max-wait-for-continuation-ms: ${APP_VOICE_MAX_WAIT_FOR_CONTINUATION_MS:7000}\n # 语音面试单轮面试官回复最大长度(字符)\n ai-question-max-chars: ${APP_VOICE_AI_QUESTION_MAX_CHARS:120}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "b7411ee9e962e18bdd9cd1962b961d9bb7be2086": {"t": 1785749297.846117, "n": 8533, "h": "83a672f6df9e0ee1", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n config:\n import: optional:classpath:voice-interview-opening.yml\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n model: qwen-plus\n lmstudio:\n base-url: http://localhost:1234\n api-key: lm-studio\n model: qwen2.5-7b-instruct\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;中文面试思考停顿常见 2-3s,设 2000 避免句中切段\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:2000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;需大于 VAD 静音阈值以确保用户继续说话时 partials 能取消\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:2500}\n # 触发提交前要求的最小静音时长(毫秒),从最后一次 STT 活动(含 partial)算起\n min-silence-before-commit-ms: ${APP_VOICE_MIN_SILENCE_BEFORE_COMMIT_MS:2500}\n # 当内容较短时先不提交,等待继续说(字符数)\n min-commit-chars: ${APP_VOICE_MIN_COMMIT_CHARS:20}\n # 最长等待用户继续补充的时间(毫秒),超时后强制提交\n max-wait-for-continuation-ms: ${APP_VOICE_MAX_WAIT_FOR_CONTINUATION_MS:7000}\n # 语音面试单轮面试官回复最大长度(字符)\n ai-question-max-chars: ${APP_VOICE_AI_QUESTION_MAX_CHARS:120}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "f87f4358fdcdcc6acfe2259195bd9c6b10e752af": {"t": 1785749298.9934838, "n": 8479, "h": "cd9ac43c0c7abef6", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n config:\n import: optional:classpath:voice-interview-opening.yml\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n model: qwen-plus\n lmstudio:\n base-url: http://localhost:1234\n api-key: lm-studio\n model: qwen2.5-7b-instruct\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;400 容易在句中停顿处切开,建议 900–1200\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:1000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;过短会一句一答很碎\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:900}\n # 触发提交前要求的最小静音时长(毫秒)\n min-silence-before-commit-ms: ${APP_VOICE_MIN_SILENCE_BEFORE_COMMIT_MS:1400}\n # 当内容较短且无句末标点时,先不提交,等待继续说\n min-commit-chars: ${APP_VOICE_MIN_COMMIT_CHARS:12}\n # 最长等待用户继续补充的时间(毫秒),超时后强制提交\n max-wait-for-continuation-ms: ${APP_VOICE_MAX_WAIT_FOR_CONTINUATION_MS:4500}\n # 语音面试单轮面试官回复最大长度(字符)\n ai-question-max-chars: ${APP_VOICE_AI_QUESTION_MAX_CHARS:120}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "884855d3894d01594ba1649076fd2ee97f50de9a": {"t": 1785749300.1090002, "n": 8015, "h": "417200dea6ce3ba6", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n agent-utils:\n skills-root: ${APP_AI_AGENT_UTILS_SKILLS_ROOT:classpath:skills}\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n model: qwen-plus\n lmstudio:\n base-url: http://localhost:1234\n api-key: lm-studio\n model: qwen2.5-7b-instruct\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;400 容易在句中停顿处切开,建议 900–1200\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:1000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;过短会一句一答很碎\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:1600}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds\n"}, "a38dc2594a3e8211fbd2eac64df655142c9044ae": {"t": 1785749301.2045856, "n": 7927, "h": "f2ba54c7956ec984", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n model: qwen-plus\n lmstudio:\n base-url: http://localhost:1234\n api-key: lm-studio\n model: qwen2.5-7b-instruct\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;400 容易在句中停顿处切开,建议 900–1200\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:1000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;过短会一句一答很碎\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:1600}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds"}, "730cbcc68f9b0bf1249e5c025ecf0afa7c0359b7": {"t": 1785749302.272681, "n": 3806, "h": "50efc33ec8613dbe", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\n# SpringDoc OpenAPI / Swagger配置\nspringdoc:\n swagger-ui:\n path: /swagger-ui.html\n tags-sorter: alpha\n operations-sorter: alpha\n api-docs:\n path: /v3/api-docs\n packages-to-scan: interview.guide.modules\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}"}, "89b4d27649b094d639415a7dbd3ba63a3f135fec": {"t": 1785749303.4855692, "n": 7711, "h": "180ff9ab8f848f38", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n model: qwen-plus\n lmstudio:\n base-url: http://localhost:1234\n api-key: lm-studio\n model: qwen2.5-7b-instruct\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;400 容易在句中停顿处切开,建议 900–1200\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:1000}\n\n # Qwen TTS Realtime Configuration (WebSocket-based)\n # 音色列表文档:https://help.aliyun.com/zh/model-studio/qwen-tts-realtime\n tts:\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 24000\n mode: commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;过短会一句一答很碎\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:1600}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds"}, "f61f732fb11c63822d95d72a979c5d4a88e61bde": {"t": 1785749305.6103587, "n": 7689, "h": "a4361f1c981f68d8", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nlogging:\n charset:\n console: UTF-8\n file: UTF-8\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n # 与根目录 docker-compose.yml 中 postgres 服务默认一致(本地只起依赖容器 + bootRun 时无需改)\n password: ${POSTGRES_PASSWORD:password}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n default-provider: dashscope\n providers:\n dashscope:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n model: qwen-plus\n lmstudio:\n base-url: http://localhost:1234\n api-key: lm-studio\n model: qwen2.5-7b-instruct\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:minioadmin}\n secret-key: ${APP_STORAGE_SECRET_KEY:minioadmin}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n # 静音多久判为一句结束;400 容易在句中停顿处切开,建议 900–1200\n turn-detection-silence-duration-ms: ${APP_VOICE_ASR_SILENCE_MS:1000}\n\n # Qwen3 Realtime TTS Configuration\n tts:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 16000\n mode: server_commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # 用户说完一小段 STT 定稿后,再等多久(毫秒)才触发面试官回复;过短会一句一答很碎\n user-utterance-debounce-ms: ${APP_VOICE_USER_UTTERANCE_DEBOUNCE_MS:1600}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds"}, "e8059f8635011353df46ba583061871edfe4d5b5": {"t": 1785749306.673815, "n": 7083, "h": "a77abad9ba2d5547", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n # 明确指定HTTP响应编码\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n turn-detection-silence-duration-ms: 400\n\n # Qwen3 Realtime TTS Configuration\n tts:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 16000\n mode: server_commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds"}, "cd284f592c2e709d3af86017a61dee72383ecbfa": {"t": 1785749307.7425406, "n": 6982, "h": "bbce915e333b7dae", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Qwen3 Realtime ASR Configuration\n qwen:\n asr:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-asr-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n language: zh\n format: pcm\n sample-rate: 16000\n enable-turn-detection: true\n turn-detection-type: server_vad\n turn-detection-threshold: 0.0\n turn-detection-silence-duration-ms: 400\n\n # Qwen3 Realtime TTS Configuration\n tts:\n url: wss://dashscope.aliyuncs.com/api-ws/v1/realtime\n model: qwen3-tts-flash-realtime\n api-key: ${AI_BAILIAN_API_KEY}\n voice: Cherry\n format: pcm\n sample-rate: 16000\n mode: server_commit\n language-type: Chinese\n speech-rate: 1.0\n volume: 60\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds"}, "61627361e0070d2ca8e0986cb9fabff2bcab8c3e": {"t": 1785749308.8313482, "n": 6930, "h": "bb994abe4460912e", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n # Voice interview configuration\n voice-interview:\n # LLM provider selection\n llm-provider: ${APP_VOICE_INTERVIEW_LLM_PROVIDER:dashscope} # dashscope | minimax | openai | deepseek\n\n # Phase duration settings (minutes)\n phase:\n intro:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_INTRO_MAX_QUESTIONS:5}\n tech:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MIN_QUESTIONS:3}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_TECH_MAX_QUESTIONS:8}\n project:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_DURATION:8}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_SUGGESTED_DURATION:10}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_DURATION:15}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_PROJECT_MAX_QUESTIONS:5}\n hr:\n min-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_DURATION:3}\n suggested-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_SUGGESTED_DURATION:5}\n max-duration: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_DURATION:8}\n min-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MIN_QUESTIONS:2}\n max-questions: ${APP_VOICE_INTERVIEW_PHASE_HR_MAX_QUESTIONS:5}\n\n # TTS configuration\n tts:\n default-voice: ${APP_VOICE_INTERVIEW_TTS_DEFAULT_VOICE:siyue} # 思悦 - 温柔自然的女声\n\n # Aliyun voice services\n aliyun:\n stt:\n url: ${ALIYUN_STT_URL:wss://nls-gateway-cn-shanghai.aliyuncs.com/ws}\n app-key: ${ALIYUN_STT_APP_KEY:}\n access-key-id: ${ALIYUN_ACCESS_KEY_ID:}\n access-key-secret: ${ALIYUN_ACCESS_KEY_SECRET:}\n format: ${ALIYUN_STT_FORMAT:pcm}\n sample-rate: ${ALIYUN_STT_SAMPLE_RATE:16000}\n tts:\n url: ${ALIYUN_TTS_URL:wss://nls-gateway-cn-shanghai.aliyuncs.com/ws}\n app-key: ${ALIYUN_TTS_APP_KEY:}\n access-key-id: ${ALIYUN_ACCESS_KEY_ID:}\n access-key-secret: ${ALIYUN_ACCESS_KEY_SECRET:}\n voice: ${ALIYUN_TTS_VOICE:xiaoyun} # 默认女声\n format: ${ALIYUN_TTS_FORMAT:mp3}\n sample-rate: ${ALIYUN_TTS_SAMPLE_RATE:16000}\n\n # Rate limiting\n rate-limit:\n max-per-session: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_SESSION:10} # messages per second\n max-per-ip: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_PER_IP:3} # interviews per hour\n max-concurrent: ${APP_VOICE_INTERVIEW_RATE_LIMIT_MAX_CONCURRENT:50} # global concurrent interviews\n\n # Audio specifications\n audio:\n codec: ${APP_VOICE_INTERVIEW_AUDIO_CODEC:opus}\n sample-rate: ${APP_VOICE_INTERVIEW_AUDIO_SAMPLE_RATE:16000}\n bit-rate: ${APP_VOICE_INTERVIEW_AUDIO_BIT_RATE:24000}\n channels: ${APP_VOICE_INTERVIEW_AUDIO_CHANNELS:1}\n chunk-duration: ${APP_VOICE_INTERVIEW_AUDIO_CHUNK_DURATION:2000} # 2 seconds"}, "62dd413a78719eb47549dda76d8f2c547d98ab6e": {"t": 1785749310.056666, "n": 3590, "h": "9467dd653a6e6bbf", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n rag:\n rewrite:\n enabled: ${APP_AI_RAG_REWRITE_ENABLED:true}\n search:\n short-query-length: ${APP_AI_RAG_SHORT_QUERY_LENGTH:4}\n topk-short: ${APP_AI_RAG_TOPK_SHORT:20}\n topk-medium: ${APP_AI_RAG_TOPK_MEDIUM:12}\n topk-long: ${APP_AI_RAG_TOPK_LONG:8}\n min-score-short: ${APP_AI_RAG_MIN_SCORE_SHORT:0.18}\n min-score-default: ${APP_AI_RAG_MIN_SCORE_DEFAULT:0.28}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}"}, "54eab1f25ad4eba442963b9ae269fb8d825610ce": {"t": 1785749311.1295424, "n": 3170, "h": "54f02420c586c683", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n ai:\n # 结构化输出重试次数(用于 BeanOutputConverter 解析失败时的业务层重试)\n structured-max-attempts: ${APP_AI_STRUCTURED_MAX_ATTEMPTS:2}\n # 重试时是否将上次错误原因注入提示词,帮助模型定向修复输出\n structured-include-last-error: ${APP_AI_STRUCTURED_INCLUDE_LAST_ERROR:true}\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}"}, "9448c44e1d16f146545d612d8efc73bccfcbb5b1": {"t": 1785749312.2405155, "n": 2932, "h": "408383cff2c4a981", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.2\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}"}, "0b89a1650425679d30dd71e37fd5601bb05aa870": {"t": 1785749313.3044977, "n": 2932, "h": "1665bc6fe4e074d1", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n interview:\n follow-up-count: ${APP_INTERVIEW_FOLLOW_UP_COUNT:1}\n evaluation:\n batch-size: ${APP_INTERVIEW_EVALUATION_BATCH_SIZE:8}\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}"}, "e5601572af0772d7ea7ae23fb6b7e88ba702a3c9": {"t": 1785749314.3750887, "n": 2788, "h": "8c7109f462d5101e", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # 启用虚拟线程 (Java 21+)\n # 显著提升 I/O 密集型场景的并发能力,特别适合 AI 调用和 SSE 长连接\n threads:\n virtual:\n enabled: true\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}"}, "76df914b36784dc9ead14d701d06676378f86e57": {"t": 1785749316.4922006, "n": 2677, "h": "6db87a599ebc9199", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}"}, "1ca2f03ca620dadd01ceda5a4be2b8d78f5a1868": {"t": 1785749317.708697, "n": 2678, "h": "c67705b82674e4f7", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide2}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: create #首次启动用 create,表创建成功后,改回 update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: true # 开发环境设置为 true,方便快速启动。生产环境设置为 false,手动管理数据库 schema,避免意外变更。\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:wr45VXJZhCxc6FAWz0YR}\n secret-key: ${APP_STORAGE_SECRET_KEY:GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}"}, "8c6b6f97f61a4426f0c6f5158e0d3ad84c23cdef": {"t": 1785749318.7992425, "n": 2604, "h": "5ede94a7738a2ed6", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: false # 表已创建,不需要再初始化\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:Bdxbc3IoYFj7GEq4HAWi}\n secret-key: ${APP_STORAGE_SECRET_KEY:1vcANwb2FZh356Y8pGRUgunskJjfoLzqSxOMCHdi}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}"}, "188d9d327333f61867199cdaced0489a4c0ee70e": {"t": 1785749320.2879488, "n": 2940, "h": "77b06ba6340f5b7c", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n \n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://${POSTGRES_HOST:localhost}:${POSTGRES_PORT:5432}/${POSTGRES_DB:interview_guide}\n username: ${POSTGRES_USER:postgres}\n password: ${POSTGRES_PASSWORD:123456}\n driver-class-name: org.postgresql.Driver\n \n jpa:\n hibernate:\n ddl-auto: update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n \n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n data:\n redis:\n host: ${REDIS_HOST:localhost}\n port: ${REDIS_PORT:6379}\n database: 0\n timeout: 3000ms\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: ${AI_MODEL:qwen-plus}\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: false # 表已创建,不需要再初始化\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n \n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: ${APP_STORAGE_ENDPOINT:http://localhost:9000}\n access-key: ${APP_STORAGE_ACCESS_KEY:Bdxbc3IoYFj7GEq4HAWi}\n secret-key: ${APP_STORAGE_SECRET_KEY:1vcANwb2FZh356Y8pGRUgunskJjfoLzqSxOMCHdi}\n bucket: ${APP_STORAGE_BUCKET:interview-guide}\n region: ${APP_STORAGE_REGION:us-east-1}\n \n # CORS配置 - React前端\n cors:\n allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:5174,http://localhost:80}\n\n# Redisson配置\n# redisson:\n# config: |\n# singleServerConfig:\n# address: \"redis://${REDIS_HOST:localhost}:${REDIS_PORT:6379}\"\n# database: 0\n# idleConnectionTimeout: 10000\n# connectTimeout: 10000\n# timeout: 3000\n# retryAttempts: 3\n# retryInterval: 1500\n# password: null\n# subscriptionsPerConnection: 5\n# clientName: null\n# subscriptionConnectionMinimumIdleSize: 1\n# subscriptionConnectionPoolSize: 50\n# connectionMinimumIdleSize: 10\n# connectionPoolSize: 64\n# dnsMonitoringInterval: 5000\n"}, "f3359066b45578b5070c5a2117e9ed92d9a30639": {"t": 1785749321.3839312, "n": 2307, "h": "f07cf56a2e213593", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n\n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://localhost:5432/interview_guide\n username: postgres\n password: 123456\n driver-class-name: org.postgresql.Driver\n\n jpa:\n hibernate:\n ddl-auto: update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n\n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n\n # Redisson配置 (使用 spring.redis.redisson,参考官方文档)\n redis:\n redisson:\n config: |\n singleServerConfig:\n address: \"redis://localhost:6379\"\n database: 0\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n\n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: qwen-plus\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: false # 表已创建,不需要再初始化\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n\n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: http://localhost:9000\n access-key: wr45VXJZhCxc6FAWz0YR\n secret-key: GtKxV57WJkpw4CvASPBzTy2DYElLnRqh8dIXQa0m\n bucket: interview-guide\n region: us-east-1\n\n # CORS配置 - React前端\n cors:\n allowed-origins: http://localhost:5173,http://localhost:5174\n"}, "28ceba5260486089ed32f05a47cf934a006ae59a": {"t": 1785749322.4539967, "n": 2484, "h": "01408eaaa85931c0", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n \n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://localhost:5432/interview_guide\n username: postgres\n password: 123456\n driver-class-name: org.postgresql.Driver\n \n jpa:\n hibernate:\n ddl-auto: update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n \n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: qwen-plus\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: false # 表已创建,不需要再初始化\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n \n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: http://localhost:9000\n access-key: Bdxbc3IoYFj7GEq4HAWi\n secret-key: 1vcANwb2FZh356Y8pGRUgunskJjfoLzqSxOMCHdi\n bucket: interview-guide\n region: us-east-1\n \n # CORS配置 - React前端\n cors:\n allowed-origins: http://localhost:5173,http://localhost:5174\n\n# Redisson配置\nredisson:\n config: |\n singleServerConfig:\n address: \"redis://localhost:6379\"\n database: 0\n idleConnectionTimeout: 10000\n connectTimeout: 10000\n timeout: 3000\n retryAttempts: 3\n retryInterval: 1500\n password: null\n subscriptionsPerConnection: 5\n clientName: null\n subscriptionConnectionMinimumIdleSize: 1\n subscriptionConnectionPoolSize: 50\n connectionMinimumIdleSize: 10\n connectionPoolSize: 64\n dnsMonitoringInterval: 5000\n"}, "cabf278dc12fe05f418224985c4f93cc5ce41855": {"t": 1785749323.526186, "n": 1967, "h": "67ca5276f269a794", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n \n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://localhost:5432/interview_guide\n username: postgres\n password: 123456\n driver-class-name: org.postgresql.Driver\n \n jpa:\n hibernate:\n ddl-auto: update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n \n servlet:\n multipart:\n enabled: true\n max-file-size: 50MB # 支持知识库上传(简历限制在业务层检查)\n max-request-size: 50MB\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: qwen-plus\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # 禁用自动重试机制,让异常立即返回\n retry:\n max-attempts: 1 # 不重试,失败立即返回\n on-client-errors: false\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: false # 表已创建,不需要再初始化\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n \n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: http://localhost:9000\n access-key: Bdxbc3IoYFj7GEq4HAWi\n secret-key: 1vcANwb2FZh356Y8pGRUgunskJjfoLzqSxOMCHdi\n bucket: interview-guide\n region: us-east-1\n \n # CORS配置 - React前端\n cors:\n allowed-origins: http://localhost:5173,http://localhost:5174\n"}, "6091a45dacb263f527d23d71d74bbbcdb9dcb366": {"t": 1785749324.6106966, "n": 1844, "h": "f70fa2006b0fdc8d", "c": "# AI Interview Platform Configuration\n# 智能AI面试官平台配置\n\nserver:\n port: 8080\n\nspring:\n application:\n name: ai-interview-platform\n \n # PostgreSQL数据库配置\n datasource:\n url: jdbc:postgresql://localhost:5432/interview_guide\n username: postgres\n password: 123456\n driver-class-name: org.postgresql.Driver\n \n jpa:\n hibernate:\n ddl-auto: update\n show-sql: false\n properties:\n hibernate:\n dialect: org.hibernate.dialect.PostgreSQLDialect\n format_sql: true\n \n servlet:\n multipart:\n enabled: true\n max-file-size: 10MB\n max-request-size: 10MB\n \n # Spring AI - 阿里云DashScope (OpenAI兼容模式)\n ai:\n openai:\n base-url: https://dashscope.aliyuncs.com/compatible-mode\n api-key: ${AI_BAILIAN_API_KEY}\n chat:\n options:\n model: qwen-plus\n temperature: 0.7\n # Embedding模型配置 - 使用text-embedding-v3\n embedding:\n options:\n model: text-embedding-v3\n # PostgreSQL Vector Store配置\n vectorstore:\n pgvector:\n index-type: HNSW\n distance-type: COSINE_DISTANCE\n dimensions: 1024 # text-embedding-v3实际生成的向量维度\n initialize-schema: false # 表已创建,不需要再初始化\n remove-existing-vector-store-table: false # 保留现有表和数据\n\n# Application custom configuration\napp:\n resume:\n upload-dir: ${java.io.tmpdir}/ai-interview/resumes\n allowed-types:\n - application/pdf\n - application/msword\n - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n - text/plain\n \n # RustFS (S3兼容) 存储配置\n storage:\n endpoint: http://localhost:9000\n access-key: YlRUvwxer9TKuWg6DyhB\n secret-key: D5ULeVM72EzTQpK1OdtxYNnoSwl46gIyribvZuqJ\n bucket: interview-guide\n region: us-east-1\n \n # CORS配置 - React前端\n cors:\n allowed-origins: http://localhost:5173,http://localhost:5174\n"}}}}