2828from fastapi .responses import JSONResponse
2929
3030from vision_agents .core import User , Agent
31- from vision_agents .plugins import getstream , gemini , twilio , elevenlabs , deepgram
31+ from vision_agents .plugins import getstream , gemini , twilio , elevenlabs , deepgram , turbopuffer
3232
3333logger = logging .getLogger (__name__ )
3434logging .basicConfig (level = logging .INFO )
@@ -111,7 +111,7 @@ async def media_stream(websocket: WebSocket, call_id: str, token: str):
111111 call_registry .remove (call_id )
112112
113113
114- async def create_rag_knowledge ():
114+ async def create_rag_from_directory ():
115115 """Initialize the RAG backend based on RAG_BACKEND environment variable."""
116116 global file_search_store , rag
117117
@@ -120,74 +120,38 @@ async def create_rag_knowledge():
120120 return
121121
122122 if RAG_BACKEND == "turbopuffer" :
123- await _init_turbopuffer_rag ()
123+ logger .info (f"📚 Initializing TurboPuffer RAG from { KNOWLEDGE_DIR } " )
124+ rag = await turbopuffer .create_rag (
125+ namespace = "stream-product-knowledge-gemini" ,
126+ knowledge_dir = KNOWLEDGE_DIR ,
127+ extensions = [".md" ],
128+ )
129+ logger .info (f"✅ TurboPuffer RAG ready with { len (rag ._indexed_files )} documents indexed" )
124130 else :
125- await _init_gemini_rag ()
131+ logger .info (f"📚 Initializing Gemini File Search from { KNOWLEDGE_DIR } " )
132+ file_search_store = await gemini .create_file_search_store (
133+ name = "stream-product-knowledge" ,
134+ knowledge_dir = KNOWLEDGE_DIR ,
135+ extensions = [".md" ],
136+ )
137+ logger .info (f"✅ Gemini RAG ready with { len (file_search_store ._uploaded_files )} documents" )
126138
127139
128- async def _init_gemini_rag ():
129- """Initialize Gemini File Search RAG."""
130- global file_search_store
131140
132- logger .info (f"📚 Initializing Gemini File Search from { KNOWLEDGE_DIR } " )
133- file_search_store = await gemini .create_file_search_store (
134- name = "stream-product-knowledge" ,
135- knowledge_dir = KNOWLEDGE_DIR ,
136- extensions = [".md" ],
137- )
138- logger .info (f"✅ Gemini RAG ready with { len (file_search_store ._uploaded_files )} documents" )
139-
140-
141- async def _init_turbopuffer_rag ():
142- """Initialize TurboPuffer + LangChain RAG."""
143- global rag
144-
145- from rag_turbopuffer import create_rag
146-
147- logger .info (f"📚 Initializing TurboPuffer RAG from { KNOWLEDGE_DIR } " )
148- rag = await create_rag (
149- namespace = "stream-product-knowledge-gemini" ,
150- knowledge_dir = KNOWLEDGE_DIR ,
151- extensions = [".md" ],
152- )
153- logger .info (f"✅ TurboPuffer RAG ready with { len (rag ._indexed_files )} documents indexed" )
154-
155-
156-
157- async def create_agent (** kwargs ) -> Agent :
141+ async def create_agent () -> Agent :
158142 """Create an agent with RAG capabilities."""
159- if RAG_BACKEND == "turbopuffer" :
160- return await _create_agent_turbopuffer ()
161- else :
162- return await _create_agent_gemini ()
163-
164-
165- async def _create_agent_gemini () -> Agent :
166- """Create agent with Gemini File Search RAG."""
167143 instructions = """Read the instructions in @instructions.md"""
168144
169- return Agent (
170- edge = getstream .Edge (),
171- agent_user = User (id = "ai-agent" , name = "AI" ),
172- instructions = instructions ,
173- tts = elevenlabs .TTS (voice_id = "FGY2WhTYpPnrIDTdsKH5" ),
174- stt = deepgram .STT (eager_turn_detection = True ),
175- llm = gemini .LLM ("gemini-2.5-flash-lite" , file_search_store = file_search_store ),
176- )
177-
178-
179- async def _create_agent_turbopuffer () -> Agent :
180- """Create agent with TurboPuffer RAG via function calling."""
181- instructions = """Read the instructions in @instructions.md"""
182-
183- llm = gemini .LLM ("gemini-2.5-flash-lite" )
145+ if RAG_BACKEND == "turbopuffer" :
146+ llm = gemini .LLM ("gemini-2.5-flash-lite" )
184147
185- # Register RAG search as a callable function
186- @llm .register_function (
187- description = "Search Stream's product knowledge base for detailed information about Chat, Video, Feeds, and Moderation APIs."
188- )
189- async def search_knowledge (query : str ) -> str :
190- return await rag .search (query , top_k = 3 )
148+ @llm .register_function (
149+ description = "Search Stream's product knowledge base for detailed information about Chat, Video, Feeds, and Moderation APIs."
150+ )
151+ async def search_knowledge (query : str ) -> str :
152+ return await rag .search (query , top_k = 3 )
153+ else :
154+ llm = gemini .LLM ("gemini-2.5-flash-lite" , file_search_store = file_search_store )
191155
192156 return Agent (
193157 edge = getstream .Edge (),
@@ -200,6 +164,6 @@ async def search_knowledge(query: str) -> str:
200164
201165
202166if __name__ == "__main__" :
203- asyncio .run (create_rag_knowledge ())
167+ asyncio .run (create_rag_from_directory ())
204168 logger .info (f"Starting with RAG_BACKEND={ RAG_BACKEND } " )
205169 uvicorn .run (app , host = "localhost" , port = 8000 )
0 commit comments