File size: 5,959 Bytes
695b33f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db8e436
 
 
 
 
 
 
 
 
 
 
695b33f
2f4c4da
695b33f
 
 
 
 
2f4c4da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
695b33f
 
6d35100
695b33f
 
 
 
2f4c4da
db8e436
695b33f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d6e1b5
695b33f
 
 
 
 
 
 
5d6e1b5
695b33f
 
 
6853143
 
 
 
de9078a
 
2f4c4da
6853143
6d35100
95115e2
6853143
 
 
 
 
de9078a
6853143
 
 
5d6e1b5
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env python3
"""
Structured outputs for Agent API
"""

from typing import List, Optional
from pydantic import BaseModel, Field


class Message(BaseModel):
    """Chat message"""
    role: str = Field(..., description="Role: 'user' or 'assistant'")
    content: str = Field(..., description="Message content")


class LawyerProfile(BaseModel):
    """Lawyer's professional profile"""
    full_name: Optional[str] = Field(None, description="Lawyer's full name")
    primary_specialty: Optional[str] = Field(None, description="Primary legal specialty")
    legal_specialties: Optional[List[str]] = Field(None, description="List of legal specialties")
    jurisdiction: Optional[str] = Field(None, description="Primary jurisdiction of practice")
    experience_level: Optional[str] = Field(None, description="Experience level (e.g., Junior, Mid-level, Senior, Partner)")
    languages: Optional[List[str]] = Field(None, description="Languages spoken")
    lawyer_description: Optional[str] = Field(None, description="Professional description or bio")


class DocumentAnalysis(BaseModel):
    """Document analysis content"""
    summary: Optional[str] = None
    actors: Optional[str] = None
    key_details: Optional[str] = None


class TreeNode(BaseModel):
    """Node in the document tree (folder or file)"""
    name: str
    type: str = Field(..., description="Type: 'folder' or 'file'")
    file_path: Optional[str] = None
    file_size: Optional[int] = None
    mime_type: Optional[str] = None
    created_at: Optional[str] = None
    analysis: Optional[DocumentAnalysis] = None
    children: Optional[List['TreeNode']] = None


class DocumentsTree(BaseModel):
    """Root of the document tree"""
    name: str = "root"
    type: str = "folder"
    children: Optional[List[TreeNode]] = None


class ChatRequest(BaseModel):
    """Chat request model"""
    userId: str = Field(..., description="Unique user identifier (UUID)")
    message: str = Field(..., description="User's question")
    conversationHistory: Optional[List[Message]] = Field(default=[], description="Previous conversation messages")
    userType: Optional[str] = Field(default="client", description="User type: 'client' for general users or 'lawyer' for legal professionals")
    jurisdiction: Optional[str] = Field(default="Romania", description="Jurisdiction of the user")
    documents_tree: Optional[DocumentsTree] = Field(default=None, description="Hierarchical tree of lawyer's documents")
    lawyerProfile: Optional[LawyerProfile] = Field(default=None, description="Lawyer's professional profile")


class ChatResponse(BaseModel):
    """Chat response model"""
    response: str = Field(..., description="Assistant's response")
    processing_time: float = Field(..., description="Processing time in seconds")
    references: List[str] = Field(default=[], description="Referenced documents")
    timestamp: str = Field(..., description="Response timestamp")
    error: Optional[str] = Field(None, description="Error message if any")


class HealthResponse(BaseModel):
    """Health check response model"""
    status: str = Field(..., description="Health status")
    agent_ready: bool = Field(..., description="Whether agent is ready")
    lightrag_healthy: bool = Field(..., description="Whether LightRAG is healthy")
    timestamp: str = Field(..., description="Health check timestamp")


class AnalyzePDFRequest(BaseModel):
    """PDF analysis request model"""
    pdf_content: str = Field(..., description="Base64 encoded document content (PDF or image)")
    filename: Optional[str] = Field(default="document.pdf", description="Original filename")
    userId: str = Field(..., description="Unique user identifier (UUID) for actors integration")


class AnalyzePDFResponse(BaseModel):
    """PDF analysis response model"""
    actors: str = Field(..., description="Extracted actors")
    key_details: str = Field(..., description="Key details extracted")
    summary: str = Field(..., description="High-level summary")
    extracted_text: Optional[str] = Field(None, description="Extracted text content")
    processing_time: float = Field(..., description="Processing time in seconds")
    timestamp: str = Field(..., description="Analysis timestamp")
    error: Optional[str] = Field(None, description="Error message if any")

class DocCreatorRequest(BaseModel):
    """Document creator request model"""
    instruction: str = Field(..., description="User's instruction for document editing")
    documentContent: str = Field(..., description="HTML document content")
    contentFormat: str = Field(default="html", description="Format of document content (always 'html')")
    documents_tree: Optional[DocumentsTree] = Field(default=None, description="Hierarchical tree of documents for context")
    conversationHistory: Optional[List[Message]] = Field(default=[], description="Previous conversation messages")
    userId: str = Field(..., description="Unique user identifier (UUID)")
    documentId: str = Field(None, description="Document ID for live updates (UUID)")


class DocCreatorResponse(BaseModel):
    """Document creator response model"""
    response: str = Field(..., description="Assistant's response")
    modifiedDocument: Optional[str] = Field(None, description="Modified HTML document (if changes were made)")
    processing_time: float = Field(..., description="Processing time in seconds")
    timestamp: str = Field(..., description="Response timestamp")
    error: Optional[str] = Field(None, description="Error message if any")


class Actor(BaseModel):
    """Actor model representing a person or organization"""
    name: str = Field(..., description="Actor name")
    aliases: List[str] = Field(default=[], description="Alternative names for this actor")
    description: str = Field(default="", description="Description of the actor")
    implication: str = Field(default="", description="Legal or business implication of this actor")