Implement AI analysis trigger endpoint and refactor related components
- Added a new endpoint to trigger on-demand agentic analysis for tenders via the AI service. - Introduced `TriggerAIAnalyze` method in the `TenderHandler` to handle requests and responses for AI analysis. - Updated the `tenderService` to include `TriggerAIAnalyze` method, which validates input and interacts with the AI summarizer client. - Enhanced the `AIAnalyzeResponse` and `AIAnalyzeDocument` structures to support the new analysis feature. - Refactored the `DocumentSummarizationWorker` and `TranslationWorker` to remove deprecated MinIO dependencies, streamlining the AI service interactions. This update improves the functionality of the tender management system by allowing users to trigger AI analysis on-demand, enhancing the overall user experience and system capabilities.
This commit is contained in:
@@ -326,8 +326,9 @@ func (s *StorageClient) GetSummaryFromStorage(ctx context.Context, contractFolde
|
||||
return s.getSummaryFromObjectKey(ctx, prefix+"tender.json", contractFolderID, noticePublicationID)
|
||||
}
|
||||
|
||||
// GetTranslationFromStorage reads tender.json and returns the translation for a language
|
||||
// when translation_status.done includes that language.
|
||||
// GetTranslationFromStorage reads tender.json and returns the translation for a language.
|
||||
// It prefers entries marked done in translation_status; if missing, it falls back to
|
||||
// translations[<lang>] when title is non-empty (on-demand API may lag status updates).
|
||||
func (s *StorageClient) GetTranslationFromStorage(ctx context.Context, contractFolderID, noticePublicationID, language string) (StoredTranslation, error) {
|
||||
if strings.TrimSpace(contractFolderID) == "" {
|
||||
return StoredTranslation{}, fmt.Errorf("ai_summarizer: contractFolderID is required")
|
||||
@@ -353,14 +354,16 @@ func (s *StorageClient) getTranslationFromObjectKey(ctx context.Context, objectK
|
||||
return StoredTranslation{}, err
|
||||
}
|
||||
|
||||
if entry, ok := tenderJSON.translationForLanguage(language); ok {
|
||||
return entry, nil
|
||||
}
|
||||
if entry, ok := tenderJSON.storedTranslationText(language); ok {
|
||||
return entry, nil
|
||||
}
|
||||
if !languageInDone(tenderJSON.translationsDone(), language) {
|
||||
return StoredTranslation{}, ErrTranslationNotReady
|
||||
}
|
||||
entry, ok := tenderJSON.translationForLanguage(language)
|
||||
if !ok {
|
||||
return StoredTranslation{}, ErrNoTranslation
|
||||
}
|
||||
return entry, nil
|
||||
return StoredTranslation{}, ErrNoTranslation
|
||||
}
|
||||
|
||||
// getSummaryFromObjectKey reads tender.json at objectKey and returns summary text when ready.
|
||||
@@ -432,6 +435,39 @@ func (s *StorageClient) getSummaryFromObjectKey(ctx context.Context, objectKey,
|
||||
return summaryText, nil
|
||||
}
|
||||
|
||||
// GetDocumentSummariesFromStorage reads per-document summaries from tender.json
|
||||
// when summarize_status.done is true.
|
||||
func (s *StorageClient) GetDocumentSummariesFromStorage(ctx context.Context, contractFolderID, noticePublicationID string) ([]DocumentSummary, error) {
|
||||
if strings.TrimSpace(contractFolderID) == "" {
|
||||
return nil, fmt.Errorf("ai_summarizer: contractFolderID is required")
|
||||
}
|
||||
if strings.TrimSpace(noticePublicationID) == "" {
|
||||
return nil, fmt.Errorf("ai_summarizer: noticePublicationID is required")
|
||||
}
|
||||
|
||||
prefix, err := s.resolveNoticeStoragePrefix(ctx, contractFolderID, noticePublicationID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tenderJSON, err := s.readTenderJSONAtKey(ctx, prefix+"tender.json")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
done, _ := tenderJSON.resolved()
|
||||
if !done {
|
||||
return nil, ErrSummaryNotReady
|
||||
}
|
||||
if len(tenderJSON.Summaries) == 0 {
|
||||
return []DocumentSummary{}, nil
|
||||
}
|
||||
|
||||
out := make([]DocumentSummary, len(tenderJSON.Summaries))
|
||||
copy(out, tenderJSON.Summaries)
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// IsSummaryReady is a convenience method that checks whether the tender.json
|
||||
// exists and the summarize_status.done flag is true, without returning the
|
||||
// actual summary text.
|
||||
|
||||
Reference in New Issue
Block a user