refactor(monitoring): simplify brand dashboard and harden citation rendering
- drop brand_time_buckets and sparkline/coverage UI; dashboard now returns a single day - compute mention rate from total actual samples instead of averaging per-platform rates - canonicalize ai_platform_id across services and aggregate platform-overview snapshots - strip mojibake and non-answer noise from callback payloads and question detail answers - keep Kimi citations panel-only; still store raw search_results for audit - render linked [n] inline citations for qwen/yuanbao answers with scroll-to-source behavior - restrict立即采集 to today's business date with a clear i18n hint - refresh content-citations into an ant-design table with truncation and hover styling Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1683,6 +1683,8 @@ func (s *MonitoringCallbackService) upsertParseResult(ctx context.Context, tx pg
|
||||
}
|
||||
|
||||
func (s *MonitoringCallbackService) processTaskResult(ctx context.Context, task *monitoringCollectTask, req MonitoringTaskResultRequest) (*MonitoringTaskResultResponse, error) {
|
||||
req = normalizeMonitoringTaskResultRequestValue(req)
|
||||
|
||||
runStatus := normalizeRunStatus(req.Status)
|
||||
if runStatus == "" {
|
||||
return nil, response.ErrBadRequest(40041, "invalid_status", "status must be succeeded or failed")
|
||||
@@ -1703,7 +1705,7 @@ func (s *MonitoringCallbackService) processTaskResult(ctx context.Context, task
|
||||
completedAt = req.CompletedAt.UTC().Round(0)
|
||||
}
|
||||
|
||||
rawPayload, sourceInputs := buildMonitoringRawPayload(req)
|
||||
rawPayload, sourceInputs := buildMonitoringRawPayload(task.AIPlatformID, req)
|
||||
|
||||
tx, err := s.monitoringPool.Begin(ctx)
|
||||
if err != nil {
|
||||
@@ -2280,7 +2282,7 @@ func (s *MonitoringCallbackService) PatchTaskResultQueueMeta(taskID int64, recei
|
||||
s.tryPatchTaskResultQueueMeta(taskID, receivedAt, patch)
|
||||
}
|
||||
|
||||
func buildMonitoringRawPayload(req MonitoringTaskResultRequest) ([]byte, []MonitoringSourceItem) {
|
||||
func buildMonitoringRawPayload(platformID string, req MonitoringTaskResultRequest) ([]byte, []MonitoringSourceItem) {
|
||||
payload := make(map[string]interface{}, len(req.RawResponseJSON)+4)
|
||||
for key, value := range req.RawResponseJSON {
|
||||
payload[key] = value
|
||||
@@ -2299,16 +2301,7 @@ func buildMonitoringRawPayload(req MonitoringTaskResultRequest) ([]byte, []Monit
|
||||
payload["status"] = strings.TrimSpace(req.Status)
|
||||
}
|
||||
|
||||
sourceInputs := append([]MonitoringSourceItem{}, req.Citations...)
|
||||
sourceInputs = append(sourceInputs, req.SearchResults...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["citations"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["references"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["sources"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["thought_references"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["thinking_references"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["search_results"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["searchResults"])...)
|
||||
|
||||
sourceInputs := buildMonitoringCitationSourceInputs(platformID, req, payload)
|
||||
if len(payload) == 0 {
|
||||
return nil, sourceInputs
|
||||
}
|
||||
@@ -2320,6 +2313,34 @@ func buildMonitoringRawPayload(req MonitoringTaskResultRequest) ([]byte, []Monit
|
||||
return data, sourceInputs
|
||||
}
|
||||
|
||||
func buildMonitoringCitationSourceInputs(platformID string, req MonitoringTaskResultRequest, payload map[string]interface{}) []MonitoringSourceItem {
|
||||
includeSearchResults := !monitoringPlatformUsesDedicatedCitationPanel(platformID)
|
||||
|
||||
sourceInputs := append([]MonitoringSourceItem{}, req.Citations...)
|
||||
if includeSearchResults {
|
||||
sourceInputs = append(sourceInputs, req.SearchResults...)
|
||||
}
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["citations"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["references"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["sources"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["thought_references"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["thinking_references"])...)
|
||||
if includeSearchResults {
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["search_results"])...)
|
||||
sourceInputs = append(sourceInputs, extractMonitoringSourceItems(payload["searchResults"])...)
|
||||
}
|
||||
return sourceInputs
|
||||
}
|
||||
|
||||
func monitoringPlatformUsesDedicatedCitationPanel(platformID string) bool {
|
||||
switch normalizeMonitoringPlatformID(platformID) {
|
||||
case "kimi":
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func newMonitoringTaskResultEnvelope(task *monitoringCollectTask, installationID string, receivedAt time.Time, req MonitoringTaskResultRequest) monitoringTaskResultEnvelope {
|
||||
return monitoringTaskResultEnvelope{
|
||||
Version: "v1",
|
||||
|
||||
Reference in New Issue
Block a user