-
Couldn't load subscription status.
- Fork 224
ENG-7793: rough draft for web ai #1637
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Greptile Overview
Summary
This PR introduces a conversational AI search feature that integrates with the existing documentation search interface. The implementation adds a new chat mode that allows users to ask questions in natural language and receive AI-generated responses using Typesense's conversational search API with Gemini AI.
Key Changes:
- New
web_ai.pymodule with conversational search functionality and message handling - UI modifications to switch between traditional search and AI chat modes
- Integration with Typesense conversational RAG using the "reflex-docs-convo" model
- Deployment pipeline updates to set up the conversational RAG collection across all environments
- Setup script for initializing the conversation collection schema
Issues Found:
- Code quality issues including commented-out code blocks, print statements instead of logging, and magic numbers
- Potential state lock concerns with API calls in event handlers (though already using background=True)
- Missing constants for hardcoded values like URLs and timeouts
Confidence Score: 3/5
- This PR has code quality issues that should be addressed before merging
- Score reflects multiple code style violations that violate established project rules, including commented code, print statements, and hardcoded values, though the core functionality appears sound
- Pay close attention to pcweb/components/docpage/navbar/web_ai.py which contains most code quality issues
Important Files Changed
File Analysis
| Filename | Score | Overview |
|---|---|---|
| pcweb/components/docpage/navbar/web_ai.py | 3/5 | New conversational AI search module with several code quality issues including commented code, print statements, and magic numbers |
| pcweb/components/docpage/navbar/typesense.py | 4/5 | UI integration for web AI chat interface with conditional rendering between search and chat modes |
| scripts/conversation_indexer.py | 4/5 | Setup script for Typesense conversational RAG collection with proper error handling and validation |
Sequence Diagram
sequenceDiagram
participant User
participant UI as Search Interface
participant State as ConversationalSearch
participant TS as Typesense Client
participant AI as Gemini AI
User->>UI: Click "Ask AI" button
UI->>State: set web_interface("ai_chat")
UI->>UI: Switch to chat input mode
User->>UI: Enter question and submit
UI->>State: send_message()
State->>State: Create user message
State->>State: Set is_loading = true
State->>State: Extract key terms from query
State->>TS: Search with conversation=true
TS->>AI: Process query with reflex-docs-convo model
AI-->>TS: Generate AI response
TS-->>State: Return conversation result
State->>State: Create assistant message
State->>State: Set is_loading = false
State->>UI: Update messages list
UI->>User: Display AI response
alt Error occurs
TS-->>State: Error response
State->>State: Create error message
State->>UI: Display error to user
end
User->>UI: Click "← Back to search"
UI->>State: set web_interface("search")
UI->>UI: Switch back to search mode
6 files reviewed, 5 comments
| # search_params = { | ||
| # "q": original_query, # Use processed query for search | ||
| # "query_by": "title,content,headings,components", | ||
| # "query_by_weights": "6,8,3,12", | ||
| # "per_page": 15, | ||
| # "num_typos": 2, | ||
| # "sort_by": "_text_match:desc", | ||
| # "text_match_threshold": "0.6", | ||
| # "exhaustive_search": True, | ||
| # "highlight_fields": "content", | ||
| # "highlight_full_fields": "content,components", | ||
| # "highlight_start_tag": "<mark>", | ||
| # "highlight_end_tag": "</mark>", | ||
| # "snippet_threshold": 30, | ||
| # "filter_by": "url:!~blog", | ||
| # "conversation": "true", | ||
| # "conversation_model_id": "reflex-docs-convo", | ||
| # "exclude_fields": "hits.document.content" | ||
| # } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
style: Large block of commented-out code should be removed
| # search_params = { | |
| # "q": original_query, # Use processed query for search | |
| # "query_by": "title,content,headings,components", | |
| # "query_by_weights": "6,8,3,12", | |
| # "per_page": 15, | |
| # "num_typos": 2, | |
| # "sort_by": "_text_match:desc", | |
| # "text_match_threshold": "0.6", | |
| # "exhaustive_search": True, | |
| # "highlight_fields": "content", | |
| # "highlight_full_fields": "content,components", | |
| # "highlight_start_tag": "<mark>", | |
| # "highlight_end_tag": "</mark>", | |
| # "snippet_threshold": 30, | |
| # "filter_by": "url:!~blog", | |
| # "conversation": "true", | |
| # "conversation_model_id": "reflex-docs-convo", | |
| # "exclude_fields": "hits.document.content" | |
| # } |
Context Used: Rule - Remove commented-out code before merging PRs. (link)
Prompt To Fix With AI
This is a comment left during a code review.
Path: pcweb/components/docpage/navbar/web_ai.py
Line: 148:166
Comment:
style: Large block of commented-out code should be removed
```suggestion
```
**Context Used:** **Rule -** Remove commented-out code before merging PRs. ([link](https://app.greptile.com/review/custom-context?memory=d49e2a0e-27a4-4cd6-b764-58c8a6fc4032))
How can I resolve this? If you propose a fix, please make it concise.| print(f"Error in send_message: {str(e)}") | ||
| import traceback | ||
| traceback.print_exc() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
style: Replace print statements with logging
| print(f"Error in send_message: {str(e)}") | |
| import traceback | |
| traceback.print_exc() | |
| logging.error(f"Error in send_message: {str(e)}") | |
| logging.exception("Exception details:") |
Context Used: Rule - Use logging instead of print statements for debugging or informational output in Python files. (link)
Prompt To Fix With AI
This is a comment left during a code review.
Path: pcweb/components/docpage/navbar/web_ai.py
Line: 201:203
Comment:
style: Replace print statements with logging
```suggestion
logging.error(f"Error in send_message: {str(e)}")
logging.exception("Exception details:")
```
**Context Used:** **Rule -** Use logging instead of print statements for debugging or informational output in Python files. ([link](https://app.greptile.com/review/custom-context?memory=272ca8d1-3822-4608-bbf1-56b053551b9a))
How can I resolve this? If you propose a fix, please make it concise.| @rx.event(background=True, temporal=True) | ||
| async def send_message(self): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
logic: API call in event handler violates state lock rule - consider using background task pattern
| @rx.event(background=True, temporal=True) | |
| async def send_message(self): | |
| @rx.event(background=True) | |
| async def send_message(self): | |
| """Send a message and get AI response using Typesense conversational search""" |
Context Used: Rule - API calls should be made as background tasks to avoid holding the state lock in Reflex event handlers. (link)
Prompt To Fix With AI
This is a comment left during a code review.
Path: pcweb/components/docpage/navbar/web_ai.py
Line: 122:123
Comment:
logic: API call in event handler violates state lock rule - consider using background task pattern
```suggestion
@rx.event(background=True)
async def send_message(self):
"""Send a message and get AI response using Typesense conversational search"""
```
**Context Used:** **Rule -** API calls should be made as background tasks to avoid holding the state lock in Reflex event handlers. ([link](https://app.greptile.com/review/custom-context?memory=cc67d606-e51b-4b3d-a339-e3e35abaeea1))
How can I resolve this? If you propose a fix, please make it concise.| TYPESENSE_CONFIG = { | ||
| "nodes": [{"host": os.getenv("TYPESENSE_HOST"), "port": "443", "protocol": "https"}], | ||
| "api_key": os.getenv("TYPESENSE_SEARCH_API_KEY"), | ||
| "connection_timeout_seconds": 10, | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
style: Define base URL as constant
| TYPESENSE_CONFIG = { | |
| "nodes": [{"host": os.getenv("TYPESENSE_HOST"), "port": "443", "protocol": "https"}], | |
| "api_key": os.getenv("TYPESENSE_SEARCH_API_KEY"), | |
| "connection_timeout_seconds": 10, | |
| } | |
| BASE_TYPESENSE_URL = "https" | |
| TYPESENSE_PORT = "443" | |
| TYPESENSE_CONFIG = { | |
| "nodes": [{"host": os.getenv("TYPESENSE_HOST"), "port": TYPESENSE_PORT, "protocol": BASE_TYPESENSE_URL}], | |
| "api_key": os.getenv("TYPESENSE_SEARCH_API_KEY"), | |
| "connection_timeout_seconds": 10, | |
| } |
Context Used: Rule - Define base URLs as constants at the top of the file rather than inline in the code. (link)
Prompt To Fix With AI
This is a comment left during a code review.
Path: pcweb/components/docpage/navbar/web_ai.py
Line: 9:13
Comment:
style: Define base URL as constant
```suggestion
BASE_TYPESENSE_URL = "https"
TYPESENSE_PORT = "443"
TYPESENSE_CONFIG = {
"nodes": [{"host": os.getenv("TYPESENSE_HOST"), "port": TYPESENSE_PORT, "protocol": BASE_TYPESENSE_URL}],
"api_key": os.getenv("TYPESENSE_SEARCH_API_KEY"),
"connection_timeout_seconds": 10,
}
```
**Context Used:** **Rule -** Define base URLs as constants at the top of the file rather than inline in the code. ([link](https://app.greptile.com/review/custom-context?memory=01879a51-c85e-49f6-817d-1fa347d0c965))
How can I resolve this? If you propose a fix, please make it concise.| if snippets: | ||
| return snippets[0] | ||
|
|
||
| content = document.get("content", "") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
style: Magic number should be a named constant
| content = document.get("content", "") | |
| SNIPPET_MAX_LENGTH = 200 | |
| return content[:SNIPPET_MAX_LENGTH] + "..." if len(content) > SNIPPET_MAX_LENGTH else content |
Context Used: Rule - Replace magic numbers with named constants when the same values are used in multiple places. Define constants at the module or class level to avoid duplication and make future changes easier. (link)
Prompt To Fix With AI
This is a comment left during a code review.
Path: pcweb/components/docpage/navbar/web_ai.py
Line: 56:56
Comment:
style: Magic number should be a named constant
```suggestion
SNIPPET_MAX_LENGTH = 200
return content[:SNIPPET_MAX_LENGTH] + "..." if len(content) > SNIPPET_MAX_LENGTH else content
```
**Context Used:** **Rule -** Replace magic numbers with named constants when the same values are used in multiple places. Define constants at the module or class level to avoid duplication and make future changes easier. ([link](https://app.greptile.com/review/custom-context?memory=d77c71c7-a031-425e-8d08-6e8bce21358c))
How can I resolve this? If you propose a fix, please make it concise.
No description provided.