[docs]asyncdefcached_get_service_models():""" Retrieve service models from the cache or fetch them if not available. Returns: Dictionary mapping services to providers to models: { "service_name": { "provider_name": ["model1", "model2", ...], ... }, ... } """globalservice_models_cacheifnotservice_models_cache:print("Cache is empty, fetching service models...")service_models_cache=awaitget_service_models_from_providers()else:print("Using cached service models")returnservice_models_cache
[docs]asyncdefget_service_models_from_providers(timeout:float=500.0,context=None)->Dict[str,Dict[str,List[str]]]:""" Gather service models from all providers. Args: timeout: Maximum time in seconds to wait for each provider response Returns: Dictionary mapping services to providers to models: { "service_name": { "provider_name": ["model1", "model2", ...], ... }, ... } """# Get all providers that implement get_service_modelsproviders=[]if'get_service_models'inservice_manager.functions:print("get_service_models function found in service_manager functions")providers=[provider_info['provider']forprovider_infoinservice_manager.functions['get_service_models']]print(f"Found {len(providers)} providers with get_service_models function: {providers}")print(providers)else:print("No providers found with get_service_models function")asyncdefquery_provider(provider_name:str)->tuple[str,Dict[str,List[str]]]:try:# Set a timeout for each provider queryresult=awaitasyncio.wait_for(service_manager.exec_with_provider('get_service_models',provider_name,context=context),timeout=timeout)returnprovider_name,resultexceptasyncio.TimeoutError:print(f"Timeout querying provider {provider_name} for service models")returnprovider_name,{}exceptExceptionase:print(f"Error querying provider {provider_name} for service models: {str(e)}")returnprovider_name,{}# Run all queries in parallelprint(f"Querying {len(providers)} providers for service models...")provider_tasks=[query_provider(provider)forproviderinproviders]provider_results=awaitasyncio.gather(*provider_tasks)#print(provider_results)# Organize results by service, then by providerservice_models:Dict[str,Dict[str,List[str]]]={}forprovider_name,provider_datainprovider_results:ifnotprovider_data:continueforservice_name,modelsinprovider_data.items():ifservice_namenotinservice_models:service_models[service_name]={}service_models[service_name][provider_name]=modelsreturnservice_models