diff --git a/surfsense_backend/alembic/versions/96_add_github_models_to_litellmprovider_enum.py b/surfsense_backend/alembic/versions/96_add_github_models_to_litellmprovider_enum.py new file mode 100644 index 000000000..c41935b8c --- /dev/null +++ b/surfsense_backend/alembic/versions/96_add_github_models_to_litellmprovider_enum.py @@ -0,0 +1,23 @@ +"""Add GITHUB_MODELS to LiteLLMProvider enum + +Revision ID: 96 +Revises: 95 +""" + +from collections.abc import Sequence + +from alembic import op + +revision: str = "96" +down_revision: str | None = "95" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + op.execute("COMMIT") + op.execute("ALTER TYPE litellmprovider ADD VALUE IF NOT EXISTS 'GITHUB_MODELS'") + + +def downgrade() -> None: + pass diff --git a/surfsense_backend/app/agents/new_chat/llm_config.py b/surfsense_backend/app/agents/new_chat/llm_config.py index 12b389a2d..4ffc6e623 100644 --- a/surfsense_backend/app/agents/new_chat/llm_config.py +++ b/surfsense_backend/app/agents/new_chat/llm_config.py @@ -45,6 +45,7 @@ PROVIDER_MAP = { "ALIBABA_QWEN": "openai", "MOONSHOT": "openai", "ZHIPU": "openai", + "GITHUB_MODELS": "github", "REPLICATE": "replicate", "PERPLEXITY": "perplexity", "ANYSCALE": "anyscale", diff --git a/surfsense_backend/app/db.py b/surfsense_backend/app/db.py index 1de3d7163..3d9374342 100644 --- a/surfsense_backend/app/db.py +++ b/surfsense_backend/app/db.py @@ -211,6 +211,7 @@ class LiteLLMProvider(str, Enum): DATABRICKS = "DATABRICKS" COMETAPI = "COMETAPI" HUGGINGFACE = "HUGGINGFACE" + GITHUB_MODELS = "GITHUB_MODELS" CUSTOM = "CUSTOM" diff --git a/surfsense_backend/app/services/llm_router_service.py b/surfsense_backend/app/services/llm_router_service.py index 3a19f0b8e..58a75cf54 100644 --- a/surfsense_backend/app/services/llm_router_service.py +++ b/surfsense_backend/app/services/llm_router_service.py @@ -56,6 +56,7 @@ PROVIDER_MAP = { "ALIBABA_QWEN": "openai", "MOONSHOT": "openai", "ZHIPU": "openai", + "GITHUB_MODELS": "github", "HUGGINGFACE": "huggingface", "CUSTOM": "custom", } diff --git a/surfsense_backend/app/services/llm_service.py b/surfsense_backend/app/services/llm_service.py index e21259990..0a805b31f 100644 --- a/surfsense_backend/app/services/llm_service.py +++ b/surfsense_backend/app/services/llm_service.py @@ -119,6 +119,7 @@ async def validate_llm_config( "ALIBABA_QWEN": "openai", "MOONSHOT": "openai", "ZHIPU": "openai", # GLM needs special handling + "GITHUB_MODELS": "github", } provider_prefix = provider_map.get(provider, provider.lower()) model_string = f"{provider_prefix}/{model_name}" @@ -335,6 +336,7 @@ async def get_search_space_llm_instance( "ALIBABA_QWEN": "openai", "MOONSHOT": "openai", "ZHIPU": "openai", + "GITHUB_MODELS": "github", } provider_prefix = provider_map.get( llm_config.provider.value, llm_config.provider.value.lower() diff --git a/surfsense_web/contracts/enums/llm-models.ts b/surfsense_web/contracts/enums/llm-models.ts index 5ff15c3df..467522faa 100644 --- a/surfsense_web/contracts/enums/llm-models.ts +++ b/surfsense_web/contracts/enums/llm-models.ts @@ -1477,6 +1477,78 @@ export const LLM_MODELS: LLMModel[] = [ provider: "DATABRICKS", contextWindow: "128K", }, + + // GitHub Models + { + value: "openai/gpt-5", + label: "GitHub GPT-5", + provider: "GITHUB_MODELS", + }, + { + value: "openai/gpt-4.1", + label: "GitHub GPT-4.1", + provider: "GITHUB_MODELS", + contextWindow: "1048K", + }, + { + value: "openai/gpt-4o", + label: "GitHub GPT-4o", + provider: "GITHUB_MODELS", + contextWindow: "128K", + }, + { + value: "deepseek/DeepSeek-V3-0324", + label: "GitHub DeepSeek V3", + provider: "GITHUB_MODELS", + contextWindow: "64K", + }, + { + value: "xai/grok-3", + label: "GitHub Grok 3", + provider: "GITHUB_MODELS", + contextWindow: "131K", + }, + { + value: "openai/gpt-5-mini", + label: "GitHub GPT-5 Mini", + provider: "GITHUB_MODELS", + }, + { + value: "openai/gpt-4.1-mini", + label: "GitHub GPT-4.1 Mini", + provider: "GITHUB_MODELS", + contextWindow: "1048K", + }, + { + value: "meta/Llama-4-Scout-17B-16E-Instruct", + label: "GitHub Llama 4 Scout", + provider: "GITHUB_MODELS", + contextWindow: "512K", + }, + { + value: "openai/gpt-4.1-nano", + label: "GitHub GPT-4.1 Nano", + provider: "GITHUB_MODELS", + contextWindow: "1048K", + }, + { + value: "openai/gpt-4o-mini", + label: "GitHub GPT-4o Mini", + provider: "GITHUB_MODELS", + contextWindow: "128K", + }, + { + value: "openai/o4-mini", + label: "GitHub O4 Mini", + provider: "GITHUB_MODELS", + contextWindow: "200K", + }, + { + value: "deepseek/DeepSeek-R1", + label: "GitHub DeepSeek R1", + provider: "GITHUB_MODELS", + contextWindow: "64K", + }, ]; // Helper function to get models by provider diff --git a/surfsense_web/contracts/enums/llm-providers.ts b/surfsense_web/contracts/enums/llm-providers.ts index 40b7ee2df..7e6542c11 100644 --- a/surfsense_web/contracts/enums/llm-providers.ts +++ b/surfsense_web/contracts/enums/llm-providers.ts @@ -174,6 +174,13 @@ export const LLM_PROVIDERS: LLMProvider[] = [ example: "databricks/databricks-meta-llama-3-3-70b-instruct", description: "Databricks Model Serving", }, + { + value: "GITHUB_MODELS", + label: "GitHub Models", + example: "openai/gpt-5, meta/llama-3.1-405b-instruct", + description: "AI models from GitHub Marketplace", + apiBase: "https://models.github.ai/inference", + }, { value: "CUSTOM", label: "Custom Provider", diff --git a/surfsense_web/contracts/types/new-llm-config.types.ts b/surfsense_web/contracts/types/new-llm-config.types.ts index b99df1022..8239505a1 100644 --- a/surfsense_web/contracts/types/new-llm-config.types.ts +++ b/surfsense_web/contracts/types/new-llm-config.types.ts @@ -33,6 +33,7 @@ export const liteLLMProviderEnum = z.enum([ "DATABRICKS", "COMETAPI", "HUGGINGFACE", + "GITHUB_MODELS", "CUSTOM", ]);