484 lines
12 KiB
Python
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
|