Add AI batch reconciliation for accessibility bills

This commit is contained in:
2026-07-25 18:41:09 +08:00
parent eb8909a192
commit 7cca34b331
25 changed files with 2771 additions and 230 deletions
+60 -8
View File
@@ -5,10 +5,13 @@ public interface ILlmClient
bool IsEnabled { get; }
Task<IntentResult?> TryParseIntentAsync(string userText, CancellationToken ct = default);
Task<string?> TryGenerateReplyAsync(string systemPrompt, string userText, CancellationToken ct = default);
Task<IReadOnlyList<ImageParseResult>?> AnalyzeImageAsync(
byte[] imageBytes,
string mimeType,
CancellationToken ct = default);
Task<IReadOnlyList<ImageParseResult>?> AnalyzeImageAsync(
byte[] imageBytes,
string mimeType,
CancellationToken ct = default);
Task<IReadOnlyList<RecognitionBatchModelAction>?> ReconcileRecognitionBatchAsync(
RecognitionBatchModelInput input,
CancellationToken ct = default);
Task<(bool Ok, string? Error)> TestConnectionAsync(CancellationToken ct = default);
Task<AgentRunResponse> RunAgentAsync(
@@ -42,13 +45,57 @@ public record AgentRunResponse(
string Text,
int ToolCallCount);
public record ImageParseResult(
public record ImageParseResult(
string Type,
decimal Amount,
string CategoryName,
string? PaymentMethod,
string Note,
DateTime? OccurredAt);
DateTime? OccurredAt);
public record RecognitionBatchModelCandidate(
string CandidateId,
string? FlowSessionId,
string PackageName,
string Type,
decimal Amount,
string? Merchant,
string? OrderId,
DateTime OccurredAt,
string RecognitionKind,
string? CategoryHint,
string Confidence,
IReadOnlyList<string> EvidenceIds);
public record RecognitionBatchModelEvidence(
string EvidenceId,
string? CandidateId,
string? FlowSessionId,
string PackageName,
DateTime CapturedAt,
byte[] ImageBytes,
string MimeType);
public record RecognitionBatchModelInput(
string BatchId,
IReadOnlyList<RecognitionBatchModelCandidate> Candidates,
IReadOnlyList<RecognitionBatchModelEvidence> Evidence,
IReadOnlyList<string> ExpenseCategories,
IReadOnlyList<string> IncomeCategories);
public record RecognitionBatchModelAction(
string Action,
string ActionId,
string? CandidateId,
string? EvidenceId,
string? Type,
decimal? Amount,
string? CategoryName,
string? PaymentMethod,
string? Note,
DateTime? OccurredAt,
double Confidence,
string Reason);
public class NullLlmClient : ILlmClient
{
@@ -65,11 +112,16 @@ public class NullLlmClient : ILlmClient
CancellationToken ct = default) =>
Task.FromResult<string?>(null);
public Task<IReadOnlyList<ImageParseResult>?> AnalyzeImageAsync(
public Task<IReadOnlyList<ImageParseResult>?> AnalyzeImageAsync(
byte[] imageBytes,
string mimeType,
CancellationToken ct = default) =>
Task.FromResult<IReadOnlyList<ImageParseResult>?>(null);
Task.FromResult<IReadOnlyList<ImageParseResult>?>(null);
public Task<IReadOnlyList<RecognitionBatchModelAction>?> ReconcileRecognitionBatchAsync(
RecognitionBatchModelInput input,
CancellationToken ct = default) =>
Task.FromResult<IReadOnlyList<RecognitionBatchModelAction>?>(null);
public Task<(bool Ok, string? Error)> TestConnectionAsync(
CancellationToken ct = default) =>