/
afanasevn
/
PdfEncoder
Обзор
Документация
Войти
/
afanasevn
/
PdfEncoder
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/PdfEncoder.Infrastructure/Llm/StructuredExtractor.cs
59 строк
2 KB
IBS\NAfanasev
Remote LLM base functional
01 июл 2026, 15:54
01 июл 2026, 15:54
05aa80e
Код
Авторство
О чём код?
using System.Text.Json; using Microsoft.Extensions.Options; using PdfEncoder.Application.Abstractions; using PdfEncoder.Application.Models; using PdfEncoder.Application.Options; using PdfEncoder.Domain.Models; namespace PdfEncoder.Infrastructure.Llm; /// <summary> /// LLM structured extraction в generic schema. /// </summary> public sealed class StructuredExtractor( ILlmClient llmClient, PromptTemplateProvider promptProvider, IOptions<LlmModelOptions> options) : IStructuredExtractor { private static readonly JsonSerializerOptions ContextJsonOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = false }; /// <inheritdoc /> public async Task<StructuredExtractionResult> ExtractAsync( DocumentContext context, string detectedDocumentType, Guid documentJobId, CancellationToken ct) { var contextJson = JsonSerializer.Serialize(context, ContextJsonOptions); var userPrompt = PromptTemplateProvider.Format( promptProvider.GetTemplate("extract-user.txt"), new Dictionary<string, string> { ["detectedType"] = detectedDocumentType, ["documentContextJson"] = contextJson }); var completion = await llmClient.CompleteStructuredAsync<LlmExtractResponseDto>( new LlmStructuredRequest { Model = options.Value.ExtractionModel, SystemPrompt = promptProvider.GetTemplate("extract-system.txt"), UserPrompt = userPrompt, StepName = "llm-extract", DocumentJobId = documentJobId, PreferNativeJsonObject = options.Value.UseNativeJsonObject }, ct); return new StructuredExtractionResult { Fields = completion.Data.Fields ?? [], Tables = completion.Data.Tables ?? [], Warnings = completion.Data.Warnings ?? [] }; } }