diff --git a/ai-compliance-sdk/internal/api/handlers/rag_handlers.go b/ai-compliance-sdk/internal/api/handlers/rag_handlers.go index 1842c43b..e8613b7a 100644 --- a/ai-compliance-sdk/internal/api/handlers/rag_handlers.go +++ b/ai-compliance-sdk/internal/api/handlers/rag_handlers.go @@ -111,11 +111,33 @@ func (h *RAGHandlers) Retrieve(c *gin.Context) { return } + // C-FN: Fußnoten-Hits als separates footnotes[] herausziehen (Frontend RawFootnote-Shape), + // damit der Advisor-Evidence-Workspace sie im dedizierten Fußnoten-Bereich rendert. Die Hits + // bleiben zusätzlich in results[] (LLM-Kontext). figures[] = C8-Platzhalter (leer bis C8). + footnotes := make([]gin.H, 0) + for _, r := range results { + if !r.IsFootnote { + continue + } + footnotes = append(footnotes, gin.H{ + "id": r.CitationUnit, + "ref": r.CitationUnit, + "number": r.FootnoteLabel, + "regulation_code": r.RegulationCode, + "regulation_short": r.RegulationShort, + "regulation_name": r.RegulationName, + "section": r.RefCitationUnit, + "text": r.FootnoteVerbatim, + }) + } + c.JSON(http.StatusOK, gin.H{ "query": req.Query, "results": results, "count": len(results), "assessment": ucca.Assess(results), + "footnotes": footnotes, + "figures": []gin.H{}, }) } diff --git a/ai-compliance-sdk/internal/ucca/legal_rag_types.go b/ai-compliance-sdk/internal/ucca/legal_rag_types.go index a47327d2..16bd8f2a 100644 --- a/ai-compliance-sdk/internal/ucca/legal_rag_types.go +++ b/ai-compliance-sdk/internal/ucca/legal_rag_types.go @@ -37,6 +37,14 @@ type LegalSearchResult struct { // Supersede-Status (status="superseded", use_for_primary=false) — Alt-Quelle, // die fuer Default-Fragen demoted wird (nicht versteckt; fuer Historie auffindbar). Superseded bool `json:"-"` + + // C-FN Fußnoten-Evidence — intern (json:"-", kein Pro-Result-Contract-Change), + // aus dem Qdrant-Payload befuellt; der /retrieve-Handler baut daraus das Top-Level + // footnotes[] fuer den Advisor-Evidence-Workspace (Frontend RawFootnote). + IsFootnote bool `json:"-"` + FootnoteLabel string `json:"-"` + FootnoteVerbatim string `json:"-"` + RefCitationUnit string `json:"-"` } // LegalAssessment is the auditable explanation layer over a ranked result set: diff --git a/ai-compliance-sdk/internal/ucca/multi_regulation.go b/ai-compliance-sdk/internal/ucca/multi_regulation.go index 890a5e2c..df9d7cc7 100644 --- a/ai-compliance-sdk/internal/ucca/multi_regulation.go +++ b/ai-compliance-sdk/internal/ucca/multi_regulation.go @@ -195,6 +195,11 @@ func hitsToResults(hits []qdrantSearchHit) []LegalSearchResult { ReferencesOut: getStringSlice(hit.Payload, "references_out"), ReferencesIn: getStringSlice(hit.Payload, "references_in"), Superseded: getString(hit.Payload, "status") == "superseded", + + IsFootnote: getBool(hit.Payload, "is_footnote"), + FootnoteLabel: getString(hit.Payload, "footnote_label"), + FootnoteVerbatim: getString(hit.Payload, "footnote_verbatim"), + RefCitationUnit: getString(hit.Payload, "ref_citation_unit"), } } return results