feat: update all OpenAI/ChatGPT refs + settings dropdown for fixed-value fields
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
@@ -57,20 +57,69 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
"test_endpoint": "/api/diagnostic/test-notification",
|
||||
}
|
||||
|
||||
# Add AI services first
|
||||
providers["OpenAI"] = {
|
||||
"name": "OpenAI",
|
||||
"icon": "fa-brands fa-openai",
|
||||
"configured": bool(
|
||||
getattr(settings, "openai_api_key", None) and str(getattr(settings, "openai_api_key", "")).startswith("sk-")
|
||||
),
|
||||
# Add AI provider (dynamic – reflects whichever provider is configured)
|
||||
ai_provider_name = getattr(settings, "ai_provider", "openai").lower()
|
||||
model = getattr(settings, "ai_model", None) or getattr(settings, "openai_model", "gpt-4o-mini")
|
||||
|
||||
# Determine whether the active provider has its required credentials set
|
||||
def _ai_configured() -> bool:
|
||||
if ai_provider_name in ("openai", "azure", "litellm"):
|
||||
return bool(getattr(settings, "openai_api_key", None))
|
||||
elif ai_provider_name == "anthropic":
|
||||
return bool(getattr(settings, "anthropic_api_key", None))
|
||||
elif ai_provider_name == "gemini":
|
||||
return bool(getattr(settings, "gemini_api_key", None))
|
||||
elif ai_provider_name == "ollama":
|
||||
return bool(getattr(settings, "ollama_base_url", None))
|
||||
elif ai_provider_name == "openrouter":
|
||||
return bool(getattr(settings, "openrouter_api_key", None))
|
||||
elif ai_provider_name == "portkey":
|
||||
return bool(getattr(settings, "portkey_api_key", None))
|
||||
return False
|
||||
|
||||
# Build provider-specific detail rows
|
||||
def _ai_details() -> dict:
|
||||
base = {"provider": ai_provider_name, "model": model}
|
||||
if ai_provider_name in ("openai", "azure", "litellm"):
|
||||
base["api_key"] = mask_sensitive_value(getattr(settings, "openai_api_key", None))
|
||||
base["base_url"] = getattr(settings, "openai_base_url", "https://api.openai.com/v1")
|
||||
elif ai_provider_name == "anthropic":
|
||||
base["api_key"] = mask_sensitive_value(getattr(settings, "anthropic_api_key", None))
|
||||
elif ai_provider_name == "gemini":
|
||||
base["api_key"] = mask_sensitive_value(getattr(settings, "gemini_api_key", None))
|
||||
elif ai_provider_name == "ollama":
|
||||
base["base_url"] = getattr(settings, "ollama_base_url", "http://localhost:11434")
|
||||
elif ai_provider_name == "openrouter":
|
||||
base["api_key"] = mask_sensitive_value(getattr(settings, "openrouter_api_key", None))
|
||||
base["base_url"] = getattr(settings, "openrouter_base_url", "https://openrouter.ai/api/v1")
|
||||
elif ai_provider_name == "portkey":
|
||||
base["api_key"] = mask_sensitive_value(getattr(settings, "portkey_api_key", None))
|
||||
if getattr(settings, "portkey_virtual_key", None):
|
||||
base["virtual_key"] = mask_sensitive_value(settings.portkey_virtual_key)
|
||||
if getattr(settings, "portkey_config", None):
|
||||
base["config"] = settings.portkey_config
|
||||
return base
|
||||
|
||||
_PROVIDER_ICONS = {
|
||||
"openai": "fa-brands fa-openai",
|
||||
"azure": "fa-brands fa-microsoft",
|
||||
"anthropic": "fa-solid fa-robot",
|
||||
"gemini": "fa-brands fa-google",
|
||||
"ollama": "fa-solid fa-server",
|
||||
"openrouter": "fa-solid fa-route",
|
||||
"portkey": "fa-solid fa-key",
|
||||
"litellm": "fa-solid fa-layer-group",
|
||||
}
|
||||
|
||||
providers["AI Provider"] = {
|
||||
"name": "AI Provider",
|
||||
"icon": _PROVIDER_ICONS.get(ai_provider_name, "fa-solid fa-microchip"),
|
||||
"configured": _ai_configured(),
|
||||
"enabled": True,
|
||||
"description": "AI-powered document analysis and metadata extraction",
|
||||
"details": {
|
||||
"api_key": mask_sensitive_value(getattr(settings, "openai_api_key", None)),
|
||||
"base_url": getattr(settings, "openai_base_url", "https://api.openai.com/v1"),
|
||||
"model": getattr(settings, "openai_model", "gpt-4"),
|
||||
},
|
||||
"description": f"AI-powered metadata extraction and OCR refinement ({ai_provider_name})",
|
||||
"details": _ai_details(),
|
||||
"testable": True,
|
||||
"test_endpoint": "/api/ai/test",
|
||||
}
|
||||
|
||||
providers["Azure AI"] = {
|
||||
|
||||
@@ -170,9 +170,21 @@ def get_settings_for_display(show_values: bool = False) -> dict[str, list[dict[s
|
||||
"s3_acl",
|
||||
],
|
||||
"AI Services": [
|
||||
"ai_provider",
|
||||
"ai_model",
|
||||
"openai_api_key",
|
||||
"openai_base_url",
|
||||
"openai_model",
|
||||
"anthropic_api_key",
|
||||
"gemini_api_key",
|
||||
"ollama_base_url",
|
||||
"openrouter_api_key",
|
||||
"openrouter_base_url",
|
||||
"portkey_api_key",
|
||||
"portkey_virtual_key",
|
||||
"portkey_config",
|
||||
"portkey_base_url",
|
||||
"azure_openai_api_version",
|
||||
"azure_ai_key",
|
||||
"azure_endpoint",
|
||||
"azure_region",
|
||||
|
||||
+109
-11
@@ -136,15 +136,15 @@ SETTING_METADATA = {
|
||||
# AI Services
|
||||
"openai_api_key": {
|
||||
"category": "AI Services",
|
||||
"description": "OpenAI API key for metadata extraction",
|
||||
"description": "API key for the AI provider (required for OpenAI, Azure, LiteLLM; unused for Ollama)",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"openai_base_url": {
|
||||
"category": "AI Services",
|
||||
"description": "OpenAI API base URL (default: https://api.openai.com/v1)",
|
||||
"description": "API base URL – override for Azure endpoints, local proxies, or LiteLLM (default: https://api.openai.com/v1)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
@@ -152,34 +152,132 @@ SETTING_METADATA = {
|
||||
},
|
||||
"openai_model": {
|
||||
"category": "AI Services",
|
||||
"description": "OpenAI model to use (e.g., gpt-4o-mini)",
|
||||
"description": "Fallback model name used when AI_MODEL is not set (e.g. gpt-4o-mini)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"azure_ai_key": {
|
||||
"ai_provider": {
|
||||
"category": "AI Services",
|
||||
"description": "Azure AI key for document intelligence",
|
||||
"description": "Active AI provider for metadata extraction and OCR refinement",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
"options": ["openai", "azure", "anthropic", "gemini", "ollama", "openrouter", "portkey", "litellm"],
|
||||
},
|
||||
"ai_model": {
|
||||
"category": "AI Services",
|
||||
"description": "Model name for the selected provider (overrides OPENAI_MODEL). E.g. gpt-4o, claude-3-5-sonnet-20241022, gemini-1.5-pro, llama3.2",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"anthropic_api_key": {
|
||||
"category": "AI Services",
|
||||
"description": "Anthropic API key (required when AI_PROVIDER=anthropic)",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"gemini_api_key": {
|
||||
"category": "AI Services",
|
||||
"description": "Google AI Studio API key (required when AI_PROVIDER=gemini)",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"ollama_base_url": {
|
||||
"category": "AI Services",
|
||||
"description": "Ollama server URL for local LLM inference (used when AI_PROVIDER=ollama)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"openrouter_api_key": {
|
||||
"category": "AI Services",
|
||||
"description": "OpenRouter API key (required when AI_PROVIDER=openrouter)",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"openrouter_base_url": {
|
||||
"category": "AI Services",
|
||||
"description": "OpenRouter gateway URL (default: https://openrouter.ai/api/v1)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"portkey_api_key": {
|
||||
"category": "AI Services",
|
||||
"description": "Portkey account API key (required when AI_PROVIDER=portkey)",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"portkey_virtual_key": {
|
||||
"category": "AI Services",
|
||||
"description": "Portkey Virtual Key – routes to provider credentials stored in the Portkey vault (optional)",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"portkey_config": {
|
||||
"category": "AI Services",
|
||||
"description": "Portkey Config ID for advanced routing, fallbacks, and load balancing (optional, e.g. pc-my-config-abc123)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"portkey_base_url": {
|
||||
"category": "AI Services",
|
||||
"description": "Portkey gateway URL (default: https://api.portkey.ai/v1; override for self-hosted deployments)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"azure_openai_api_version": {
|
||||
"category": "AI Services",
|
||||
"description": "Azure OpenAI API version string (used when AI_PROVIDER=azure, default: 2024-02-01)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
# Azure Document Intelligence (OCR) – separate from the AI provider above
|
||||
"azure_ai_key": {
|
||||
"category": "AI Services",
|
||||
"description": "Azure Document Intelligence API key for OCR processing",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"azure_region": {
|
||||
"category": "AI Services",
|
||||
"description": "Azure region for AI services",
|
||||
"description": "Azure region for Document Intelligence services (e.g., eastus)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"azure_endpoint": {
|
||||
"category": "AI Services",
|
||||
"description": "Azure AI endpoint URL",
|
||||
"description": "Azure Document Intelligence endpoint URL",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - Dropbox
|
||||
|
||||
+17
-28
@@ -90,10 +90,21 @@ def get_required_settings() -> List[Dict[str, Any]]:
|
||||
"wizard_step": 2,
|
||||
"wizard_category": "Security",
|
||||
},
|
||||
{
|
||||
"key": "ai_provider",
|
||||
"label": "AI Provider",
|
||||
"description": "AI provider for metadata extraction and OCR refinement (openai, azure, anthropic, gemini, ollama, openrouter, portkey, litellm)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"default": "openai",
|
||||
"options": ["openai", "azure", "anthropic", "gemini", "ollama", "openrouter", "portkey", "litellm"],
|
||||
"wizard_step": 3,
|
||||
"wizard_category": "AI Services",
|
||||
},
|
||||
{
|
||||
"key": "openai_api_key",
|
||||
"label": "OpenAI API Key",
|
||||
"description": "API key for OpenAI services (metadata extraction)",
|
||||
"label": "API Key (OpenAI / Azure / LiteLLM)",
|
||||
"description": "API key for OpenAI, Azure OpenAI, or LiteLLM (not required for Ollama)",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"default": None,
|
||||
@@ -101,32 +112,12 @@ def get_required_settings() -> List[Dict[str, Any]]:
|
||||
"wizard_category": "AI Services",
|
||||
},
|
||||
{
|
||||
"key": "azure_ai_key",
|
||||
"label": "Azure AI Key",
|
||||
"description": "Azure AI key for document intelligence (OCR)",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"default": None,
|
||||
"wizard_step": 3,
|
||||
"wizard_category": "AI Services",
|
||||
},
|
||||
{
|
||||
"key": "azure_region",
|
||||
"label": "Azure Region",
|
||||
"description": "Azure region for AI services (e.g., eastus)",
|
||||
"key": "openai_model",
|
||||
"label": "Default Model",
|
||||
"description": "Model name used when AI_MODEL is not set (e.g. gpt-4o-mini, claude-3-5-sonnet-20241022, llama3.2)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"default": "eastus",
|
||||
"wizard_step": 3,
|
||||
"wizard_category": "AI Services",
|
||||
},
|
||||
{
|
||||
"key": "azure_endpoint",
|
||||
"label": "Azure Endpoint",
|
||||
"description": "Azure AI endpoint URL",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"default": None,
|
||||
"default": "gpt-4o-mini",
|
||||
"wizard_step": 3,
|
||||
"wizard_category": "AI Services",
|
||||
},
|
||||
@@ -147,8 +138,6 @@ def is_setup_required() -> bool:
|
||||
critical_settings = [
|
||||
("session_secret", ["INSECURE_DEFAULT_FOR_DEVELOPMENT_ONLY_DO_NOT_USE_IN_PRODUCTION_MINIMUM_32_CHARS"]),
|
||||
("admin_password", [None, "", "your_secure_password", "changeme", "admin"]),
|
||||
("openai_api_key", [None, "", "<OPENAI_API_KEY>", "test-key"]),
|
||||
("azure_ai_key", [None, "", "<AZURE_AI_KEY>", "test-key"]),
|
||||
]
|
||||
|
||||
for setting_key, invalid_values in critical_settings:
|
||||
|
||||
Reference in New Issue
Block a user