diff --git a/src/main/kotlin/LargeLanguageModels.kt b/src/main/kotlin/LargeLanguageModels.kt index bae597a..e9c77b7 100644 --- a/src/main/kotlin/LargeLanguageModels.kt +++ b/src/main/kotlin/LargeLanguageModels.kt @@ -146,22 +146,28 @@ object LargeLanguageModels { // 初始化推理模型 if (PluginConfig.reasoningModelApi.isNotBlank() && PluginConfig.reasoningModelToken.isNotBlank()) { + // 推理模型出首块前常有思考预热,比对话慢,使用单独放宽的首块超时; + // socket 超时(两次读间隔,等首块时也归它管)不能小于首块预算,否则首块超时形同虚设 + val reasoningFirstChunk = PluginConfig.reasoningFirstChunkTimeout.milliseconds reasoning = ModelService( baseUrl = PluginConfig.reasoningModelApi, token = PluginConfig.reasoningModelToken, - timeout = timeout, - firstChunkTimeout = firstChunkTimeout, + timeout = maxOf(timeout, reasoningFirstChunk), + firstChunkTimeout = reasoningFirstChunk, extraBody = parseExtraBody(PluginConfig.reasoningModelExtraBody) ) } // 初始化视觉模型 if (PluginConfig.visualModelApi.isNotBlank() && PluginConfig.visualModelToken.isNotBlank()) { + // 视觉模型需服务端先下载图片再出首块,比对话天然慢,使用单独放宽的首块超时; + // socket 超时(两次读间隔,等首块时也归它管)不能小于首块预算,否则首块超时形同虚设 + val visualFirstChunk = PluginConfig.visualFirstChunkTimeout.milliseconds visual = ModelService( baseUrl = PluginConfig.visualModelApi, token = PluginConfig.visualModelToken, - timeout = timeout, - firstChunkTimeout = firstChunkTimeout, + timeout = maxOf(timeout, visualFirstChunk), + firstChunkTimeout = visualFirstChunk, extraBody = parseExtraBody(PluginConfig.visualModelExtraBody) ) } diff --git a/src/main/kotlin/PluginConfig.kt b/src/main/kotlin/PluginConfig.kt index 9841be1..7c8e5fc 100644 --- a/src/main/kotlin/PluginConfig.kt +++ b/src/main/kotlin/PluginConfig.kt @@ -105,6 +105,12 @@ object PluginConfig : AutoSavePluginConfig("Config") { @ValueDescription("首块响应超时时间,单位毫秒,默认10秒。若连接建立后在此时间内没收到首块data:则中断走重试") val firstChunkTimeout: Long by value(10000L) + @ValueDescription("视觉模型首块响应超时时间,单位毫秒,默认120秒。视觉模型需先下载图片再出首块,比对话天然慢,故单独放宽") + val visualFirstChunkTimeout: Long by value(120000L) + + @ValueDescription("推理模型首块响应超时时间,单位毫秒,默认90秒。推理模型出首块前常有思考预热,比对话慢,故单独放宽") + val reasoningFirstChunkTimeout: Long by value(90000L) + @Deprecated("使用外部文件而不是在配置文件内保存提示词") @ValueDescription("系统提示词,该字段已弃用,使用提示词文件而不是在这里修改") var prompt: String by value("你是一个乐于助人的助手")