## 1. Shared Models - [x] 1.1 Create `ModelSettings.cs` in Shared/Models — `double? Temperature`, `double? TopP`, `int? MaxTokens` - [x] 1.2 Add `string? SystemPrompt` and `ModelSettings? Settings` properties to `ChatRequest.cs` ## 2. API Backend - [x] 2.1 Update `ChatController.Post()` — if `request.SystemPrompt` is non-empty, call `chatHistory.AddSystemMessage(request.SystemPrompt)` before adding user/assistant messages - [x] 2.2 Update `ChatController.Post()` — if `request.Settings` is non-null, apply non-null Temperature, TopP, MaxTokens to `OpenAIPromptExecutionSettings` ## 3. Client UI — Tabbed Layout - [x] 3.1 Wrap the existing Chat.razor content (chat-container div) inside `` with three `` elements: "Chat", "System Prompt", "Model Settings" - [x] 3.2 Add component fields: `_systemPrompt` (string), `_temperature` (double?), `_topP` (double?), `_maxTokens` (int?) ## 4. System Prompt Tab - [x] 4.1 Add a `MudTextField` with `Lines="10"`, `Variant="Variant.Outlined"`, bound to `_systemPrompt`, with placeholder text explaining what a system prompt does - [x] 4.2 Include the `_systemPrompt` value in the `ChatRequest` built by `SendMessage()` ## 5. Model Settings Tab - [x] 5.1 Add `MudNumericField` for Temperature (min 0.0, max 2.0, step 0.1) with label and helper text - [x] 5.2 Add `MudNumericField` for TopP (min 0.0, max 1.0, step 0.1) with label and helper text - [x] 5.3 Add `MudNumericField` for MaxTokens (min 1, max 4096) with label and helper text - [x] 5.4 Include the model settings in the `ChatRequest` built by `SendMessage()` ## 6. Client Service - [x] 6.1 Verify `ChatApiClient.SendChatStreamingAsync()` serializes the new `ChatRequest` fields correctly (SystemPrompt, Settings) — no changes expected since it already serializes the full object ## 7. Styling - [x] 7.1 Adjust `Chat.razor.css` — the chat-container height calc needs to account for the MudTabs header height (~48px). The tabs header sits inside the content area below the AppBar. ## 8. Verification - [x] 8.1 Build the solution (`dotnet build`) and confirm no compilation errors - [x] 8.2 Run existing tests (`dotnet test`) and confirm they pass - [x] 8.3 Update any tests that construct `ChatRequest` if the new nullable fields cause issues — no updates needed, nullable fields don't break existing tests