Files
tm_back/pkg/ai_summarizer/entities.go
T
2026-05-13 18:24:45 +03:30

93 lines
4.0 KiB
Go

package ai_summarizer
import "strings"
// SummarizeRequest represents the request payload sent to the AI service
// POST /ai/summarize endpoint for on-demand summarization.
type SummarizeRequest struct {
NoticeID string `json:"notice_id"` // required
DocumentURL string `json:"document_url"` // required
Title string `json:"title"` // required
Description string `json:"description"` // required
Country string `json:"country,omitempty"` // optional
EstimatedValue *float64 `json:"estimated_value,omitempty"` // optional (pointer to distinguish 0 from absent)
Currency string `json:"currency,omitempty"` // optional
SubmissionDeadline string `json:"submission_deadline,omitempty"` // optional
AuthorityName string `json:"authority_name,omitempty"` // optional
}
// SummarizeResponse represents the response from the AI summarization API.
type SummarizeResponse struct {
NoticeID string `json:"notice_id"`
Summaries []DocumentSummary `json:"summaries"`
OverallSummary *string `json:"overall_summary"` // nil when not available
}
// DocumentSummary represents a summary for a single document within the AI response.
type DocumentSummary struct {
DocumentName string `json:"document_name"`
DocumentType string `json:"document_type"`
Summary string `json:"summary"`
SummaryModel string `json:"summary_model"`
Error string `json:"error"` // empty string when no error
}
// StoredDocument represents a document object stored for a tender in MinIO.
type StoredDocument struct {
ObjectName string `json:"-"`
DocumentName string `json:"document_name"`
Size int64 `json:"size"`
LastModified int64 `json:"last_modified"`
DocumentType string `json:"document_type,omitempty"`
}
// TranslateRequest represents the request payload sent to the AI service
// POST /ai/translate endpoint.
type TranslateRequest struct {
NoticeID string `json:"notice_id"` // required (TED-style notice key)
ContractFolderID string `json:"contract_folder_id"` // required by AI service (procedure / MinIO prefix)
NoticePublicationID string `json:"notice_publication_id"` // required by AI service
Title string `json:"title"` // required
Description string `json:"description"` // required
Language string `json:"language,omitempty"` // optional target language override
}
// TranslateResponse represents the response from the AI translation API.
type TranslateResponse struct {
NoticeID string `json:"notice_id"`
TranslatedTitle string `json:"translated_title"`
TranslatedDescription string `json:"translated_description"`
Language string `json:"language"`
}
// TenderJSON represents the structure of the <notice_id>/tender.json file
// stored in the AI service's MinIO bucket.
type TenderJSON struct {
OverallSummary *string `json:"overall_summary"`
OverallSummaryCamel *string `json:"overallSummary"`
SummarizeStatus SummarizeStatus `json:"summarize_status"`
SummarizeStatusCamel SummarizeStatus `json:"summarizeStatus"`
}
// resolved returns whether summarization is marked done and the best-effort
// overall summary pointer (may be nil or empty when the pipeline finished
// without text yet).
func (t *TenderJSON) resolved() (done bool, overall *string) {
done = t.SummarizeStatus.isDone() || t.SummarizeStatusCamel.isDone()
overall = t.OverallSummary
if overall == nil || strings.TrimSpace(*overall) == "" {
overall = t.OverallSummaryCamel
}
return done, overall
}
// SummarizeStatus represents the summarization status inside tender.json.
type SummarizeStatus struct {
Done bool `json:"done"` // true when the pipeline has finished
DoneUpper bool `json:"Done"` // some writers emit PascalCase
}
func (s SummarizeStatus) isDone() bool {
return s.Done || s.DoneUpper
}