MCPcopy Index your code
hub / github.com/AsyncFuncAI/deepwiki-open / handle_websocket_chat

Function handle_websocket_chat

api/websocket_wiki.py:65–989  ·  view source on GitHub ↗

Handle WebSocket connection for chat completions. This replaces the HTTP streaming endpoint with a WebSocket connection.

(websocket: WebSocket)

Source from the content-addressed store, hash-verified

63 included_files: Optional[str] = Field(None, description="Comma-separated list of file patterns to include exclusively")
64
65async def handle_websocket_chat(websocket: WebSocket):
66 """
67 Handle WebSocket connection for chat completions.
68 This replaces the HTTP streaming endpoint with a WebSocket connection.
69 """
70 await websocket.accept()
71
72 try:
73 # Receive and parse the request data
74 request_data = await websocket.receive_json()
75 request = ChatCompletionRequest(**request_data)
76
77 # Check if request contains very large input
78 input_too_large = False
79 if request.messages and len(request.messages) > 0:
80 last_message = request.messages[-1]
81 if hasattr(last_message, 'content') and last_message.content:
82 tokens = count_tokens(last_message.content, request.provider == "ollama")
83 logger.info(f"Request size: {tokens} tokens")
84 if tokens > 8000:
85 logger.warning(f"Request exceeds recommended token limit ({tokens} > 7500)")
86 input_too_large = True
87
88 # Create a new RAG instance for this request
89 try:
90 request_rag = RAG(provider=request.provider, model=request.model)
91
92 # Extract custom file filter parameters if provided
93 excluded_dirs = None
94 excluded_files = None
95 included_dirs = None
96 included_files = None
97
98 if request.excluded_dirs:
99 excluded_dirs = [unquote(dir_path) for dir_path in request.excluded_dirs.split('\n') if dir_path.strip()]
100 logger.info(f"Using custom excluded directories: {excluded_dirs}")
101 if request.excluded_files:
102 excluded_files = [unquote(file_pattern) for file_pattern in request.excluded_files.split('\n') if file_pattern.strip()]
103 logger.info(f"Using custom excluded files: {excluded_files}")
104 if request.included_dirs:
105 included_dirs = [unquote(dir_path) for dir_path in request.included_dirs.split('\n') if dir_path.strip()]
106 logger.info(f"Using custom included directories: {included_dirs}")
107 if request.included_files:
108 included_files = [unquote(file_pattern) for file_pattern in request.included_files.split('\n') if file_pattern.strip()]
109 logger.info(f"Using custom included files: {included_files}")
110
111 request_rag.prepare_retriever(request.repo_url, request.type, request.token, excluded_dirs, excluded_files, included_dirs, included_files)
112 logger.info(f"Retriever prepared for {request.repo_url}")
113 except ValueError as e:
114 if "No valid documents with embeddings found" in str(e):
115 logger.error(f"No valid embeddings found: {str(e)}")
116 await websocket.send_text("Error: No valid document embeddings found. This may be due to embedding size inconsistencies or API errors during document processing. Please try again or check your repository content.")
117 await websocket.close()
118 return
119 else:
120 logger.error(f"ValueError preparing retriever: {str(e)}")
121 await websocket.send_text(f"Error preparing retriever: {str(e)}")
122 await websocket.close()

Callers

nothing calls this directly

Calls 15

prepare_retrieverMethod · 0.95
count_tokensFunction · 0.90
RAGClass · 0.90
get_file_contentFunction · 0.90
get_model_configFunction · 0.90
OpenRouterClientClass · 0.90
OpenAIClientClass · 0.90
LiteLLMClientClass · 0.90
BedrockClientClass · 0.90
AzureAIClientClass · 0.90
DashscopeClientClass · 0.90
add_dialog_turnMethod · 0.80

Tested by

no test coverage detected