## 1. Replace Shared Models - [x] 1.1 Create `TradeItem.cs` in Shared/Models with fields: `Valuedate` (string), `Counterparty` (string), `LegalEntity` (string?), `TradeId` (long), `DisplayCcy` (string), `Pv` (double), `Breakclause` (string). Add `[JsonPropertyName]` attributes for snake_case serialization. - [x] 1.2 Create `ExtractionResult.cs` in Shared/Models with `List Items` property - [x] 1.3 Delete the old `ExtractedFields.cs` - [x] 1.4 Update `ValidationResult.cs` to support candidate lists — add `List? Candidates` property for disambiguation results (each with `Name` and `LegalEntity` fields) ## 2. Configure External API HttpClients - [x] 2.1 Add `ExternalApis` section to `appsettings.json` with base URLs for counterparty, trade, and currency APIs - [x] 2.2 Create typed HttpClient service `CounterpartyApiClient` with `LookupAsync(string name)` method returning candidate tuples - [x] 2.3 Create typed HttpClient service `TradeApiClient` with `ValidateAsync(long tradeId)` method - [x] 2.4 Create typed HttpClient service `CurrencyApiClient` with `ValidateAsync(string currencyCode)` method - [x] 2.5 Register all typed HttpClients in `Program.cs` via `AddHttpClient()` with base URLs from configuration ## 3. Rewrite ExtractionPlugin - [x] 3.1 Replace `ExtractionPlugin.ValidateExtractedFields()` with `LookupCounterparty(string name)` — calls `CounterpartyApiClient`, returns candidate list as JSON. Include `[KernelFunction]` and `[Description]` attributes explaining the tool returns candidates for disambiguation. - [x] 3.2 Add `ValidateTrade(long tradeId)` method — calls `TradeApiClient`, returns valid/invalid result as JSON - [x] 3.3 Add `ValidateCurrency(string currencyCode)` method — calls `CurrencyApiClient`, returns valid/invalid result as JSON - [x] 3.4 Add `ValidateSchema(string extractionResultJson)` method — validates the full ExtractionResult JSON against TradeItem schema locally (required fields present, correct types, breakclause is Y or N) - [x] 3.5 Inject typed HttpClients into ExtractionPlugin via constructor. Register ExtractionPlugin in DI with its dependencies. - [x] 3.6 Add error handling in each tool method — catch `HttpRequestException`, return structured error JSON instead of throwing ## 4. Update Controller - [x] 4.1 Update `ChatController.Post()` — no changes needed, DI resolution via GetRequiredService works with scoped registration to use the new `ExtractionPlugin` constructor (pass DI-resolved instance with HttpClients) ## 5. Update Tests - [x] 5.1 Remove or rewrite tests referencing old `ExtractedFields` schema - [x] 5.2 Add unit tests for `ValidateSchema` method against TradeItem (valid, missing fields, wrong types) - [x] 5.3 Add unit tests for ExtractionPlugin tool methods with mocked HttpClients (success, error, multi-candidate responses) ## 6. Build and Verify - [x] 6.1 Build the solution (`dotnet build`) and confirm no compilation errors - [x] 6.2 Run all tests (`dotnet test`) and confirm they pass