Skip to content

Commit 8450798

Browse files
committed
Integrate Chat message endpoint with Langchain implementation
1 parent 905da81 commit 8450798

8 files changed

Lines changed: 1045 additions & 25 deletions

File tree

backend/api/chat.py

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
SendMessageResponse,
1818
)
1919
from services.project_service import get_project_service
20-
from services.llm_service import llm_service
20+
from services.langchain_service import langchain_service
2121

2222
router = APIRouter(prefix="/chat", tags=["chat"])
2323
project_service = get_project_service()
@@ -263,23 +263,31 @@ async def send_message(
263263
created_at=datetime.utcnow().isoformat() + "Z",
264264
)
265265

266-
# Use LLMService for AI response, fallback to mock if not configured
266+
# Use LangChain service for query processing
267267
try:
268-
ai_content = llm_service.run(request.message)
269-
# For now, just echo the LLM response as the AI message content
270-
query_result = QueryResult(
271-
id=str(uuid.uuid4()),
272-
query=request.message,
273-
sql_query="", # To be filled by future agent logic
274-
result_type="summary",
275-
data=[],
276-
execution_time=0.0,
277-
row_count=0,
278-
chart_config=None,
268+
query_result = langchain_service.process_query(
269+
request.message, project_id, user_id
279270
)
271+
272+
# Create AI response content based on result type
273+
if query_result.result_type == "error":
274+
ai_content = f"I encountered an error: {query_result.error}"
275+
elif query_result.result_type == "summary":
276+
ai_content = query_result.summary or "Here's what I found."
277+
elif query_result.result_type == "table":
278+
ai_content = f"I found {query_result.row_count} results for your query. Here's the data:"
279+
if query_result.sql_query:
280+
ai_content += f"\n\nSQL Query: `{query_result.sql_query}`"
281+
elif query_result.result_type == "chart":
282+
ai_content = f"I've created a {query_result.chart_config.get('type', 'chart') if query_result.chart_config else 'chart'} visualization for your query."
283+
if query_result.sql_query:
284+
ai_content += f"\n\nSQL Query: `{query_result.sql_query}`"
285+
else:
286+
ai_content = "Here are your results."
287+
280288
except Exception as e:
281-
# Fallback to mock logic if LLM not available
282-
ai_content = f"[MOCK] Here are the results for your query: '{request.message}'"
289+
# Fallback to mock logic if LangChain service fails
290+
ai_content = f"[FALLBACK] Processing query: '{request.message}'"
283291
query_result = generate_mock_query_result(request.message, project_id)
284292

285293
# Store message in mock database
@@ -389,7 +397,16 @@ async def get_query_suggestions(
389397
except ValueError:
390398
raise HTTPException(status_code=400, detail="Invalid project ID")
391399

392-
# Return mock suggestions
393-
suggestions = [QuerySuggestion(**sug) for sug in MOCK_SUGGESTIONS]
400+
# Use LangChain service for intelligent suggestions
401+
try:
402+
suggestions_data = langchain_service.generate_suggestions(project_id, user_id)
403+
suggestions = [QuerySuggestion(**sug) for sug in suggestions_data]
404+
405+
# If no suggestions generated, fallback to mock
406+
if not suggestions:
407+
suggestions = [QuerySuggestion(**sug) for sug in MOCK_SUGGESTIONS[:3]]
408+
except Exception as e:
409+
# Fallback to mock suggestions
410+
suggestions = [QuerySuggestion(**sug) for sug in MOCK_SUGGESTIONS[:3]]
394411

395412
return ApiResponse(success=True, data=suggestions)

backend/models/response_schemas.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,12 +201,14 @@ class QueryResult(BaseModel):
201201

202202
id: str
203203
query: str
204-
sql_query: str
205-
result_type: str # 'table', 'chart', 'summary'
206-
data: List[Dict[str, Any]]
204+
sql_query: Optional[str] = None
205+
result_type: str # 'table', 'chart', 'summary', 'error'
206+
data: Optional[List[Dict[str, Any]]] = None
207207
execution_time: float
208-
row_count: int
208+
row_count: Optional[int] = None
209209
chart_config: Optional[Dict[str, Any]] = None
210+
error: Optional[str] = None
211+
summary: Optional[str] = None
210212

211213

212214
class SendMessageResponse(BaseModel):

backend/requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ google-auth==2.25.2
3434
# Email validation
3535
email-validator==2.1.0
3636

37-
# Future dependencies (commented for now, will be added in later tasks)
37+
# LangChain and AI dependencies
3838
langchain==0.1.0
39+
langchain-openai==0.0.5
3940
openai==1.3.0
4041
duckdb==0.9.2

0 commit comments

Comments
 (0)