diff --git a/surfsense_backend/alembic/versions/22_add_cometapi_to_litellmprovider_enum.py b/surfsense_backend/alembic/versions/22_add_cometapi_to_litellmprovider_enum.py new file mode 100644 index 000000000..a0cd85b08 --- /dev/null +++ b/surfsense_backend/alembic/versions/22_add_cometapi_to_litellmprovider_enum.py @@ -0,0 +1,47 @@ +"""Add COMETAPI to LiteLLMProvider enum + +Revision ID: 22 +Revises: 21 +""" + +from collections.abc import Sequence + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "22" +down_revision: str | None = "21" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + """Add COMETAPI to LiteLLMProvider enum.""" + + # Add COMETAPI to the enum if it doesn't already exist + op.execute( + """ + DO $$ + BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_enum + WHERE enumtypid = 'litellmprovider'::regtype + AND enumlabel = 'COMETAPI' + ) THEN + ALTER TYPE litellmprovider ADD VALUE 'COMETAPI'; + END IF; + END$$; + """ + ) + + +def downgrade() -> None: + """Remove COMETAPI from LiteLLMProvider enum. + + Note: PostgreSQL doesn't support removing enum values directly. + This would require recreating the enum type and updating all dependent objects. + For safety, this downgrade is a no-op. + """ + # PostgreSQL doesn't support removing enum values directly + # This would require a complex migration recreating the enum + pass diff --git a/surfsense_backend/app/db.py b/surfsense_backend/app/db.py index 1d33d4324..99be9f277 100644 --- a/surfsense_backend/app/db.py +++ b/surfsense_backend/app/db.py @@ -100,6 +100,7 @@ class LiteLLMProvider(str, Enum): NLPCLOUD = "NLPCLOUD" ALEPH_ALPHA = "ALEPH_ALPHA" PETALS = "PETALS" + COMETAPI = "COMETAPI" CUSTOM = "CUSTOM" diff --git a/surfsense_backend/app/services/llm_service.py b/surfsense_backend/app/services/llm_service.py index cbf967791..9b915312f 100644 --- a/surfsense_backend/app/services/llm_service.py +++ b/surfsense_backend/app/services/llm_service.py @@ -81,6 +81,7 @@ async def get_user_llm_instance( "MISTRAL": "mistral", "AZURE_OPENAI": "azure", "OPENROUTER": "openrouter", + "COMETAPI": "openai", # Add more mappings as needed } provider_prefix = provider_map.get( diff --git a/surfsense_web/components/onboard/add-provider-step.tsx b/surfsense_web/components/onboard/add-provider-step.tsx index 6a0983c03..e054a8cfe 100644 --- a/surfsense_web/components/onboard/add-provider-step.tsx +++ b/surfsense_web/components/onboard/add-provider-step.tsx @@ -37,6 +37,7 @@ const LLM_PROVIDERS = [ { value: "TOGETHER_AI", label: "Together AI", example: "togethercomputer/llama-2-70b-chat" }, { value: "REPLICATE", label: "Replicate", example: "meta/llama-2-70b-chat" }, { value: "OPENROUTER", label: "OpenRouter", example: "anthropic/claude-opus-4.1, openai/gpt-5" }, + { value: "COMETAPI", label: "CometAPI", example: "gpt-4o, claude-3-5-sonnet-20241022" }, { value: "CUSTOM", label: "Custom Provider", example: "your-custom-model" }, ]; diff --git a/surfsense_web/components/settings/model-config-manager.tsx b/surfsense_web/components/settings/model-config-manager.tsx index 54bbd7990..709e118ca 100644 --- a/surfsense_web/components/settings/model-config-manager.tsx +++ b/surfsense_web/components/settings/model-config-manager.tsx @@ -118,6 +118,12 @@ const LLM_PROVIDERS = [ example: "anthropic/claude-opus-4.1, openai/gpt-5", description: "API gateway and LLM marketplace that provides unified access ", }, + { + value: "COMETAPI", + label: "CometAPI", + example: "gpt-5-mini, claude-sonnet-4-5", + description: "500+ AI models through one unified API", + }, { value: "CUSTOM", label: "Custom Provider",