diff --git a/docs/my-website/docs/vector_stores/create.md b/docs/my-website/docs/vector_stores/create.md new file mode 100644 index 0000000000..f9bdcb9b34 --- /dev/null +++ b/docs/my-website/docs/vector_stores/create.md @@ -0,0 +1,314 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# /vector_stores - Create Vector Store + +Create a vector store which can be used to store and search document chunks for retrieval-augmented generation (RAG) use cases. + +## Overview + +| Feature | Supported | Notes | +|---------|-----------|-------| +| Cost Tracking | ✅ | Tracked per vector store operation | +| Logging | ✅ | Works across all integrations | +| End-user Tracking | ✅ | | +| Support LLM Providers | **OpenAI, Azure OpenAI, Bedrock, Vertex RAG Engine** | Full vector stores API support across providers | + +## Usage + +### LiteLLM Python SDK + + + + +#### Non-streaming example +```python showLineNumbers title="Create Vector Store - Basic" +import litellm + +response = await litellm.vector_stores.acreate( + name="My Document Store", + file_ids=["file-abc123", "file-def456"] +) +print(response) +``` + +#### Synchronous example +```python showLineNumbers title="Create Vector Store - Sync" +import litellm + +response = litellm.vector_stores.create( + name="My Document Store", + file_ids=["file-abc123", "file-def456"] +) +print(response) +``` + + + + + +#### With expiration and chunking strategy +```python showLineNumbers title="Create Vector Store - Advanced" +import litellm + +response = await litellm.vector_stores.acreate( + name="My Document Store", + file_ids=["file-abc123", "file-def456"], + expires_after={ + "anchor": "last_active_at", + "days": 7 + }, + chunking_strategy={ + "type": "static", + "static": { + "max_chunk_size_tokens": 800, + "chunk_overlap_tokens": 400 + } + }, + metadata={ + "project": "rag-system", + "environment": "production" + } +) +print(response) +``` + + + + + +#### Using OpenAI provider explicitly +```python showLineNumbers title="Create Vector Store - OpenAI Provider" +import litellm +import os + +# Set API key +os.environ["OPENAI_API_KEY"] = "your-openai-api-key" + +response = await litellm.vector_stores.acreate( + name="My Document Store", + file_ids=["file-abc123", "file-def456"], + custom_llm_provider="openai" +) +print(response) +``` + + + + +### LiteLLM Proxy Server + + + + +1. Setup config.yaml + +```yaml +model_list: + - model_name: gpt-4o + litellm_params: + model: openai/gpt-4o + api_key: os.environ/OPENAI_API_KEY + +general_settings: + # Vector store settings can be added here if needed +``` + +2. Start proxy + +```bash +litellm --config /path/to/config.yaml +``` + +3. Test it with OpenAI SDK! + +```python showLineNumbers title="OpenAI SDK via LiteLLM Proxy" +from openai import OpenAI + +# Point OpenAI SDK to LiteLLM proxy +client = OpenAI( + base_url="http://0.0.0.0:4000", + api_key="sk-1234", # Your LiteLLM API key +) + +vector_store = client.beta.vector_stores.create( + name="My Document Store", + file_ids=["file-abc123", "file-def456"] +) +print(vector_store) +``` + + + + + +```bash showLineNumbers title="Create Vector Store via curl" +curl -L -X POST 'http://0.0.0.0:4000/v1/vector_stores' \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer sk-1234' \ +-d '{ + "name": "My Document Store", + "file_ids": ["file-abc123", "file-def456"], + "expires_after": { + "anchor": "last_active_at", + "days": 7 + }, + "chunking_strategy": { + "type": "static", + "static": { + "max_chunk_size_tokens": 800, + "chunk_overlap_tokens": 400 + } + }, + "metadata": { + "project": "rag-system", + "environment": "production" + } +}' +``` + + + + +### OpenAI SDK (Standalone) + + + + +```python showLineNumbers title="OpenAI SDK Direct" +from openai import OpenAI + +client = OpenAI(api_key="your-openai-api-key") + +vector_store = client.beta.vector_stores.create( + name="My Document Store", + file_ids=["file-abc123", "file-def456"] +) +print(vector_store) +``` + + + + +## Request Format + +The request body follows OpenAI's vector stores API format. + +#### Example request body + +```json +{ + "name": "My Document Store", + "file_ids": ["file-abc123", "file-def456"], + "expires_after": { + "anchor": "last_active_at", + "days": 7 + }, + "chunking_strategy": { + "type": "static", + "static": { + "max_chunk_size_tokens": 800, + "chunk_overlap_tokens": 400 + } + }, + "metadata": { + "project": "rag-system", + "environment": "production" + } +} +``` + +#### Optional Fields +- **name** (string): The name of the vector store. +- **file_ids** (array of strings): A list of File IDs that the vector store should use. Useful for tools like `file_search` that can access files. +- **expires_after** (object): The expiration policy for the vector store. + - **anchor** (string): Anchor timestamp after which the expiration policy applies. Supported anchors: `last_active_at`. + - **days** (integer): The number of days after the anchor time that the vector store will expire. +- **chunking_strategy** (object): The chunking strategy used to chunk the file(s). If not set, will use the `auto` strategy. + - **type** (string): Always `static`. + - **static** (object): The static chunking strategy. + - **max_chunk_size_tokens** (integer): The maximum number of tokens in each chunk. The default value is `800`. The minimum value is `100` and the maximum value is `4096`. + - **chunk_overlap_tokens** (integer): The number of tokens that overlap between chunks. The default value is `400`. +- **metadata** (object): Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maximum of 512 characters long. + +## Response Format + +#### Example Response + +```json +{ + "id": "vs_abc123", + "object": "vector_store", + "created_at": 1699061776, + "name": "My Document Store", + "bytes": 139920, + "file_counts": { + "in_progress": 0, + "completed": 2, + "failed": 0, + "cancelled": 0, + "total": 2 + }, + "status": "completed", + "expires_after": { + "anchor": "last_active_at", + "days": 7 + }, + "expires_at": null, + "last_active_at": 1699061776, + "metadata": { + "project": "rag-system", + "environment": "production" + } +} +``` + +#### Response Fields + +- **id** (string): The identifier, which can be referenced in API endpoints. +- **object** (string): The object type, which is always `vector_store`. +- **created_at** (integer): The Unix timestamp (in seconds) for when the vector store was created. +- **name** (string): The name of the vector store. +- **bytes** (integer): The total number of bytes used by the files in the vector store. +- **file_counts** (object): The file counts for the vector store. + - **in_progress** (integer): The number of files that are currently being processed. + - **completed** (integer): The number of files that have been successfully processed. + - **failed** (integer): The number of files that failed to process. + - **cancelled** (integer): The number of files that were cancelled. + - **total** (integer): The total number of files. +- **status** (string): The status of the vector store, which can be either `expired`, `in_progress`, or `completed`. A status of `completed` indicates that the vector store is ready for use. +- **expires_after** (object or null): The expiration policy for the vector store. +- **expires_at** (integer or null): The Unix timestamp (in seconds) for when the vector store will expire. +- **last_active_at** (integer or null): The Unix timestamp (in seconds) for when the vector store was last active. +- **metadata** (object or null): Set of 16 key-value pairs that can be attached to an object. + +## Mock Response Testing + +For testing purposes, you can use mock responses: + +```python showLineNumbers title="Mock Response Example" +import litellm + +# Mock response for testing +mock_response = { + "id": "vs_mock123", + "object": "vector_store", + "created_at": 1699061776, + "name": "Mock Vector Store", + "bytes": 0, + "file_counts": { + "in_progress": 0, + "completed": 0, + "failed": 0, + "cancelled": 0, + "total": 0 + }, + "status": "completed" +} + +response = await litellm.vector_stores.acreate( + name="Test Store", + mock_response=mock_response +) +print(response) +``` \ No newline at end of file diff --git a/docs/my-website/docs/vector_stores/search.md b/docs/my-website/docs/vector_stores/search.md new file mode 100644 index 0000000000..bb08251acc --- /dev/null +++ b/docs/my-website/docs/vector_stores/search.md @@ -0,0 +1,368 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# /vector_stores/{vector_store_id}/search - Search Vector Store + +Search a vector store for relevant chunks based on a query and file attributes filter. This is useful for retrieval-augmented generation (RAG) use cases. + +## Overview + +| Feature | Supported | Notes | +|---------|-----------|-------| +| Cost Tracking | ✅ | Tracked per search operation | +| Logging | ✅ | Works across all integrations | +| End-user Tracking | ✅ | | +| Support LLM Providers | **OpenAI, Azure OpenAI, Bedrock, Vertex RAG Engine** | Full vector stores API support across providers | + +## Usage + +### LiteLLM Python SDK + + + + +#### Non-streaming example +```python showLineNumbers title="Search Vector Store - Basic" +import litellm + +response = await litellm.vector_stores.asearch( + vector_store_id="vs_abc123", + query="What is the capital of France?" +) +print(response) +``` + +#### Synchronous example +```python showLineNumbers title="Search Vector Store - Sync" +import litellm + +response = litellm.vector_stores.search( + vector_store_id="vs_abc123", + query="What is the capital of France?" +) +print(response) +``` + + + + + +#### With filters and ranking options +```python showLineNumbers title="Search Vector Store - Advanced" +import litellm + +response = await litellm.vector_stores.asearch( + vector_store_id="vs_abc123", + query="What is the capital of France?", + filters={ + "file_ids": ["file-abc123", "file-def456"] + }, + max_num_results=5, + ranking_options={ + "score_threshold": 0.7 + }, + rewrite_query=True +) +print(response) +``` + + + + + +#### Searching with multiple queries +```python showLineNumbers title="Search Vector Store - Multiple Queries" +import litellm + +response = await litellm.vector_stores.asearch( + vector_store_id="vs_abc123", + query=[ + "What is the capital of France?", + "What is the population of Paris?" + ], + max_num_results=10 +) +print(response) +``` + + + + + +#### Using OpenAI provider explicitly +```python showLineNumbers title="Search Vector Store - OpenAI Provider" +import litellm +import os + +# Set API key +os.environ["OPENAI_API_KEY"] = "your-openai-api-key" + +response = await litellm.vector_stores.asearch( + vector_store_id="vs_abc123", + query="What is the capital of France?", + custom_llm_provider="openai" +) +print(response) +``` + + + + +### LiteLLM Proxy Server + + + + +1. Setup config.yaml + +```yaml +model_list: + - model_name: gpt-4o + litellm_params: + model: openai/gpt-4o + api_key: os.environ/OPENAI_API_KEY + +general_settings: + # Vector store settings can be added here if needed +``` + +2. Start proxy + +```bash +litellm --config /path/to/config.yaml +``` + +3. Test it with OpenAI SDK! + +```python showLineNumbers title="OpenAI SDK via LiteLLM Proxy" +from openai import OpenAI + +# Point OpenAI SDK to LiteLLM proxy +client = OpenAI( + base_url="http://0.0.0.0:4000", + api_key="sk-1234", # Your LiteLLM API key +) + +search_results = client.beta.vector_stores.search( + vector_store_id="vs_abc123", + query="What is the capital of France?", + max_num_results=5 +) +print(search_results) +``` + + + + + +```bash showLineNumbers title="Search Vector Store via curl" +curl -L -X POST 'http://0.0.0.0:4000/v1/vector_stores/vs_abc123/search' \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer sk-1234' \ +-d '{ + "query": "What is the capital of France?", + "filters": { + "file_ids": ["file-abc123", "file-def456"] + }, + "max_num_results": 5, + "ranking_options": { + "score_threshold": 0.7 + }, + "rewrite_query": true +}' +``` + + + + +### OpenAI SDK (Standalone) + + + + +```python showLineNumbers title="OpenAI SDK Direct" +from openai import OpenAI + +client = OpenAI(api_key="your-openai-api-key") + +search_results = client.beta.vector_stores.search( + vector_store_id="vs_abc123", + query="What is the capital of France?", + max_num_results=5 +) +print(search_results) +``` + + + + +## Request Format + +The request body follows OpenAI's vector stores search API format. + +#### Example request body + +```json +{ + "query": "What is the capital of France?", + "filters": { + "file_ids": ["file-abc123", "file-def456"] + }, + "max_num_results": 5, + "ranking_options": { + "score_threshold": 0.7 + }, + "rewrite_query": true +} +``` + +#### Required Fields +- **query** (string or array of strings): A query string or array for the search. The query is used to find relevant chunks in the vector store. + +#### Optional Fields +- **filters** (object): Optional filter to apply based on file attributes. + - **file_ids** (array of strings): Filter chunks based on specific file IDs. +- **max_num_results** (integer): Maximum number of results to return. Must be between 1 and 50. Default is 10. +- **ranking_options** (object): Optional ranking options for search. + - **score_threshold** (number): Minimum similarity score threshold for results. +- **rewrite_query** (boolean): Whether to rewrite the natural language query for vector search optimization. Default is true. + +## Response Format + +#### Example Response + +```json +{ + "object": "vector_store.search_results.page", + "search_query": "What is the capital of France?", + "data": [ + { + "score": 0.95, + "content": [ + { + "type": "text", + "text": "Paris is the capital and most populous city of France. With an official estimated population of 2,102,650 residents as of 1 January 2023 in an area of more than 105 km², Paris is the fourth-most populated city in the European Union and the 30th most densely populated city in the world in 2022." + } + ] + }, + { + "score": 0.87, + "content": [ + { + "type": "text", + "text": "France, officially the French Republic, is a country located primarily in Western Europe. Its capital is Paris, one of the most important cultural and economic centers in Europe." + } + ] + } + ] +} +``` + +#### Response Fields + +- **object** (string): The object type, which is always `vector_store.search_results.page`. +- **search_query** (string): The query that was used for the search. +- **data** (array): An array of search result objects. + - **score** (number): The similarity score of the search result, typically between 0 and 1, where 1 is the most similar. + - **content** (array): Array of content objects containing the retrieved text. + - **type** (string): The type of content, typically `text`. + - **text** (string): The actual text content that was retrieved from the vector store. + +## Mock Response Testing + +For testing purposes, you can use mock responses: + +```python showLineNumbers title="Mock Response Example" +import litellm + +# Mock response for testing +mock_results = [ + { + "score": 0.95, + "content": [ + { + "text": "Paris is the capital of France.", + "type": "text" + } + ] + }, + { + "score": 0.87, + "content": [ + { + "text": "France is a country in Western Europe.", + "type": "text" + } + ] + } +] + +response = await litellm.vector_stores.asearch( + vector_store_id="vs_abc123", + query="What is the capital of France?", + mock_response=mock_results +) +print(response) +``` + +## Error Handling + +Common errors you might encounter: + +```python showLineNumbers title="Error Handling Example" +import litellm + +try: + response = await litellm.vector_stores.asearch( + vector_store_id="vs_invalid", + query="What is the capital of France?" + ) +except litellm.NotFoundError as e: + print(f"Vector store not found: {e}") +except litellm.RateLimitError as e: + print(f"Rate limit exceeded: {e}") +except Exception as e: + print(f"Unexpected error: {e}") +``` + +## Best Practices + +1. **Query Optimization**: Use clear, specific queries for better search results. +2. **Result Filtering**: Use file_ids filter to limit search scope when needed. +3. **Score Thresholds**: Set appropriate score thresholds to filter out irrelevant results. +4. **Batch Queries**: Use array queries when searching for multiple related topics. +5. **Error Handling**: Always implement proper error handling for production use. + +```python showLineNumbers title="Best Practices Example" +import litellm + +async def search_documents(vector_store_id: str, user_query: str): + """ + Search documents with best practices applied + """ + try: + response = await litellm.vector_stores.asearch( + vector_store_id=vector_store_id, + query=user_query, + max_num_results=5, + ranking_options={ + "score_threshold": 0.7 # Filter out low-relevance results + }, + rewrite_query=True # Optimize query for vector search + ) + + # Filter results by score for additional quality control + high_quality_results = [ + result for result in response.data + if result.score >= 0.8 + ] + + return high_quality_results + + except Exception as e: + print(f"Search failed: {e}") + return [] + +# Usage +results = await search_documents("vs_abc123", "What is the capital of France?") +``` \ No newline at end of file diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 85a000f760..9c7eaf07f2 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -278,6 +278,14 @@ const sidebars = { "text_to_speech", ] }, + { + type: "category", + label: "/vector_stores", + items: [ + "vector_stores/create", + "vector_stores/search", + ] + }, { type: "category", label: "Pass-through Endpoints (Anthropic SDK, etc.)", diff --git a/enterprise/litellm_enterprise/proxy/vector_stores/endpoints.py b/enterprise/litellm_enterprise/proxy/vector_stores/endpoints.py index 77286a648f..8e7db45d75 100644 --- a/enterprise/litellm_enterprise/proxy/vector_stores/endpoints.py +++ b/enterprise/litellm_enterprise/proxy/vector_stores/endpoints.py @@ -11,7 +11,7 @@ All /vector_store management endpoints import copy from typing import List -from fastapi import APIRouter, Depends, HTTPException +from fastapi import APIRouter, Depends, HTTPException, Request, Response import litellm from litellm._logging import verbose_proxy_logger @@ -27,7 +27,9 @@ from litellm.vector_stores.vector_store_registry import VectorStoreRegistry router = APIRouter() - +######################################################## +# Management Endpoints +######################################################## @router.post( "/vector_store/new", tags=["vector store management"], diff --git a/litellm/proxy/common_request_processing.py b/litellm/proxy/common_request_processing.py index 3501882872..98ef4336e7 100644 --- a/litellm/proxy/common_request_processing.py +++ b/litellm/proxy/common_request_processing.py @@ -273,6 +273,8 @@ class ProxyBaseLLMRequestProcessing: "agenerate_content", "agenerate_content_stream", "allm_passthrough_route", + "avector_store_search", + "avector_store_create", ], version: Optional[str] = None, user_model: Optional[str] = None, @@ -357,6 +359,8 @@ class ProxyBaseLLMRequestProcessing: "agenerate_content", "agenerate_content_stream", "allm_passthrough_route", + "avector_store_search", + "avector_store_create", ], proxy_logging_obj: ProxyLogging, general_settings: dict, diff --git a/litellm/proxy/common_utils/vector_store_endpoints/endpoints.py b/litellm/proxy/common_utils/vector_store_endpoints/endpoints.py new file mode 100644 index 0000000000..22ea7fd546 --- /dev/null +++ b/litellm/proxy/common_utils/vector_store_endpoints/endpoints.py @@ -0,0 +1,129 @@ +from fastapi import APIRouter, Depends, Request, Response + +from litellm.proxy._types import UserAPIKeyAuth +from litellm.proxy.auth.user_api_key_auth import user_api_key_auth +from litellm.proxy.common_request_processing import ProxyBaseLLMRequestProcessing + +router = APIRouter() +######################################################## +# OpenAI Compatible Endpoints +######################################################## + +@router.post("/v1/vector_stores/{vector_store_id}/search", dependencies=[Depends(user_api_key_auth)]) +@router.post("/vector_stores/{vector_store_id}/search", dependencies=[Depends(user_api_key_auth)]) +async def vector_store_search( + request: Request, + vector_store_id: str, + fastapi_response: Response, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Search a vector store. + + API Reference: + https://platform.openai.com/docs/api-reference/vector-stores/search + """ + from litellm.proxy.proxy_server import ( + _read_request_body, + general_settings, + llm_router, + proxy_config, + proxy_logging_obj, + select_data_generator, + user_api_base, + user_max_tokens, + user_model, + user_request_timeout, + user_temperature, + version, + ) + + data = await _read_request_body(request=request) + if "vector_store_id" not in data: + data["vector_store_id"] = vector_store_id + processor = ProxyBaseLLMRequestProcessing(data=data) + try: + return await processor.base_process_llm_request( + request=request, + fastapi_response=fastapi_response, + user_api_key_dict=user_api_key_dict, + route_type="avector_store_search", + proxy_logging_obj=proxy_logging_obj, + llm_router=llm_router, + general_settings=general_settings, + proxy_config=proxy_config, + select_data_generator=select_data_generator, + model=None, + user_model=user_model, + user_temperature=user_temperature, + user_request_timeout=user_request_timeout, + user_max_tokens=user_max_tokens, + user_api_base=user_api_base, + version=version, + ) + except Exception as e: + raise await processor._handle_llm_api_exception( + e=e, + user_api_key_dict=user_api_key_dict, + proxy_logging_obj=proxy_logging_obj, + version=version, + ) + + + +@router.post("/v1/vector_stores", dependencies=[Depends(user_api_key_auth)]) +@router.post("/vector_stores", dependencies=[Depends(user_api_key_auth)]) +async def vector_store_create( + request: Request, + fastapi_response: Response, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Create a vector store. + + API Reference: + https://platform.openai.com/docs/api-reference/vector-stores/create + """ + from litellm.proxy.proxy_server import ( + _read_request_body, + general_settings, + llm_router, + proxy_config, + proxy_logging_obj, + select_data_generator, + user_api_base, + user_max_tokens, + user_model, + user_request_timeout, + user_temperature, + version, + ) + + data = await _read_request_body(request=request) + processor = ProxyBaseLLMRequestProcessing(data=data) + try: + return await processor.base_process_llm_request( + request=request, + fastapi_response=fastapi_response, + user_api_key_dict=user_api_key_dict, + route_type="avector_store_create", + proxy_logging_obj=proxy_logging_obj, + llm_router=llm_router, + general_settings=general_settings, + proxy_config=proxy_config, + select_data_generator=select_data_generator, + model=None, + user_model=user_model, + user_temperature=user_temperature, + user_request_timeout=user_request_timeout, + user_max_tokens=user_max_tokens, + user_api_base=user_api_base, + version=version, + ) + except Exception as e: + raise await processor._handle_llm_api_exception( + e=e, + user_api_key_dict=user_api_key_dict, + proxy_logging_obj=proxy_logging_obj, + version=version, + ) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index a60e31d686..03aba679f0 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -207,6 +207,9 @@ from litellm.proxy.common_utils.openai_endpoint_utils import ( from litellm.proxy.common_utils.proxy_state import ProxyState from litellm.proxy.common_utils.reset_budget_job import ResetBudgetJob from litellm.proxy.common_utils.swagger_utils import ERROR_RESPONSES +from litellm.proxy.common_utils.vector_store_endpoints.endpoints import ( + router as vector_store_router, +) from litellm.proxy.credential_endpoints.endpoints import router as credential_router from litellm.proxy.db.db_transaction_queue.spend_log_cleanup import SpendLogCleanup from litellm.proxy.db.exception_handler import PrismaDBExceptionHandler @@ -8708,6 +8711,7 @@ app.include_router(public_endpoints_router) app.include_router(rerank_router) app.include_router(image_router) app.include_router(fine_tuning_router) +app.include_router(vector_store_router) app.include_router(credential_router) app.include_router(llm_passthrough_router) app.include_router(mcp_management_router) diff --git a/litellm/proxy/route_llm_request.py b/litellm/proxy/route_llm_request.py index 06d50ccdc5..e57539a612 100644 --- a/litellm/proxy/route_llm_request.py +++ b/litellm/proxy/route_llm_request.py @@ -76,6 +76,8 @@ async def route_request( "agenerate_content", "agenerate_content_stream", "allm_passthrough_route", + "avector_store_search", + "avector_store_create", ], ): """ diff --git a/litellm/router.py b/litellm/router.py index 6ae9867ddb..18469e6a72 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -783,6 +783,26 @@ class Router: litellm.allm_passthrough_route, call_type="allm_passthrough_route" ) + ######################################################### + # Vector Store routes + ######################################################### + from litellm.vector_stores.main import acreate, asearch, create, search + + # async routes + self.avector_store_search = self.factory_function( + asearch, call_type="avector_store_search" + ) + self.avector_store_create = self.factory_function( + acreate, call_type="avector_store_create" + ) + # sync routes + self.vector_store_search = self.factory_function( + search, call_type="vector_store_search" + ) + self.vector_store_create = self.factory_function( + create, call_type="vector_store_create" + ) + ######################################################### # Gemini Native routes ######################################################### @@ -3290,6 +3310,10 @@ class Router: "generate_content", "agenerate_content_stream", "generate_content_stream", + "avector_store_search", + "avector_store_create", + "vector_store_search", + "vector_store_create", ] = "assistants", ): """ @@ -3300,7 +3324,7 @@ class Router: - An asynchronous function for asynchronous call types """ # Handle synchronous call types - if call_type in ("responses", "generate_content", "generate_content_stream"): + if call_type in ("responses", "generate_content", "generate_content_stream", "vector_store_search", "vector_store_create"): def sync_wrapper( custom_llm_provider: Optional[ @@ -3346,6 +3370,8 @@ class Router: "aimage_edit", "agenerate_content", "agenerate_content_stream", + "avector_store_search", + "avector_store_create", ): return await self._ageneric_api_call_with_fallbacks( original_function=original_function,