68 lines
1.9 KiB
Markdown
68 lines
1.9 KiB
Markdown
# Asyncio Event Loop Issue with Streamlit
|
|
|
|
## Problem
|
|
Error: `There is no current event loop in thread 'ScriptRunner.scriptThread'`
|
|
|
|
This occurs because:
|
|
1. Google's langchain integration uses asyncio internally
|
|
2. Streamlit runs scripts in a separate thread (ScriptRunner.scriptThread)
|
|
3. This thread doesn't have an asyncio event loop by default
|
|
4. When `embed_query()` is called, it tries to use async operations but fails
|
|
|
|
## Solution
|
|
|
|
### Option 1: Create Event Loop for Thread (Recommended)
|
|
Add event loop handling in the model factory:
|
|
|
|
```python
|
|
import asyncio
|
|
import threading
|
|
|
|
def _create_google_embeddings() -> GoogleGenerativeAIEmbeddings:
|
|
"""Create Google embeddings with validation"""
|
|
if not config.GOOGLE_API_KEY:
|
|
raise ValueError("GOOGLE_API_KEY not configured")
|
|
|
|
# Ensure event loop exists for current thread
|
|
try:
|
|
loop = asyncio.get_event_loop()
|
|
except RuntimeError:
|
|
# Create new event loop for this thread
|
|
loop = asyncio.new_event_loop()
|
|
asyncio.set_event_loop(loop)
|
|
|
|
embeddings = GoogleGenerativeAIEmbeddings(
|
|
model=config.GOOGLE_EMBEDDING_MODEL,
|
|
google_api_key=config.GOOGLE_API_KEY
|
|
)
|
|
|
|
# Rest of validation...
|
|
```
|
|
|
|
### Option 2: Use nest_asyncio (Simple but less clean)
|
|
Install and apply nest_asyncio at app startup:
|
|
|
|
```python
|
|
import nest_asyncio
|
|
nest_asyncio.apply()
|
|
```
|
|
|
|
### Option 3: Synchronous Wrapper
|
|
Create a synchronous wrapper for async operations:
|
|
|
|
```python
|
|
def sync_embed_query(embeddings, text):
|
|
"""Synchronous wrapper for async embed_query"""
|
|
try:
|
|
loop = asyncio.get_event_loop()
|
|
except RuntimeError:
|
|
loop = asyncio.new_event_loop()
|
|
asyncio.set_event_loop(loop)
|
|
|
|
return loop.run_until_complete(embeddings.aembed_query(text))
|
|
```
|
|
|
|
## Recommended Fix
|
|
|
|
Update `model_factory.py` in the `_create_google_embeddings` method to handle the event loop properly.
|