feat: organize news packages into verified event timelines
Add optional events, evidence-backed timelines, versioned package corrections and bounded historical reprocessing. Keep independent packages readable and isolate retries by failed stage. Configure reasoning effort per model stage and refresh default news Skill drafts without publishing.
This commit is contained in:
1 parent
2f1e07b7b1
commit
f1d060d475
28 files changed
+1983
-149
No files matched your search
@@ -6,9 +6,16 @@ export const saveRiskSettingsApi = (data: Risk.Settings) => request<null>({ url:
|
||||
export const enableRiskApi = (data: Risk.Settings) => request<null>({ url: "/risk/enable", method: "post", timeout: 650000, data })
|
||||
export const getRiskOverviewApi = (hours: number) => request<Risk.Overview>({ url: "/risk/overview", method: "get", params: { hours } })
|
||||
export const listRiskEventsApi = (params: Risk.EventQuery) => request<{ items: Risk.RiskEvent[], total: number }>({ url: "/risk/summaries", method: "get", params })
|
||||
export const getRiskEventApi = (id: number) => request<{ evidence: { id: number, kind: string, data: unknown, fetched_at: string }[], event: Risk.RiskEvent, history: Risk.Analysis[], versions: { id: number, revision: number, state: string, model: string, result: Risk.RiskResult | null, error: string | null, analyzed_at: string | null }[] }>({ url: `/risk/summaries/${id}`, method: "get" })
|
||||
export const getRiskEventApi = (id: number) => request<{ related_events?: { id: number, reason: string }[], corrections?: { id: number, result: unknown }[], grouping_versions?: { id: number, state: string, error: string | null }[], evidence: { id: number, kind: string, data: unknown, fetched_at: string }[], event: Risk.RiskEvent, history: Risk.Analysis[], versions: { id: number, revision: number, state: string, model: string, result: Risk.RiskResult | null, error: string | null, analyzed_at: string | null }[] }>({ url: `/risk/summaries/${id}`, method: "get" })
|
||||
export const listRiskAnalysesApi = (params: { news_id?: number, revision_no?: number, failed?: boolean, stage?: string }, notify = true) => request<Risk.Analysis[]>({ url: "/risk/tasks", method: "get", params, notify })
|
||||
export const retryRiskAnalysisApi = (id: number, stage = "grouping") => request<null>({ url: `/risk/tasks/${id}/retry`, method: "post", params: { stage } })
|
||||
|
||||
export const listNewsSummariesApi = (newsId: number, revision: number) => request<Risk.RiskEvent[]>({ url: `/risk/news/${newsId}/summaries`, method: "get", params: { revision_no: revision } })
|
||||
export const createNewsSkillTemplatesApi = () => request<{ grouping_skill_id: number, analysis_skill_id: number, outlook_skill_id: number }>({ url: "/risk/skill-templates", method: "post" })
|
||||
export const createNewsSkillTemplatesApi = (refreshExisting = false) => request<{ grouping_skill_id: number, analysis_skill_id: number, outlook_skill_id: number }>({ url: "/risk/skill-templates", method: "post", data: { refresh_existing: refreshExisting } })
|
||||
export const listNewsEventsApi = (page = 1) => request<{ items: Risk.NewsEvent[], total: number }>({ url: "/risk/events", method: "get", params: { page } })
|
||||
export const getNewsEventApi = (id: number) => request<Risk.EventDetail>({ url: `/risk/events/${id}`, method: "get" })
|
||||
export const previewReprocessApi = (data: Risk.ReprocessRange) => request<Risk.ReprocessPreview>({ url: "/risk/reprocess/preview", method: "post", data })
|
||||
export const startReprocessApi = (data: Risk.ReprocessRange) => request<{ id: number }>({ url: "/risk/reprocess", method: "post", data })
|
||||
export const listReprocessApi = () => request<Risk.ReprocessJob[]>({ url: "/risk/reprocess", method: "get" })
|
||||
export const cancelReprocessApi = (id: number) => request<null>({ url: `/risk/reprocess/${id}/cancel`, method: "post" })
|
||||
export const retryReprocessApi = (id: number) => request<null>({ url: `/risk/reprocess/${id}/retry`, method: "post" })
|
||||
@@ -1,3 +1,5 @@
|
||||
import type { Effort } from "../settings/type"
|
||||
|
||||
export interface RiskResult {
|
||||
summary: string
|
||||
reasoning: string
|
||||
@@ -19,6 +21,8 @@ export interface RiskResult {
|
||||
evidence_refs?: { article_id: number, quote: string }[]
|
||||
}
|
||||
export interface RiskEvent {
|
||||
main_event_id?: number | null
|
||||
replacement_ids?: number[]
|
||||
tags: string[]
|
||||
content_kind: string
|
||||
importance_stars: number
|
||||
@@ -46,6 +50,9 @@ export interface Settings {
|
||||
second_model: string
|
||||
third_provider_id: number | null
|
||||
third_model: string
|
||||
reasoning_effort: Effort | null
|
||||
second_reasoning_effort: Effort | null
|
||||
third_reasoning_effort: Effort | null
|
||||
grouping_skill_id: number | null
|
||||
analysis_skill_id: number | null
|
||||
outlook_skill_id: number | null
|
||||
@@ -62,14 +69,14 @@ export interface Analysis {
|
||||
analyzed_at: string | null
|
||||
historical: boolean
|
||||
}
|
||||
export interface Reading { id: number, revision: number, priority: number, reason: string }
|
||||
export interface Reading { kind?: "package" | "event", id: number, revision: number, priority: number, reason: string }
|
||||
export interface Trend { summary: string, conditions: string, counter_evidence: string, watchpoints: string }
|
||||
export interface Briefing {
|
||||
reading: Reading[]
|
||||
expansion: Reading[]
|
||||
as_of: string
|
||||
synthesis: { summary: string, market: string, short_term: Trend, medium_term: Trend } | null
|
||||
inputs: { id: number, revision: number, category: string, tags: string[], result: RiskResult & { title: string } }[]
|
||||
inputs: { kind?: "package" | "event", id: number, revision: number, category: string, tags: string[], result: RiskResult & { title: string } }[]
|
||||
}
|
||||
export interface Overview {
|
||||
briefing: Briefing | null
|
||||
@@ -86,3 +93,29 @@ export interface Overview {
|
||||
heartbeat: string | null
|
||||
}
|
||||
export interface EventQuery { tag?: string, importance?: number, hours?: number, stars?: number, q?: string, category?: string, asset?: string, start?: string, end?: string, page?: number }
|
||||
|
||||
export interface TimelinePoint {
|
||||
occurred_at: string | null
|
||||
time_precision: string
|
||||
time_text: string
|
||||
reported_at: string | null
|
||||
description: string
|
||||
verification: string
|
||||
package_id: number
|
||||
package_revision: number
|
||||
evidence_refs: { article_id: number, quote: string }[]
|
||||
}
|
||||
export interface NewsEvent {
|
||||
id: number
|
||||
title: string
|
||||
state: string
|
||||
error: string | null
|
||||
result: { summary: string, importance_stars: number, risk_stars: number, counter_evidence: string, timeline_points: TimelinePoint[], uncertainty: string, opinions: string, watchpoints: string } | null
|
||||
}
|
||||
export interface EventDetail extends NewsEvent {
|
||||
packages: RiskEvent[]
|
||||
versions: { id: number, revision: number, state: string, error: string | null, result: NewsEvent["result"] }[]
|
||||
}
|
||||
export interface ReprocessRange { start: string, end: string }
|
||||
export interface ReprocessPreview { articles: number, packages: number, events: number }
|
||||
export interface ReprocessJob { id: number, state: string, total: number, completed: number, failures: { stage: "grouping" | "analysis" | "events" | "outlook", id: number, error: string }[] }
|
||||
Reference in new issue
Block a user