|
import warnings
|
|
|
|
import requests
|
|
|
|
from openhands.security.options import SecurityAnalyzers
|
|
|
|
with warnings.catch_warnings():
|
|
warnings.simplefilter('ignore')
|
|
import litellm
|
|
|
|
from fastapi import (
|
|
APIRouter,
|
|
)
|
|
|
|
from openhands.controller.agent import Agent
|
|
from openhands.core.config import LLMConfig
|
|
from openhands.core.logger import openhands_logger as logger
|
|
from openhands.llm import bedrock
|
|
from openhands.server.shared import config, openhands_config
|
|
|
|
app = APIRouter(prefix='/api/options')
|
|
|
|
|
|
@app.get('/models')
|
|
async def get_litellm_models() -> list[str]:
|
|
"""
|
|
Get all models supported by LiteLLM.
|
|
|
|
This function combines models from litellm and Bedrock, removing any
|
|
error-prone Bedrock models.
|
|
|
|
To get the models:
|
|
```sh
|
|
curl http://localhost:3000/api/litellm-models
|
|
```
|
|
|
|
Returns:
|
|
list: A sorted list of unique model names.
|
|
"""
|
|
litellm_model_list = litellm.model_list + list(litellm.model_cost.keys())
|
|
litellm_model_list_without_bedrock = bedrock.remove_error_modelId(
|
|
litellm_model_list
|
|
)
|
|
|
|
llm_config: LLMConfig = config.get_llm_config()
|
|
bedrock_model_list = []
|
|
if (
|
|
llm_config.aws_region_name
|
|
and llm_config.aws_access_key_id
|
|
and llm_config.aws_secret_access_key
|
|
):
|
|
bedrock_model_list = bedrock.list_foundation_models(
|
|
llm_config.aws_region_name,
|
|
llm_config.aws_access_key_id.get_secret_value(),
|
|
llm_config.aws_secret_access_key.get_secret_value(),
|
|
)
|
|
model_list = litellm_model_list_without_bedrock + bedrock_model_list
|
|
for llm_config in config.llms.values():
|
|
ollama_base_url = llm_config.ollama_base_url
|
|
if llm_config.model.startswith('ollama'):
|
|
if not ollama_base_url:
|
|
ollama_base_url = llm_config.base_url
|
|
if ollama_base_url:
|
|
ollama_url = ollama_base_url.strip('/') + '/api/tags'
|
|
try:
|
|
ollama_models_list = requests.get(ollama_url, timeout=3).json()[
|
|
'models'
|
|
]
|
|
for model in ollama_models_list:
|
|
model_list.append('ollama/' + model['name'])
|
|
break
|
|
except requests.exceptions.RequestException as e:
|
|
logger.error(f'Error getting OLLAMA models: {e}')
|
|
|
|
return list(sorted(set(model_list)))
|
|
|
|
|
|
@app.get('/agents')
|
|
async def get_agents():
|
|
"""Get all agents supported by LiteLLM.
|
|
|
|
To get the agents:
|
|
```sh
|
|
curl http://localhost:3000/api/agents
|
|
```
|
|
|
|
Returns:
|
|
list: A sorted list of agent names.
|
|
"""
|
|
agents = sorted(Agent.list_agents())
|
|
return agents
|
|
|
|
|
|
@app.get('/security-analyzers')
|
|
async def get_security_analyzers():
|
|
"""Get all supported security analyzers.
|
|
|
|
To get the security analyzers:
|
|
```sh
|
|
curl http://localhost:3000/api/security-analyzers
|
|
```
|
|
|
|
Returns:
|
|
list: A sorted list of security analyzer names.
|
|
"""
|
|
return sorted(SecurityAnalyzers.keys())
|
|
|
|
|
|
@app.get('/config')
|
|
async def get_config():
|
|
"""
|
|
Get current config
|
|
"""
|
|
|
|
return openhands_config.get_config()
|
|
|