Files
2026-09-18 15:26:19 +08:00

484 lines
12 KiB
Python

from datetime import datetime
from typing import Any
from ninja import Schema
class TicketIn(Schema):
title: str
description: str
category_code: str | None = None
priority: str = "medium"
problem_performance: str = ""
problem_object: str = ""
submitter_name: str = ""
submitter_org: str = ""
impact_scope: str = ""
environment: str = ""
related_system: str = ""
product_name: str = ""
module_name: str = ""
tags: list[str] = []
attempted_actions: str = ""
error_information: str = ""
customer_request: str = ""
current_result: str = ""
assignee_id: int | None = None
problem_started_at: datetime | None = None
customer_last_message_at: datetime | None = None
support_first_response_at: datetime | None = None
support_last_reply_at: datetime | None = None
class TicketUpdateIn(Schema):
title: str | None = None
description: str | None = None
category_code: str | None = None
priority: str | None = None
problem_performance: str | None = None
problem_object: str | None = None
submitter_name: str | None = None
submitter_org: str | None = None
impact_scope: str | None = None
environment: str | None = None
related_system: str | None = None
product_name: str | None = None
module_name: str | None = None
tags: list[str] | None = None
attempted_actions: str | None = None
error_information: str | None = None
customer_request: str | None = None
current_result: str | None = None
assignee_id: int | None = None
problem_started_at: datetime | None = None
customer_last_message_at: datetime | None = None
support_first_response_at: datetime | None = None
support_last_reply_at: datetime | None = None
class TicketStatusIn(Schema):
status: str
remark: str = ""
resolution: str = ""
replied_to_customer: bool | None = None
class TicketUserOut(Schema):
id: int
username: str
display_name: str
class TicketCategoryOut(Schema):
id: int
code: str
name: str
description: str
class TicketOut(Schema):
id: int
ticket_no: str
title: str
description: str
category: TicketCategoryOut | None = None
category_code: str | None = None
status: str
priority: str
problem_performance: str
problem_object: str
submitter_name: str
submitter_org: str
resolution: str
resolution_id: int | None
resolution_type: str | None
resolution_source: str | None
resolution_root_cause: str
linked_solution_id: int | None
is_resolved: bool
replied_to_customer: bool
impact_scope: str
environment: str
related_system: str
product_name: str
module_name: str
tags: list[str]
attempted_actions: str
error_information: str
customer_request: str
current_result: str
requester_id: int | None
assignee_id: int | None
follow_up_of_id: int | None
requester: TicketUserOut | None = None
assignee: TicketUserOut | None = None
problem_started_at: datetime | None
customer_last_message_at: datetime | None
support_first_response_at: datetime | None
support_last_reply_at: datetime | None
resolved_at: datetime | None
closed_at: datetime | None
archived_at: datetime | None
archived_by: TicketUserOut | None = None
created_at: datetime
updated_at: datetime
class TicketListOut(Schema):
items: list[TicketOut]
page: int
page_size: int
total: int
total_pages: int
class TicketEventOut(Schema):
id: int
event_type: str
from_value: dict
to_value: dict
remark: str
operator: TicketUserOut | None = None
source: str
agent_run_id: int | None
metadata: dict[str, Any]
created_at: datetime
class TicketCommentIn(Schema):
content: str
comment_type: str = "user"
visibility: str = "internal"
class TicketCommentOut(Schema):
id: int
content: str
comment_type: str
visibility: str
created_by: TicketUserOut | None = None
created_at: datetime
class TicketCollaboratorIn(Schema):
user_id: int
role: str = "collaborator"
class TicketCollaboratorOut(Schema):
id: int
user: TicketUserOut
role: str
added_by: TicketUserOut | None = None
created_at: datetime
class TicketFieldEvidenceOut(Schema):
id: int
field_name: str
value: Any
source: str
confidence: float | None
evidence: dict[str, Any]
agent_run_id: int | None
is_protected: bool
created_by: TicketUserOut | None = None
created_at: datetime
class TicketAttachmentIn(Schema):
file_name: str
file_type: str = ""
mime_type: str = ""
file_size: int = 0
storage_path: str
class TicketAttachmentOut(Schema):
id: int
file_name: str
file_type: str
mime_type: str
file_size: int
storage_path: str
sha256: str
scan_status: str
scan_result: dict[str, Any]
parse_status: str
parse_error: str
parsed_text: str
created_at: datetime
class TicketIntakeTraceOut(Schema):
available: bool
public_id: str | None = None
status: str = ""
source_text: str = ""
problem_valid: bool | None = None
invalid_reason: str = ""
missing_fields: list[str] = []
message_timeline: list[dict[str, Any]] = []
agent_run_public_id: str | None = None
class TicketSimilaritySuggestionOut(Schema):
ticket_id: int
ticket_no: str
title: str
status: str
category_code: str | None
score: float
title_similarity: float
keyword_score: float
matched_excerpt: str
algorithm_version: str
created_at: datetime | None = None
class TicketSupportAnalysisOut(Schema):
id: int
ticket_id: int
run_public_id: str
agent_version: int
status: str
progress_stage: str
progress_message: str
query: str
retrieval_policy: dict[str, Any]
result_mode: str
references: list[dict[str, Any]]
final_output: Any | None
automation_decision: dict[str, Any]
applied_solution_id: int | None
processed_at: datetime | None
error_code: str
error_message: str
created_at: datetime
started_at: datetime | None
finished_at: datetime | None
class TicketKnowledgeDistillationOut(Schema):
id: int
ticket_id: int
run_public_id: str
agent_version: int
status: str
progress_stage: str
progress_message: str
references: list[dict[str, Any]]
retrieval_policy: dict[str, Any]
final_output: Any | None
should_distill: bool | None
reason: str
assessment: dict[str, Any]
knowledge_item_id: int | None
troubleshooting_plan_id: int | None
solution_id: int | None
processed_at: datetime | None
error_code: str
error_message: str
created_at: datetime
started_at: datetime | None
finished_at: datetime | None
class CustomerReplyRevisionOut(Schema):
version: int
content: str
source: str
edited_by_id: int | None
created_at: datetime
class CustomerReplyTaskOut(Schema):
id: int
ticket_id: int
support_analysis_id: int | None
status: str
draft_text: str
final_text: str
revision: int
created_by_id: int | None
updated_by_id: int | None
approved_by_id: int | None
approved_at: datetime | None
sent_by_id: int | None
sent_at: datetime | None
created_at: datetime
updated_at: datetime
revisions: list[CustomerReplyRevisionOut]
class CustomerReplyUpdateIn(Schema):
final_text: str
expected_revision: int
class CustomerReplyConfirmIn(Schema):
expected_revision: int
class TicketAutomationOut(Schema):
public_id: str
ticket_id: int
ticket_status: str
status: str
current_step: str
display_phase: str
next_human_action: str
blocking_missing_fields: list[str]
blocking_questions: list[str]
retry_count: int
last_error_code: str
last_error_message: str
support_analysis_id: int | None
reply_task_id: int | None
next_action_at: datetime | None
approved_at: datetime | None
started_at: datetime | None
finished_at: datetime | None
created_at: datetime
updated_at: datetime
class TicketAutomationApproveIn(Schema):
expected_ticket_updated_at: datetime
expected_reply_revision: int
final_text: str
resolution_text: str = ""
root_cause: str = ""
solution_id: int | None = None
channel_endpoint_id: int | None = None
external_conversation_id: str = ""
manual_delivery_confirmed: bool = False
class TicketAutomationActionIn(Schema):
action: str
class IntakeEvaluationRecordIn(Schema):
case_key: str
draft_public_id: str
class IntakeEvaluationResultOut(Schema):
id: int
case_key: str
case_source_kind: str
draft_public_id: str
ticket_id: int | None
actual_auto_created: bool
correct_field_count: int
evaluated_field_count: int
field_accuracy: float | None
passed: bool
details: dict[str, Any]
created_at: datetime
updated_at: datetime
class IntakeRateMetricOut(Schema):
valid_input_count: int
auto_created_count: int
auto_creation_rate: float | None
class IntakeEvaluationMetricOut(Schema):
enabled_case_count: int
reviewed_case_count: int
coverage_rate: float | None
valid_input_count: int
auto_created_count: int
auto_creation_rate: float | None
correct_field_count: int
evaluated_field_count: int
field_accuracy: float | None
evidence_covered_field_count: int
evidence_field_count: int
evidence_coverage_rate: float | None
correct_timeline_item_count: int
evaluated_timeline_item_count: int
timeline_accuracy: float | None
result_selection: str
class IntakeQualityTargetsOut(Schema):
auto_creation_rate: float
field_accuracy: float
coverage_complete: bool
auto_creation_rate_met: bool | None
field_accuracy_met: bool | None
class IntakeQualityMetricsOut(Schema):
include_synthetic: bool
operational: IntakeRateMetricOut
evaluation: IntakeEvaluationMetricOut
targets: IntakeQualityTargetsOut
class SupportEvaluationRecordIn(Schema):
case_key: str
analysis_id: int
class SupportEvaluationResultOut(Schema):
id: int
case_key: str
case_source_kind: str
analysis_id: int
ticket_id: int
actual_candidate_solution_ids: list[int]
actual_citation_ranks: list[int]
matched_expected_solution: bool
actual_auto_resolved: bool
actual_manual_fallback: bool
incorrect_auto_reuse: bool
citations_valid: bool
passed: bool
details: dict[str, Any]
created_at: datetime
updated_at: datetime
class SupportEvaluationMetricOut(Schema):
enabled_case_count: int
reviewed_case_count: int
coverage_rate: float | None
expected_match_case_count: int
matched_solution_count: int
solution_match_rate: float | None
eligible_auto_resolve_case_count: int
auto_resolved_count: int
eligible_auto_resolve_rate: float | None
actual_auto_resolved_count: int
incorrect_auto_reuse_count: int
incorrect_auto_reuse_rate: float | None
expected_manual_fallback_count: int
manual_fallback_count: int
manual_fallback_accuracy: float | None
citation_valid_count: int
citation_validity_rate: float | None
result_selection: str
class SupportQualityTargetsOut(Schema):
solution_match_rate: float
eligible_auto_resolve_rate: float
incorrect_auto_reuse_rate: float
coverage_complete: bool
solution_match_rate_met: bool | None
eligible_auto_resolve_rate_met: bool | None
incorrect_auto_reuse_rate_met: bool | None
manual_fallback_accuracy_met: bool | None
citation_validity_rate_met: bool | None
class SupportQualityMetricsOut(Schema):
include_synthetic: bool
evaluation: SupportEvaluationMetricOut
targets: SupportQualityTargetsOut