forked from odysseus-dev/odysseus
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrequest_models.py
More file actions
136 lines (113 loc) · 5.06 KB
/
Copy pathrequest_models.py
File metadata and controls
136 lines (113 loc) · 5.06 KB
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
124
125
126
127
128
129
130
131
132
133
134
135
136
from pydantic import BaseModel, Field, field_validator
from typing import Optional, List, Dict, Any
from datetime import datetime
# Request Models
class ChatRequest(BaseModel):
message: str = Field(..., min_length=1, max_length=50000, description="Chat message")
session: str = Field(..., description="Session ID")
attachments: Optional[List[str]] = Field(default=[], description="Attachment IDs")
use_web: Optional[bool] = Field(default=False, description="Enable web search")
use_research: Optional[bool] = Field(default=False, description="Enable deep research")
time_filter: Optional[str] = Field(default=None, description="Time filter for search")
preset_id: Optional[str] = Field(default=None, description="Preset identifier")
@field_validator('message')
@classmethod
def clean_message(cls, v):
return v.strip()
@field_validator('time_filter')
@classmethod
def validate_time_filter(cls, v):
if v is not None and v not in ['day', 'week', 'month', 'year']:
return None # Just set to None if invalid rather than raising error
return v
class SessionCreateRequest(BaseModel):
name: Optional[str] = Field(default="", max_length=200, description="Session name")
endpoint_url: str = Field(..., description="LLM endpoint URL")
model: Optional[str] = Field(default="", description="Model ID")
rag: Optional[bool] = Field(default=False, description="Enable RAG")
class MemoryAddRequest(BaseModel):
text: str = Field(..., min_length=1, max_length=5000, description="Memory text")
category: str = Field(default="fact", description="Memory category")
source: str = Field(default="user", description="Memory source")
session_id: Optional[str] = Field(default=None, description="Associated session ID")
@field_validator('category')
@classmethod
def validate_category(cls, v):
if v not in ['fact', 'contact', 'task', 'preference', 'identity', 'project', 'goal']:
return 'fact' # Default to 'fact' if invalid
return v
class MemoryUpdateRequest(BaseModel):
text: str = Field(..., min_length=1, max_length=5000, description="Updated memory text")
category: Optional[str] = Field(default=None, pattern="^(fact|contact|task|preference|identity|project|goal)$", description="Memory category")
class PresetUpdateRequest(BaseModel):
"""Request model for updating custom preset configuration."""
name: str = Field(
"",
max_length=50,
description="Character display name (shown next to model name)"
)
enabled: bool = Field(
True,
description="Whether this character is active"
)
temperature: float = Field(
1.0,
ge=0.0,
le=2.0,
description="Temperature parameter for text generation (0.0-2.0)"
)
max_tokens: int = Field(
0,
ge=0,
le=8192,
description="Maximum number of tokens to generate (0 = no limit)"
)
system_prompt: str = Field(
"",
max_length=10000,
description="System prompt to guide assistant behavior (empty = default)"
)
inject_prefix: str = Field(
"",
max_length=5000,
description="Text to prepend to each outgoing user message"
)
inject_suffix: str = Field(
"",
max_length=5000,
description="Text to append to each outgoing user message"
)
class DirectoryRequest(BaseModel):
"""Request model for directory operations."""
directory: str = Field(
...,
min_length=1,
max_length=500,
description="Path to the directory"
)
# Response Models
class ErrorResponse(BaseModel):
error: str = Field(..., description="Error code")
message: str = Field(..., description="Error message")
details: Optional[Dict[str, Any]] = Field(default=None, description="Additional error details")
class UploadResponse(BaseModel):
id: str = Field(..., description="File ID")
name: str = Field(..., description="Sanitized filename")
mime: str = Field(..., description="MIME type")
size: int = Field(..., description="File size in bytes")
hash: str = Field(..., description="SHA-256 hash")
uploaded_at: datetime = Field(..., description="Upload timestamp")
is_duplicate: bool = Field(default=False, description="Whether file is a duplicate")
class SessionResponse(BaseModel):
id: str = Field(..., description="Session ID")
name: str = Field(..., description="Session name")
model: str = Field(..., description="Model being used")
rag: bool = Field(default=False, description="RAG enabled")
archived: bool = Field(default=False, description="Whether session is archived")
class MemoryResponse(BaseModel):
id: str = Field(..., description="Memory ID")
text: str = Field(..., description="Memory text")
category: str = Field(..., description="Memory category")
source: str = Field(..., description="Memory source")
timestamp: int = Field(..., description="Unix timestamp")
session_id: Optional[str] = Field(default=None, description="Associated session")