Skip to content

Commit 10ca0d7

Browse files
feat: Autogenerate TS types (#727)
1 parent fdb3607 commit 10ca0d7

36 files changed

+1107
-427
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/ragbits-chat/CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22

33
## Unreleased
44

5+
- Autogenerate typescript types based on backend typing (#727)
6+
57
## 1.2.1 (2025-08-04)
68

79
### Changed
810

911
- ragbits-core updated to version v1.2.1
10-
1112
- Fix routing error causing chat to not be displayed with disabled history (#764)
1213

1314
## 1.2.0 (2025-08-01)
15+
1416
### Changed
1517

1618
- ragbits-core updated to version v1.2.0
17-
1819
- Update TailwindCSS, React, Vite, tailwind config (#742)
1920
- Add images support in chat message, images gallery (#731)
2021
- Add persistent user settings (#719)

packages/ragbits-chat/src/ragbits/chat/api.py

Lines changed: 30 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,25 @@
55
from collections.abc import AsyncGenerator
66
from contextlib import asynccontextmanager
77
from pathlib import Path
8-
from typing import Any, Literal
98

109
import uvicorn
1110
from fastapi import FastAPI, HTTPException, Request, status
1211
from fastapi.exceptions import RequestValidationError
1312
from fastapi.middleware.cors import CORSMiddleware
1413
from fastapi.responses import HTMLResponse, JSONResponse, StreamingResponse
1514
from fastapi.staticfiles import StaticFiles
16-
from pydantic import BaseModel, Field
1715

1816
from ragbits.chat.interface import ChatInterface
19-
from ragbits.chat.interface.types import ChatContext, ChatResponse, ChatResponseType, Message
17+
from ragbits.chat.interface.types import (
18+
ChatContext,
19+
ChatMessageRequest,
20+
ChatResponse,
21+
ChatResponseType,
22+
ConfigResponse,
23+
FeedbackConfig,
24+
FeedbackItem,
25+
FeedbackRequest,
26+
)
2027
from ragbits.core.audit.metrics import record_metric
2128
from ragbits.core.audit.metrics.base import MetricType
2229
from ragbits.core.audit.traces import trace
@@ -26,26 +33,6 @@
2633
logger = logging.getLogger(__name__)
2734

2835

29-
class ChatMessageRequest(BaseModel):
30-
"""
31-
Request body for chat message
32-
"""
33-
34-
message: str = Field(..., description="The current user message")
35-
history: list[Message] = Field(default_factory=list, description="Previous message history")
36-
context: dict[str, Any] = Field(default_factory=dict, description="User context information")
37-
38-
39-
class FeedbackRequest(BaseModel):
40-
"""
41-
Request body for feedback submission
42-
"""
43-
44-
message_id: str = Field(..., description="ID of the message receiving feedback")
45-
feedback: Literal["like", "dislike"] = Field(..., description="Type of feedback (like or dislike)")
46-
payload: dict = Field(default_factory=dict, description="Additional feedback details")
47-
48-
4936
class RagbitsAPI:
5037
"""
5138
RagbitsAPI class for running API with Demo UI for testing purposes
@@ -126,30 +113,26 @@ async def feedback(request: FeedbackRequest) -> JSONResponse:
126113

127114
@self.app.get("/api/config", response_class=JSONResponse)
128115
async def config() -> JSONResponse:
129-
like_config = self.chat_interface.feedback_config.like_form
130-
dislike_config = self.chat_interface.feedback_config.dislike_form
131-
user_settings_config = self.chat_interface.user_settings.form
132-
133-
config_dict = {
134-
"feedback": {
135-
"like": {
136-
"enabled": self.chat_interface.feedback_config.like_enabled,
137-
"form": like_config,
138-
},
139-
"dislike": {
140-
"enabled": self.chat_interface.feedback_config.dislike_enabled,
141-
"form": dislike_config,
142-
},
143-
},
144-
"customization": self.chat_interface.ui_customization.model_dump()
145-
if self.chat_interface.ui_customization
146-
else None,
147-
"user_settings": {"form": user_settings_config},
148-
"debug_mode": self.debug_mode,
149-
"conversation_history": self.chat_interface.conversation_history,
150-
}
151-
152-
return JSONResponse(content=config_dict)
116+
feedback_config = self.chat_interface.feedback_config
117+
118+
config_response = ConfigResponse(
119+
feedback=FeedbackConfig(
120+
like=FeedbackItem(
121+
enabled=feedback_config.like_enabled,
122+
form=feedback_config.like_form,
123+
),
124+
dislike=FeedbackItem(
125+
enabled=feedback_config.dislike_enabled,
126+
form=feedback_config.dislike_form,
127+
),
128+
),
129+
customization=self.chat_interface.ui_customization,
130+
user_settings=self.chat_interface.user_settings,
131+
debug_mode=self.debug_mode,
132+
conversation_history=self.chat_interface.conversation_history,
133+
)
134+
135+
return JSONResponse(content=config_response.model_dump())
153136

154137
@self.app.get("/{full_path:path}", response_class=HTMLResponse)
155138
async def root() -> HTMLResponse:

packages/ragbits-chat/src/ragbits/chat/interface/_interface.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import uuid
88
from abc import ABC, abstractmethod
99
from collections.abc import AsyncGenerator, Callable
10-
from typing import Any, Literal
10+
from typing import Any
1111

1212
from ragbits.chat.interface.ui_customization import UICustomization
1313
from ragbits.core.audit.metrics import record_metric
@@ -22,6 +22,7 @@
2222
ChatContext,
2323
ChatResponse,
2424
ChatResponseType,
25+
FeedbackType,
2526
Image,
2627
LiveUpdate,
2728
LiveUpdateContent,
@@ -329,8 +330,8 @@ async def chat(
329330
async def save_feedback(
330331
self,
331332
message_id: str,
332-
feedback: Literal["like", "dislike"],
333-
payload: dict,
333+
feedback: FeedbackType,
334+
payload: dict[str, Any] | None = None,
334335
) -> None:
335336
"""
336337
Save feedback about a chat message.

packages/ragbits-chat/src/ragbits/chat/interface/types.py

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33

44
from pydantic import BaseModel, ConfigDict, Field
55

6+
from ragbits.chat.interface.forms import UserSettings
7+
from ragbits.chat.interface.ui_customization import UICustomization
8+
69

710
class MessageRole(str, Enum):
811
"""Defines the role of the message sender in a conversation."""
@@ -76,6 +79,15 @@ class ChatResponseType(str, Enum):
7679
IMAGE = "image"
7780

7881

82+
class ChatContext(BaseModel):
83+
"""Represents the context of a chat conversation."""
84+
85+
conversation_id: str | None = None
86+
message_id: str | None = None
87+
state: dict[str, Any] = Field(default_factory=dict)
88+
model_config = ConfigDict(extra="allow")
89+
90+
7991
class ChatResponse(BaseModel):
8092
"""Container for different types of chat responses."""
8193

@@ -145,10 +157,56 @@ def as_image(self) -> Image | None:
145157
return cast(Image, self.content) if self.type == ChatResponseType.IMAGE else None
146158

147159

148-
class ChatContext(BaseModel):
149-
"""Represents the context of a chat conversation."""
160+
class ChatMessageRequest(BaseModel):
161+
"""Client-side chat request interface."""
150162

151-
conversation_id: str | None = None
152-
message_id: str | None = None
153-
state: dict[str, Any] = Field(default_factory=dict)
154-
model_config = ConfigDict(extra="allow")
163+
message: str = Field(..., description="The current user message")
164+
history: list["Message"] = Field(default_factory=list, description="Previous message history")
165+
context: dict[str, Any] = Field(default_factory=dict, description="User context information")
166+
167+
168+
class FeedbackType(str, Enum):
169+
"""Feedback types for user feedback."""
170+
171+
LIKE = "like"
172+
DISLIKE = "dislike"
173+
174+
175+
class FeedbackResponse(BaseModel):
176+
"""Response from feedback submission."""
177+
178+
status: str = Field(..., description="Status of the feedback submission")
179+
180+
181+
class FeedbackRequest(BaseModel):
182+
"""
183+
Request body for feedback submission
184+
"""
185+
186+
message_id: str = Field(..., description="ID of the message receiving feedback")
187+
feedback: FeedbackType = Field(..., description="Type of feedback (like or dislike)")
188+
payload: dict[str, Any] = Field(default_factory=dict, description="Additional feedback details")
189+
190+
191+
class FeedbackItem(BaseModel):
192+
"""Individual feedback configuration (like/dislike)."""
193+
194+
enabled: bool = Field(..., description="Whether this feedback type is enabled")
195+
form: dict[str, Any] | None = Field(..., description="Form schema for this feedback type")
196+
197+
198+
class FeedbackConfig(BaseModel):
199+
"""Feedback configuration containing like and dislike settings."""
200+
201+
like: FeedbackItem = Field(..., description="Like feedback configuration")
202+
dislike: FeedbackItem = Field(..., description="Dislike feedback configuration")
203+
204+
205+
class ConfigResponse(BaseModel):
206+
"""Configuration response from the API."""
207+
208+
feedback: FeedbackConfig = Field(..., description="Feedback configuration")
209+
customization: UICustomization | None = Field(default=None, description="UI customization")
210+
user_settings: UserSettings = Field(default_factory=UserSettings, description="User settings")
211+
debug_mode: bool = Field(default=False, description="Debug mode flag")
212+
conversation_history: bool = Field(default=False, description="Debug mode flag")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"""
2+
Providers for ragbits-chat package.
3+
4+
This module contains provider classes for various ragbits-chat functionality.
5+
"""
6+
7+
from .model_provider import RagbitsChatModelProvider
8+
9+
__all__ = ["RagbitsChatModelProvider"]

0 commit comments

Comments
 (0)