tender summary response fix
This commit is contained in:
@@ -53,8 +53,9 @@ func (c *Client) FetchSummaryOnDemand(ctx context.Context, reqBody SummarizeRequ
|
||||
for attempt := 0; attempt <= c.config.APIRetryCount; attempt++ {
|
||||
if attempt > 0 {
|
||||
c.logger.Warn("Retrying AI summarize request", map[string]interface{}{
|
||||
"notice_id": reqBody.NoticeID,
|
||||
"attempt": attempt,
|
||||
"contract_folder_id": reqBody.ContractFolderID,
|
||||
"notice_publication_id": reqBody.NoticePublicationID,
|
||||
"attempt": attempt,
|
||||
})
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
@@ -67,9 +68,10 @@ func (c *Client) FetchSummaryOnDemand(ctx context.Context, reqBody SummarizeRequ
|
||||
if err != nil {
|
||||
lastErr = err
|
||||
c.logger.Error("AI summarize request failed", map[string]interface{}{
|
||||
"notice_id": reqBody.NoticeID,
|
||||
"attempt": attempt,
|
||||
"error": err.Error(),
|
||||
"contract_folder_id": reqBody.ContractFolderID,
|
||||
"notice_publication_id": reqBody.NoticePublicationID,
|
||||
"attempt": attempt,
|
||||
"error": err.Error(),
|
||||
})
|
||||
continue
|
||||
}
|
||||
@@ -205,8 +207,9 @@ func (c *Client) doPost(ctx context.Context, url string, jsonBody []byte) (*Summ
|
||||
}
|
||||
|
||||
c.logger.Info("AI summarize request succeeded", map[string]interface{}{
|
||||
"notice_id": result.NoticeID,
|
||||
"summaries_count": len(result.Summaries),
|
||||
"contract_folder_id": result.ContractFolderID,
|
||||
"notice_publication_id": result.ResolvedNoticePublicationID(),
|
||||
"summaries_count": len(result.Summaries),
|
||||
})
|
||||
|
||||
return &result, nil
|
||||
|
||||
@@ -1,26 +1,79 @@
|
||||
package ai_summarizer
|
||||
|
||||
import "strings"
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 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
|
||||
ContractFolderID string `json:"contract_folder_id"`
|
||||
NoticePublicationID string `json:"notice_publication_id"`
|
||||
DocumentURL string `json:"document_url,omitempty"`
|
||||
Title string `json:"title,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
Country string `json:"country,omitempty"`
|
||||
EstimatedValue *float64 `json:"estimated_value,omitempty"`
|
||||
Currency string `json:"currency,omitempty"`
|
||||
SubmissionDeadline string `json:"submission_deadline,omitempty"`
|
||||
AuthorityName string `json:"authority_name,omitempty"`
|
||||
}
|
||||
|
||||
// SummarizeRequestInput collects fields used to build SummarizeRequest.
|
||||
type SummarizeRequestInput struct {
|
||||
ContractFolderID string
|
||||
NoticePublicationID string
|
||||
DocumentURL string
|
||||
Title string
|
||||
Description string
|
||||
Country string
|
||||
Currency string
|
||||
SubmissionDeadline int64 // Unix seconds; omitted from request when zero
|
||||
EstimatedValue float64
|
||||
AuthorityName string
|
||||
}
|
||||
|
||||
// NewSummarizeRequest builds a SummarizeRequest for POST /ai/summarize.
|
||||
func NewSummarizeRequest(in SummarizeRequestInput) SummarizeRequest {
|
||||
req := SummarizeRequest{
|
||||
ContractFolderID: strings.TrimSpace(in.ContractFolderID),
|
||||
NoticePublicationID: strings.TrimSpace(in.NoticePublicationID),
|
||||
DocumentURL: strings.TrimSpace(in.DocumentURL),
|
||||
Title: in.Title,
|
||||
Description: in.Description,
|
||||
Country: in.Country,
|
||||
Currency: in.Currency,
|
||||
AuthorityName: strings.TrimSpace(in.AuthorityName),
|
||||
}
|
||||
if in.EstimatedValue > 0 {
|
||||
v := in.EstimatedValue
|
||||
req.EstimatedValue = &v
|
||||
}
|
||||
if in.SubmissionDeadline > 0 {
|
||||
req.SubmissionDeadline = time.Unix(in.SubmissionDeadline, 0).UTC().Format(time.RFC3339)
|
||||
}
|
||||
return req
|
||||
}
|
||||
|
||||
// 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
|
||||
ContractFolderID string `json:"contract_folder_id"`
|
||||
NoticePublicationID string `json:"notice_publication_id"`
|
||||
NoticeID string `json:"notice_id"` // legacy field name
|
||||
Summaries []DocumentSummary `json:"summaries"`
|
||||
OverallSummary *string `json:"overall_summary"`
|
||||
}
|
||||
|
||||
// ResolvedNoticePublicationID returns the notice publication ID from the response.
|
||||
func (r *SummarizeResponse) ResolvedNoticePublicationID() string {
|
||||
if r == nil {
|
||||
return ""
|
||||
}
|
||||
if id := strings.TrimSpace(r.NoticePublicationID); id != "" {
|
||||
return id
|
||||
}
|
||||
return strings.TrimSpace(r.NoticeID)
|
||||
}
|
||||
|
||||
// DocumentSummary represents a summary for a single document within the AI response.
|
||||
|
||||
Reference in New Issue
Block a user