Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/211840040_ai-interview.json
T

1 line
206 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}