5
5
6
6
from ragbits .chat .interface .forms import UserSettings
7
7
from ragbits .chat .interface .ui_customization import UICustomization
8
+ from ragbits .core .llms .base import Usage
8
9
9
10
10
11
class MessageRole (str , Enum ):
@@ -66,6 +67,35 @@ class Image(BaseModel):
66
67
url : str
67
68
68
69
70
+ class MessageUsage (BaseModel ):
71
+ """Represents usage for a message. Reflects `Usage` computed properties."""
72
+
73
+ n_requests : int
74
+ estimated_cost : float
75
+ prompt_tokens : int
76
+ completion_tokens : int
77
+ total_tokens : int
78
+
79
+ @classmethod
80
+ def from_usage (cls , usage : Usage ) -> "MessageUsage" :
81
+ """
82
+ Create a MessageUsage object from Usage.
83
+
84
+ Args:
85
+ usage: Usage object to be transformed.
86
+
87
+ Returns:
88
+ The corresponding MessageUsage.
89
+ """
90
+ return cls (
91
+ completion_tokens = usage .completion_tokens ,
92
+ estimated_cost = usage .estimated_cost ,
93
+ n_requests = usage .n_requests ,
94
+ prompt_tokens = usage .prompt_tokens ,
95
+ total_tokens = usage .total_tokens ,
96
+ )
97
+
98
+
69
99
class ChatResponseType (str , Enum ):
70
100
"""Types of responses that can be returned by the chat interface."""
71
101
@@ -78,6 +108,7 @@ class ChatResponseType(str, Enum):
78
108
FOLLOWUP_MESSAGES = "followup_messages"
79
109
IMAGE = "image"
80
110
CLEAR_MESSAGE = "clear_message"
111
+ USAGE = "usage"
81
112
82
113
83
114
class ChatContext (BaseModel ):
@@ -94,7 +125,7 @@ class ChatResponse(BaseModel):
94
125
"""Container for different types of chat responses."""
95
126
96
127
type : ChatResponseType
97
- content : str | Reference | StateUpdate | LiveUpdate | list [str ] | Image | None
128
+ content : str | Reference | StateUpdate | LiveUpdate | list [str ] | Image | dict [ str , MessageUsage ] | None
98
129
99
130
def as_text (self ) -> str | None :
100
131
"""
@@ -164,6 +195,12 @@ def as_clear_message(self) -> None:
164
195
"""
165
196
return cast (None , self .content )
166
197
198
+ def as_usage (self ) -> dict [str , MessageUsage ] | None :
199
+ """
200
+ Return the content as dict from model name to Usage if this is an usage response, else None
201
+ """
202
+ return cast (dict [str , MessageUsage ], self .content ) if self .type == ChatResponseType .USAGE else None
203
+
167
204
168
205
class ChatMessageRequest (BaseModel ):
169
206
"""Client-side chat request interface."""
@@ -230,5 +267,6 @@ class ConfigResponse(BaseModel):
230
267
customization : UICustomization | None = Field (default = None , description = "UI customization" )
231
268
user_settings : UserSettings = Field (default_factory = UserSettings , description = "User settings" )
232
269
debug_mode : bool = Field (default = False , description = "Debug mode flag" )
233
- conversation_history : bool = Field (default = False , description = "Debug mode flag" )
270
+ conversation_history : bool = Field (default = False , description = "Flag to enable conversation history" )
271
+ show_usage : bool = Field (default = False , description = "Flag to enable usage statistics" )
234
272
authentication : AuthenticationConfig = Field (..., description = "Authentication configuration" )
0 commit comments