{"repo": "allentwillight05/se26project-13", "files": {"FinalRelease/SourceCode/backend/src/main/resources/application.properties": {"4eabc8e15ec793036885cd601783eb68988d7e6e": {"t": 1785746971.8369136, "n": 5880, "h": "5b2d0ca0e6c9546a", "c": "spring.application.name=english-learning-copilot-backend\n\nspring.datasource.url=jdbc:mysql://127.0.0.1:3306/english_learning_copilot?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC\nspring.datasource.username=root\nspring.datasource.password=\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.jpa.hibernate.ddl-auto=update\nspring.jpa.show-sql=false\nspring.jpa.open-in-view=false\n\napp.jwt.secret=dev-only-change-before-production-32b\napp.jwt.expiration-minutes=120\n\napp.admin.seed.enabled=true\napp.admin.seed.username=admin\napp.admin.seed.email=admin@example.com\napp.admin.seed.password=${APP_ADMIN_SEED_PASSWORD:Admin123456}\napp.admin.seed.display-name=${APP_ADMIN_SEED_DISPLAY_NAME:Administrator}\n\napp.speaking.upload-dir=uploads/speaking\nspring.servlet.multipart.max-file-size=10MB\nspring.servlet.multipart.max-request-size=10MB\n\nspeaking.agent.provider=${SPEAKING_AGENT_PROVIDER:sjtu}\nspeaking.agent.sjtu.endpoint=${SJTU_AI_ENDPOINT:https://models.sjtu.edu.cn/api/v1}\nspeaking.agent.sjtu.api-key=${SJTU_AI_API_KEY:sk-PRnW2uK3s_v6s4WGKxlk2g}\nspeaking.agent.sjtu.model=${SJTU_AI_MODEL:deepseek-chat}\nspeaking.agent.sjtu.temperature=${SJTU_AI_TEMPERATURE:0.7}\nspeaking.agent.sjtu.max-tokens=${SJTU_AI_MAX_TOKENS:120}\nspeaking.agent.sjtu.timeout-ms=${SJTU_AI_TIMEOUT_MS:30000}\nspeaking.agent.sjtu.prompt-lab-dir=${SPEAKING_PROMPT_LAB_DIR:llm-prompt-lab}\nspeaking.agent.sjtu.history-message-limit=${SJTU_AI_HISTORY_MESSAGE_LIMIT:8}\nspeaking.agent.sjtu.history-context-max-chars=${SJTU_AI_HISTORY_CONTEXT_MAX_CHARS:600}\n\n# Future multi-key/provider routing. Disabled means the existing direct clients remain untouched.\nspeaking.routing.enabled=${SPEAKING_ROUTING_ENABLED:false}\n\n# Future durable turn dispatch. INLINE preserves the current synchronous request flow.\nspeaking.dispatch.mode=${SPEAKING_DISPATCH_MODE:inline}\nspeaking.dispatch.poll-interval-ms=${SPEAKING_DISPATCH_POLL_INTERVAL_MS:250}\nspeaking.dispatch.batch-size=${SPEAKING_DISPATCH_BATCH_SIZE:4}\nspeaking.dispatch.max-attempts=${SPEAKING_DISPATCH_MAX_ATTEMPTS:2}\nspeaking.dispatch.retry-delay-ms=${SPEAKING_DISPATCH_RETRY_DELAY_MS:1000}\n\n# Grammar tutor uses the same OpenAI-compatible SJTU endpoint/key by default, with its own response limits.\ngrammar.tutor.provider=${GRAMMAR_TUTOR_PROVIDER:sjtu}\ngrammar.tutor.sjtu.endpoint=${GRAMMAR_TUTOR_ENDPOINT:${SJTU_AI_ENDPOINT:https://models.sjtu.edu.cn/api/v1}}\ngrammar.tutor.sjtu.api-key=${GRAMMAR_TUTOR_API_KEY:${SJTU_AI_API_KEY:sk-PRnW2uK3s_v6s4WGKxlk2g}}\ngrammar.tutor.sjtu.model=${GRAMMAR_TUTOR_MODEL:${SJTU_AI_MODEL:deepseek-chat}}\ngrammar.tutor.sjtu.temperature=${GRAMMAR_TUTOR_TEMPERATURE:0.3}\ngrammar.tutor.sjtu.max-tokens=${GRAMMAR_TUTOR_MAX_TOKENS:500}\ngrammar.tutor.sjtu.timeout-ms=${GRAMMAR_TUTOR_TIMEOUT_MS:30000}\n\nxfyun.asr.enabled=${XFYUN_ASR_ENABLED:true}\nxfyun.asr.base-url=${XFYUN_ASR_BASE_URL:https://office-api-ist-dx.iflyaisol.com}\nxfyun.asr.app-id=${XFYUN_APP_ID:609507a1}\nxfyun.asr.api-key=${XFYUN_API_KEY:1b5e86adfb9d5c5d9a89fcaea4b0c9d4}\nxfyun.asr.api-secret=${XFYUN_API_SECRET:YTNmZWQ2ZGQ0MDZkYWRmZjZiNmUzZTVl}\nxfyun.asr.language=${XFYUN_ASR_LANGUAGE:autodialect}\nxfyun.asr.accent=${XFYUN_ASR_ACCENT:mandarin}\nxfyun.asr.result-type=${XFYUN_ASR_RESULT_TYPE:transfer}\nxfyun.asr.duration-check-disable=${XFYUN_ASR_DURATION_CHECK_DISABLE:true}\nxfyun.asr.poll-interval-ms=${XFYUN_ASR_POLL_INTERVAL_MS:500}\nxfyun.asr.timeout-ms=${XFYUN_ASR_TIMEOUT_MS:30000}\nxfyun.asr.file-name=${XFYUN_ASR_FILE_NAME:recording.webm}\nxfyun.asr.transcode-enabled=${XFYUN_ASR_TRANSCODE_ENABLED:true}\nxfyun.asr.transcode-command=${XFYUN_ASR_TRANSCODE_COMMAND:ffmpeg}\nxfyun.asr.transcode-timeout-ms=${XFYUN_ASR_TRANSCODE_TIMEOUT_MS:30000}\n\nxfyun.ise.enabled=${XFYUN_ISE_ENABLED:true}\nxfyun.ise.url=${XFYUN_ISE_URL:wss://ise-api.xfyun.cn/v2/open-ise}\nxfyun.ise.app-id=${XFYUN_ISE_APP_ID:${XFYUN_APP_ID:609507a1}}\nxfyun.ise.api-key=${XFYUN_ISE_API_KEY:${XFYUN_API_KEY:1b5e86adfb9d5c5d9a89fcaea4b0c9d4}}\nxfyun.ise.api-secret=${XFYUN_ISE_API_SECRET:${XFYUN_API_SECRET:YTNmZWQ2ZGQ0MDZkYWRmZjZiNmUzZTVl}}\nxfyun.ise.language=${XFYUN_ISE_LANGUAGE:en_vip}\nxfyun.ise.category=${XFYUN_ISE_CATEGORY:read_sentence}\nxfyun.ise.sample-rate=${XFYUN_ISE_SAMPLE_RATE:16000}\nxfyun.ise.timeout-ms=${XFYUN_ISE_TIMEOUT_MS:30000}\nxfyun.ise.audio-frame-bytes=${XFYUN_ISE_AUDIO_FRAME_BYTES:1280}\nxfyun.ise.transcode-enabled=${XFYUN_ISE_TRANSCODE_ENABLED:true}\nxfyun.ise.transcode-command=${XFYUN_ISE_TRANSCODE_COMMAND:ffmpeg}\n\nspeaking.pronunciation.evaluate-on-turn=${SPEAKING_PRONUNCIATION_EVALUATE_ON_TURN:false}\nspeaking.pronunciation.evaluate-async=${SPEAKING_PRONUNCIATION_EVALUATE_ASYNC:true}\n\n# Practice statistics are committed through a durable database outbox. FSRS stays synchronous.\napp.learning-progress-outbox.scheduler-enabled=${LEARNING_PROGRESS_OUTBOX_SCHEDULER_ENABLED:true}\napp.learning-progress-outbox.poll-interval-ms=${LEARNING_PROGRESS_OUTBOX_POLL_INTERVAL_MS:200}\n\napp.pet.vector-index-file=${PET_VECTOR_INDEX_FILE:var/pet-vector-index.json}\n\nsupersmart.tts.enabled=${SUPERSMART_TTS_ENABLED:false}\nsupersmart.tts.url=${SUPERSMART_TTS_URL:wss://cbm01.cn-huabei-1.xf-yun.com/v1/private/mcd9m97e6}\nsupersmart.tts.app-id=${SUPERSMART_TTS_APP_ID:${XFYUN_APP_ID:609507a1}}\nsupersmart.tts.api-key=${SUPERSMART_TTS_API_KEY:${XFYUN_API_KEY:1b5e86adfb9d5c5d9a89fcaea4b0c9d4}}\nsupersmart.tts.api-secret=${SUPERSMART_TTS_API_SECRET:${XFYUN_API_SECRET:YTNmZWQ2ZGQ0MDZkYWRmZjZiNmUzZTVl}}\nsupersmart.tts.voice=${SUPERSMART_TTS_VOICE:x6_lingxiaoxuan_pro}\nsupersmart.tts.audio-encoding=${SUPERSMART_TTS_AUDIO_ENCODING:lame}\nsupersmart.tts.text-encoding=${SUPERSMART_TTS_TEXT_ENCODING:utf8}\nsupersmart.tts.sample-rate=${SUPERSMART_TTS_SAMPLE_RATE:24000}\nsupersmart.tts.speed=${SUPERSMART_TTS_SPEED:50}\nsupersmart.tts.pitch=${SUPERSMART_TTS_PITCH:50}\nsupersmart.tts.volume=${SUPERSMART_TTS_VOLUME:50}\nsupersmart.tts.timeout-ms=${SUPERSMART_TTS_TIMEOUT_MS:30000}\n"}, "b7c9c5df97da9f320b149d6ee2158f8acde4740e": {"t": 1785769458.697341, "n": 5880, "h": "5b2d0ca0e6c9546a", "c": "spring.application.name=english-learning-copilot-backend\n\nspring.datasource.url=jdbc:mysql://127.0.0.1:3306/english_learning_copilot?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC\nspring.datasource.username=root\nspring.datasource.password=\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.jpa.hibernate.ddl-auto=update\nspring.jpa.show-sql=false\nspring.jpa.open-in-view=false\n\napp.jwt.secret=dev-only-change-before-production-32b\napp.jwt.expiration-minutes=120\n\napp.admin.seed.enabled=true\napp.admin.seed.username=admin\napp.admin.seed.email=admin@example.com\napp.admin.seed.password=${APP_ADMIN_SEED_PASSWORD:Admin123456}\napp.admin.seed.display-name=${APP_ADMIN_SEED_DISPLAY_NAME:Administrator}\n\napp.speaking.upload-dir=uploads/speaking\nspring.servlet.multipart.max-file-size=10MB\nspring.servlet.multipart.max-request-size=10MB\n\nspeaking.agent.provider=${SPEAKING_AGENT_PROVIDER:sjtu}\nspeaking.agent.sjtu.endpoint=${SJTU_AI_ENDPOINT:https://models.sjtu.edu.cn/api/v1}\nspeaking.agent.sjtu.api-key=${SJTU_AI_API_KEY:sk-PRnW2uK3s_v6s4WGKxlk2g}\nspeaking.agent.sjtu.model=${SJTU_AI_MODEL:deepseek-chat}\nspeaking.agent.sjtu.temperature=${SJTU_AI_TEMPERATURE:0.7}\nspeaking.agent.sjtu.max-tokens=${SJTU_AI_MAX_TOKENS:120}\nspeaking.agent.sjtu.timeout-ms=${SJTU_AI_TIMEOUT_MS:30000}\nspeaking.agent.sjtu.prompt-lab-dir=${SPEAKING_PROMPT_LAB_DIR:llm-prompt-lab}\nspeaking.agent.sjtu.history-message-limit=${SJTU_AI_HISTORY_MESSAGE_LIMIT:8}\nspeaking.agent.sjtu.history-context-max-chars=${SJTU_AI_HISTORY_CONTEXT_MAX_CHARS:600}\n\n# Future multi-key/provider routing. Disabled means the existing direct clients remain untouched.\nspeaking.routing.enabled=${SPEAKING_ROUTING_ENABLED:false}\n\n# Future durable turn dispatch. INLINE preserves the current synchronous request flow.\nspeaking.dispatch.mode=${SPEAKING_DISPATCH_MODE:inline}\nspeaking.dispatch.poll-interval-ms=${SPEAKING_DISPATCH_POLL_INTERVAL_MS:250}\nspeaking.dispatch.batch-size=${SPEAKING_DISPATCH_BATCH_SIZE:4}\nspeaking.dispatch.max-attempts=${SPEAKING_DISPATCH_MAX_ATTEMPTS:2}\nspeaking.dispatch.retry-delay-ms=${SPEAKING_DISPATCH_RETRY_DELAY_MS:1000}\n\n# Grammar tutor uses the same OpenAI-compatible SJTU endpoint/key by default, with its own response limits.\ngrammar.tutor.provider=${GRAMMAR_TUTOR_PROVIDER:sjtu}\ngrammar.tutor.sjtu.endpoint=${GRAMMAR_TUTOR_ENDPOINT:${SJTU_AI_ENDPOINT:https://models.sjtu.edu.cn/api/v1}}\ngrammar.tutor.sjtu.api-key=${GRAMMAR_TUTOR_API_KEY:${SJTU_AI_API_KEY:sk-PRnW2uK3s_v6s4WGKxlk2g}}\ngrammar.tutor.sjtu.model=${GRAMMAR_TUTOR_MODEL:${SJTU_AI_MODEL:deepseek-chat}}\ngrammar.tutor.sjtu.temperature=${GRAMMAR_TUTOR_TEMPERATURE:0.3}\ngrammar.tutor.sjtu.max-tokens=${GRAMMAR_TUTOR_MAX_TOKENS:500}\ngrammar.tutor.sjtu.timeout-ms=${GRAMMAR_TUTOR_TIMEOUT_MS:30000}\n\nxfyun.asr.enabled=${XFYUN_ASR_ENABLED:true}\nxfyun.asr.base-url=${XFYUN_ASR_BASE_URL:https://office-api-ist-dx.iflyaisol.com}\nxfyun.asr.app-id=${XFYUN_APP_ID:609507a1}\nxfyun.asr.api-key=${XFYUN_API_KEY:1b5e86adfb9d5c5d9a89fcaea4b0c9d4}\nxfyun.asr.api-secret=${XFYUN_API_SECRET:YTNmZWQ2ZGQ0MDZkYWRmZjZiNmUzZTVl}\nxfyun.asr.language=${XFYUN_ASR_LANGUAGE:autodialect}\nxfyun.asr.accent=${XFYUN_ASR_ACCENT:mandarin}\nxfyun.asr.result-type=${XFYUN_ASR_RESULT_TYPE:transfer}\nxfyun.asr.duration-check-disable=${XFYUN_ASR_DURATION_CHECK_DISABLE:true}\nxfyun.asr.poll-interval-ms=${XFYUN_ASR_POLL_INTERVAL_MS:500}\nxfyun.asr.timeout-ms=${XFYUN_ASR_TIMEOUT_MS:30000}\nxfyun.asr.file-name=${XFYUN_ASR_FILE_NAME:recording.webm}\nxfyun.asr.transcode-enabled=${XFYUN_ASR_TRANSCODE_ENABLED:true}\nxfyun.asr.transcode-command=${XFYUN_ASR_TRANSCODE_COMMAND:ffmpeg}\nxfyun.asr.transcode-timeout-ms=${XFYUN_ASR_TRANSCODE_TIMEOUT_MS:30000}\n\nxfyun.ise.enabled=${XFYUN_ISE_ENABLED:true}\nxfyun.ise.url=${XFYUN_ISE_URL:wss://ise-api.xfyun.cn/v2/open-ise}\nxfyun.ise.app-id=${XFYUN_ISE_APP_ID:${XFYUN_APP_ID:609507a1}}\nxfyun.ise.api-key=${XFYUN_ISE_API_KEY:${XFYUN_API_KEY:1b5e86adfb9d5c5d9a89fcaea4b0c9d4}}\nxfyun.ise.api-secret=${XFYUN_ISE_API_SECRET:${XFYUN_API_SECRET:YTNmZWQ2ZGQ0MDZkYWRmZjZiNmUzZTVl}}\nxfyun.ise.language=${XFYUN_ISE_LANGUAGE:en_vip}\nxfyun.ise.category=${XFYUN_ISE_CATEGORY:read_sentence}\nxfyun.ise.sample-rate=${XFYUN_ISE_SAMPLE_RATE:16000}\nxfyun.ise.timeout-ms=${XFYUN_ISE_TIMEOUT_MS:30000}\nxfyun.ise.audio-frame-bytes=${XFYUN_ISE_AUDIO_FRAME_BYTES:1280}\nxfyun.ise.transcode-enabled=${XFYUN_ISE_TRANSCODE_ENABLED:true}\nxfyun.ise.transcode-command=${XFYUN_ISE_TRANSCODE_COMMAND:ffmpeg}\n\nspeaking.pronunciation.evaluate-on-turn=${SPEAKING_PRONUNCIATION_EVALUATE_ON_TURN:false}\nspeaking.pronunciation.evaluate-async=${SPEAKING_PRONUNCIATION_EVALUATE_ASYNC:true}\n\n# Practice statistics are committed through a durable database outbox. FSRS stays synchronous.\napp.learning-progress-outbox.scheduler-enabled=${LEARNING_PROGRESS_OUTBOX_SCHEDULER_ENABLED:true}\napp.learning-progress-outbox.poll-interval-ms=${LEARNING_PROGRESS_OUTBOX_POLL_INTERVAL_MS:200}\n\napp.pet.vector-index-file=${PET_VECTOR_INDEX_FILE:var/pet-vector-index.json}\n\nsupersmart.tts.enabled=${SUPERSMART_TTS_ENABLED:false}\nsupersmart.tts.url=${SUPERSMART_TTS_URL:wss://cbm01.cn-huabei-1.xf-yun.com/v1/private/mcd9m97e6}\nsupersmart.tts.app-id=${SUPERSMART_TTS_APP_ID:${XFYUN_APP_ID:609507a1}}\nsupersmart.tts.api-key=${SUPERSMART_TTS_API_KEY:${XFYUN_API_KEY:1b5e86adfb9d5c5d9a89fcaea4b0c9d4}}\nsupersmart.tts.api-secret=${SUPERSMART_TTS_API_SECRET:${XFYUN_API_SECRET:YTNmZWQ2ZGQ0MDZkYWRmZjZiNmUzZTVl}}\nsupersmart.tts.voice=${SUPERSMART_TTS_VOICE:x6_lingxiaoxuan_pro}\nsupersmart.tts.audio-encoding=${SUPERSMART_TTS_AUDIO_ENCODING:lame}\nsupersmart.tts.text-encoding=${SUPERSMART_TTS_TEXT_ENCODING:utf8}\nsupersmart.tts.sample-rate=${SUPERSMART_TTS_SAMPLE_RATE:24000}\nsupersmart.tts.speed=${SUPERSMART_TTS_SPEED:50}\nsupersmart.tts.pitch=${SUPERSMART_TTS_PITCH:50}\nsupersmart.tts.volume=${SUPERSMART_TTS_VOLUME:50}\nsupersmart.tts.timeout-ms=${SUPERSMART_TTS_TIMEOUT_MS:30000}\n"}}}}