feat(router,inference,config): pin narration to a configured model_id
[router.narration] model_id selects which provider handles narration turns instead of generic capability routing — lets a small/fast model own narration while the main model keeps CHAT/STEERING. - NarrationSettings.modelId parsed from TOML, threaded via RouterConfig .narrationModelId into DefaultRouterFacade.narrate (3-arg route) - DefaultInferenceRouter: exact-id match against healthy providers, with a post-select health check; any miss logs WARN and falls back to capability routing (never fails the narration turn) - onUserInput unchanged — only narrate uses the pinned model (tested)
This commit is contained in:
@@ -494,6 +494,7 @@ object ConfigLoader {
|
||||
topP = asDouble(routerNarrationSection["top_p"], 0.9),
|
||||
maxTokens = asInt(routerNarrationSection["max_tokens"], 4096),
|
||||
maxPerRun = asInt(routerNarrationSection["max_per_run"], 100),
|
||||
modelId = asStringOrNull(routerNarrationSection["model_id"]),
|
||||
)
|
||||
|
||||
val router = RouterConfig(
|
||||
|
||||
@@ -157,6 +157,7 @@ data class NarrationSettings(
|
||||
val topP: Double = 0.9,
|
||||
val maxTokens: Int = 4096,
|
||||
val maxPerRun: Int = 100,
|
||||
val modelId: String? = null,
|
||||
)
|
||||
|
||||
@Serializable
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.correx.core.config
|
||||
|
||||
import org.junit.jupiter.api.Test
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertNull
|
||||
|
||||
class ConfigLoaderTest {
|
||||
@Test
|
||||
@@ -519,4 +520,28 @@ class ConfigLoaderTest {
|
||||
assertEquals(180_000L, result.orchestration.stageTimeoutMs)
|
||||
assertEquals(2_000, result.orchestration.journalCompactionTokenThreshold)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parseToml parses router narration model_id`() {
|
||||
val toml = """
|
||||
[router.narration]
|
||||
model_id = "llama-cpp:phi-3-mini"
|
||||
""".trimIndent()
|
||||
|
||||
val result = ConfigLoader.parseTomlForTest(toml)
|
||||
|
||||
assertEquals("llama-cpp:phi-3-mini", result.router.narration.modelId)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parseToml narration model_id defaults to null when absent`() {
|
||||
val toml = """
|
||||
[router.narration]
|
||||
max_tokens = 2048
|
||||
""".trimIndent()
|
||||
|
||||
val result = ConfigLoader.parseTomlForTest(toml)
|
||||
|
||||
assertNull(result.router.narration.modelId)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user