feat: provider presets (openai, openrouter, ollama, dahl, gonkarouter, custom), /api/info, provider display in Android settings

This commit is contained in:
OpenClaw Dev 2026-10-25 04:30:26 +01:00
parent d2ec0848c8
commit 7b92e259ad
14 changed files with 233 additions and 18 deletions

View file

@ -40,6 +40,8 @@ class ByteClawApi(private val settings: ServerSettings) {
http.newCall(Request.Builder().url(url("/healthz")).build()).execute().use { it.isSuccessful }
}
suspend fun info(): ServerInfo = json.decodeFromString(call(Request.Builder().url(url("/api/info")).build()))
suspend fun sessions(): List<Session> = json.decodeFromString(call(Request.Builder().url(url("/api/sessions")).build()))
suspend fun messages(sessionId: String): List<Message> =

View file

@ -4,6 +4,7 @@ import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import dev.byteclaw.client.data.ByteClawApi
import dev.byteclaw.client.data.ProviderPresets
import dev.byteclaw.client.data.ServerSettings
import dev.byteclaw.client.data.Session
import dev.byteclaw.client.data.SettingsStore
@ -39,7 +40,8 @@ class ChatViewModel(app: Application) : AndroidViewModel(app) {
fun testConnection(s: ServerSettings, onResult: (String) -> Unit) = viewModelScope.launch {
val msg = runCatching {
ByteClawApi(s).sessions(); "Verbindung OK"
val i = ByteClawApi(s).info()
"Verbindung OK · Provider: ${ProviderPresets.label(i.provider)} · Modell: ${i.model}"
}.getOrElse { "Fehler: ${it.message}" }
onResult(msg)
}

View file

@ -158,6 +158,9 @@ fun SettingsScreen(vm: ChatViewModel, state: UiState, onBack: () -> Unit) {
}) { Text("Verbindung testen") }
}
status?.let { Text(it) }
Text("Der LLM-Provider (z. B. Dahl, GonkaRouter) wird am Server über llm.provider gewählt. " +
"Verbindung testen zeigt den aktiven Provider und das Modell.",
style = MaterialTheme.typography.bodySmall)
}
}
}

View file

@ -2,6 +2,8 @@ package dev.byteclaw.client
import dev.byteclaw.client.data.AgentEvent
import dev.byteclaw.client.data.Message
import dev.byteclaw.client.data.ProviderPresets
import dev.byteclaw.client.data.ServerInfo
import kotlinx.serialization.json.Json
import org.junit.Assert.assertEquals
import org.junit.Test
@ -19,4 +21,11 @@ class ModelsTest {
"""{"id":2,"role":"assistant","content":"","tool_calls":[{"id":"c1","name":"time_now","arguments":"{}"}],"created_at":"x"}""")
assertEquals("time_now", m.toolCalls.single().name)
}
@Test fun decodesServerInfoAndLabels() {
val i = json.decodeFromString(ServerInfo.serializer(), """{"provider":"gonkarouter","model":"MiniMaxAI/MiniMax-M2.7","base_url":"https://api.gonkarouter.io/v1"}""")
assertEquals("GonkaRouter", ProviderPresets.label(i.provider))
assertEquals("Dahl (dahl.global)", ProviderPresets.label("dahl"))
assertEquals("x", ProviderPresets.label("x"))
}
}