* feat(#445): full Models tab — settings panel, aux tasks, MOA config, model assignment Main features added: - Model Settings card at top of screen with main model, aux tasks, MOA summary - Main model assignment via /api/model/set with expensive model confirm flow - Auxiliary tasks dialog with per-task model override and reset-all - MOA config dialog with preset management and reference/aggregator model picker - Model picker dialog reused for main model, aux tasks, and MOA slot selection - Kept existing provider browse + pin/unpin/search New data models: AuxiliaryModelsResponse, MoaConfigResponse, ModelAssignmentRequest/Response New API endpoints: GET /api/model/auxiliary, GET/PUT /api/model/moa, POST /api/model/set * test(#445): add aux + MOA mock endpoints to E2eIntegrationTest testModelOptionsSelection_success was failing because the ViewModel's init block now calls getAuxiliaryModels() and getMoaConfig() which weren't mocked. Added proper mock returns + imports for the new types. * fix(#445): correct mock endpoint name in E2eIntegrationTest - getMoaConfig -> getMoaModels (matches API service method name) - Add explicit type parameter Response.success<MoaConfigResponse> to fix Kotlin type inference * fix(#445): add missing main param to AuxiliaryModelsResponse mock AuxiliaryModelsResponse requires a MainModelAssignment for its 'main' field. Added the parameter with a dummy value and the corresponding import. * fix(#445): update toast assertion in test to match new message format ViewModel now produces 'Successfully set profile model to ronia' instead of the old 'Successfully set model to ronia'. * fix(#445): remove top padding from Models tab LazyColumn Top inset already provided by HermesScaffold; double padding was chunky next to TopAppBar. * fix(#445): remove double-stacked top padding on Models tab LazyColumn HermesScaffold's Box already applies padding(paddingValues) to offset content below the TopAppBar. The LazyColumn was re-applying it on the modifier, doubling the top gap. Keep the modifier clean (.fillMaxSize() only) — the Box handles the offset. * refactor(#445): inline loadModelOptions into loadAll loadAll() was just delegating to loadModelOptions() with no extra logic. Consolidate into a single method to remove the redundancy. --------- Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
1 parent
57a815c67e
commit
41fde55c11
5 files changed
+1673
-400
No files matched your search
@@ -0,0 +1,64 @@
|
||||
package com.m57.hermescontrol.data.model
|
||||
|
||||
data class AuxiliaryTaskAssignment(
|
||||
val task: String,
|
||||
val provider: String,
|
||||
val model: String,
|
||||
val base_url: String? = null,
|
||||
)
|
||||
|
||||
data class AuxiliaryModelsResponse(
|
||||
val tasks: List<AuxiliaryTaskAssignment>,
|
||||
val main: MainModelAssignment,
|
||||
)
|
||||
|
||||
data class MainModelAssignment(
|
||||
val provider: String,
|
||||
val model: String,
|
||||
)
|
||||
|
||||
data class MoaModelSlot(
|
||||
val provider: String,
|
||||
val model: String,
|
||||
)
|
||||
|
||||
data class MoaConfigPreset(
|
||||
val reference_models: List<MoaModelSlot>,
|
||||
val aggregator: MoaModelSlot,
|
||||
val reference_temperature: Double = 0.7,
|
||||
val aggregator_temperature: Double = 0.3,
|
||||
val max_tokens: Int = 4096,
|
||||
val enabled: Boolean = true,
|
||||
)
|
||||
|
||||
data class MoaConfigResponse(
|
||||
val default_preset: String = "",
|
||||
val active_preset: String = "",
|
||||
val presets: Map<String, MoaConfigPreset> = emptyMap(),
|
||||
val reference_models: List<MoaModelSlot> = emptyList(),
|
||||
val aggregator: MoaModelSlot = MoaModelSlot("", ""),
|
||||
val reference_temperature: Double = 0.7,
|
||||
val aggregator_temperature: Double = 0.3,
|
||||
val max_tokens: Int = 4096,
|
||||
val enabled: Boolean = true,
|
||||
)
|
||||
|
||||
data class ModelAssignmentRequest(
|
||||
val confirm_expensive_model: Boolean = false,
|
||||
val scope: String,
|
||||
val provider: String,
|
||||
val model: String,
|
||||
val base_url: String? = null,
|
||||
val task: String? = null,
|
||||
)
|
||||
|
||||
data class ModelAssignmentResponse(
|
||||
val confirm_message: String? = null,
|
||||
val confirm_required: Boolean? = null,
|
||||
val ok: Boolean = false,
|
||||
val scope: String? = null,
|
||||
val provider: String? = null,
|
||||
val model: String? = null,
|
||||
val tasks: List<String>? = null,
|
||||
val reset: Boolean? = null,
|
||||
)
|
||||
Reference in new issue
Block a user