From 515be6b648d12f19fbde848cb10316090e584d46 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Mon, 9 Feb 2026 17:26:35 +0200 Subject: [PATCH 1/5] Add GITHUB_MODELS to LiteLLMProvider enum --- surfsense_backend/app/db.py | 1 + 1 file changed, 1 insertion(+) diff --git a/surfsense_backend/app/db.py b/surfsense_backend/app/db.py index 0cab2820b..8c7a9d328 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" From fc946ee1e5195220fa1e40c77fd728380dac098e Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Mon, 9 Feb 2026 17:30:52 +0200 Subject: [PATCH 2/5] Add migration 96 for GITHUB_MODELS enum --- ...d_github_models_to_litellmprovider_enum.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 surfsense_backend/alembic/versions/96_add_github_models_to_litellmprovider_enum.py 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..11bcfb82f --- /dev/null +++ b/surfsense_backend/alembic/versions/96_add_github_models_to_litellmprovider_enum.py @@ -0,0 +1,35 @@ +"""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( + """ + DO $$ + BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_enum + WHERE enumtypid = 'litellmprovider'::regtype + AND enumlabel = 'GITHUB_MODELS' + ) THEN + ALTER TYPE litellmprovider ADD VALUE 'GITHUB_MODELS'; + END IF; + END$$; + """ + ) + + +def downgrade() -> None: + pass From a9d6c41964ee5cffb2b02854b9495864ef1678af Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Mon, 9 Feb 2026 17:34:25 +0200 Subject: [PATCH 3/5] Add GITHUB_MODELS to provider maps --- surfsense_backend/app/agents/new_chat/llm_config.py | 1 + surfsense_backend/app/services/llm_router_service.py | 1 + surfsense_backend/app/services/llm_service.py | 2 ++ 3 files changed, 4 insertions(+) diff --git a/surfsense_backend/app/agents/new_chat/llm_config.py b/surfsense_backend/app/agents/new_chat/llm_config.py index 12b389a2d..b7305cb4b 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": "openai", "REPLICATE": "replicate", "PERPLEXITY": "perplexity", "ANYSCALE": "anyscale", diff --git a/surfsense_backend/app/services/llm_router_service.py b/surfsense_backend/app/services/llm_router_service.py index 3a19f0b8e..0e7d0b1a1 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": "openai", "HUGGINGFACE": "huggingface", "CUSTOM": "custom", } diff --git a/surfsense_backend/app/services/llm_service.py b/surfsense_backend/app/services/llm_service.py index e21259990..8bd4da57b 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": "openai", } 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": "openai", } provider_prefix = provider_map.get( llm_config.provider.value, llm_config.provider.value.lower() From 8bc4b255b46c33cd44a928d9ef9395b3d85b2c81 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Mon, 9 Feb 2026 17:54:48 +0200 Subject: [PATCH 4/5] Add GitHub Models frontend provider and model suggestions --- surfsense_web/contracts/enums/llm-models.ts | 72 +++++++++++++++++++ .../contracts/enums/llm-providers.ts | 7 ++ 2 files changed, 79 insertions(+) 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", From a96d18ec31508563cf8c5ee33e56da32168e39de Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Mon, 9 Feb 2026 19:14:16 +0200 Subject: [PATCH 5/5] Fix GitHub Models provider: use github prefix, fix migration, add Zod enum --- ..._add_github_models_to_litellmprovider_enum.py | 16 ++-------------- .../app/agents/new_chat/llm_config.py | 2 +- .../app/services/llm_router_service.py | 2 +- surfsense_backend/app/services/llm_service.py | 4 ++-- .../contracts/types/new-llm-config.types.ts | 1 + 5 files changed, 7 insertions(+), 18 deletions(-) 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 index 11bcfb82f..c41935b8c 100644 --- 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 @@ -15,20 +15,8 @@ depends_on: str | Sequence[str] | None = None def upgrade() -> None: - op.execute( - """ - DO $$ - BEGIN - IF NOT EXISTS ( - SELECT 1 FROM pg_enum - WHERE enumtypid = 'litellmprovider'::regtype - AND enumlabel = 'GITHUB_MODELS' - ) THEN - ALTER TYPE litellmprovider ADD VALUE 'GITHUB_MODELS'; - END IF; - END$$; - """ - ) + op.execute("COMMIT") + op.execute("ALTER TYPE litellmprovider ADD VALUE IF NOT EXISTS 'GITHUB_MODELS'") def downgrade() -> None: diff --git a/surfsense_backend/app/agents/new_chat/llm_config.py b/surfsense_backend/app/agents/new_chat/llm_config.py index b7305cb4b..4ffc6e623 100644 --- a/surfsense_backend/app/agents/new_chat/llm_config.py +++ b/surfsense_backend/app/agents/new_chat/llm_config.py @@ -45,7 +45,7 @@ PROVIDER_MAP = { "ALIBABA_QWEN": "openai", "MOONSHOT": "openai", "ZHIPU": "openai", - "GITHUB_MODELS": "openai", + "GITHUB_MODELS": "github", "REPLICATE": "replicate", "PERPLEXITY": "perplexity", "ANYSCALE": "anyscale", diff --git a/surfsense_backend/app/services/llm_router_service.py b/surfsense_backend/app/services/llm_router_service.py index 0e7d0b1a1..58a75cf54 100644 --- a/surfsense_backend/app/services/llm_router_service.py +++ b/surfsense_backend/app/services/llm_router_service.py @@ -56,7 +56,7 @@ PROVIDER_MAP = { "ALIBABA_QWEN": "openai", "MOONSHOT": "openai", "ZHIPU": "openai", - "GITHUB_MODELS": "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 8bd4da57b..0a805b31f 100644 --- a/surfsense_backend/app/services/llm_service.py +++ b/surfsense_backend/app/services/llm_service.py @@ -119,7 +119,7 @@ async def validate_llm_config( "ALIBABA_QWEN": "openai", "MOONSHOT": "openai", "ZHIPU": "openai", # GLM needs special handling - "GITHUB_MODELS": "openai", + "GITHUB_MODELS": "github", } provider_prefix = provider_map.get(provider, provider.lower()) model_string = f"{provider_prefix}/{model_name}" @@ -336,7 +336,7 @@ async def get_search_space_llm_instance( "ALIBABA_QWEN": "openai", "MOONSHOT": "openai", "ZHIPU": "openai", - "GITHUB_MODELS": "openai", + "GITHUB_MODELS": "github", } provider_prefix = provider_map.get( llm_config.provider.value, llm_config.provider.value.lower() 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", ]);