Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion desktop/src/apps/ProvidersApp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { useIsMobile } from "@/hooks/use-is-mobile";
/* ------------------------------------------------------------------ */

/** Fallback constants used before the API call completes. */
const FALLBACK_CLOUD_TYPES = ["openai", "anthropic", "openrouter", "kilocode", "openai-compatible"] as const;
const FALLBACK_CLOUD_TYPES = ["openai", "anthropic", "openrouter", "kilocode", "deepseek", "openai-compatible"] as const;
const FALLBACK_LOCAL_TYPES = ["rkllama", "ollama", "llama-cpp", "vllm", "exo", "mlx", "sd-cpp"] as const;

/** Active cloud types — seeded with fallback, updated from /api/providers/types.
Expand All @@ -34,6 +34,7 @@ const DEFAULT_URLS: Partial<Record<ProviderType, string>> = {
anthropic: "https://api.anthropic.com/v1",
openrouter: "https://openrouter.ai/api/v1",
kilocode: "https://api.kilo.ai/api/gateway",
deepseek: "https://api.deepseek.com",
ollama: "http://localhost:11434",
rkllama: "http://localhost:8080",
"llama-cpp": "http://localhost:8080",
Expand Down Expand Up @@ -72,6 +73,12 @@ const CLOUD_PROVIDER_META: Record<string, CloudProviderMeta> = {
url: "https://api.kilo.ai/api/gateway",
keyPlaceholder: "kilo-...",
},
deepseek: {
label: "DeepSeek",
description: "DeepSeek V4 Pro, Flash, Reasoner",
url: "https://api.deepseek.com",
keyPlaceholder: "sk-...",
},
"openai-compatible": {
label: "OpenAI-Compatible",
description: "LiteLLM, llama.cpp server, vLLM, or any service exposing the OpenAI API",
Expand Down
2 changes: 1 addition & 1 deletion desktop/src/lib/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ export interface CloudProvider {
source?: string;
}

export const CLOUD_PROVIDER_TYPES = ["openai", "anthropic", "openrouter", "kilocode", "openai-compatible"] as const;
export const CLOUD_PROVIDER_TYPES = ["openai", "anthropic", "openrouter", "kilocode", "deepseek", "openai-compatible"] as const;

/** Flatten /api/providers cloud providers into AggregatedModel entries. */
export function cloudProvidersToAggregated(providers: CloudProvider[]): AggregatedModel[] {
Expand Down
1 change: 1 addition & 0 deletions tinyagentos/backend_adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ async def health(self, client: httpx.AsyncClient, url: str) -> dict:
"anthropic": CloudAPIAdapter(),
"openrouter": CloudAPIAdapter(),
"kilocode": CloudAPIAdapter(),
"deepseek": CloudAPIAdapter(),
"openai-compatible": CloudAPIAdapter(),
"sd-cpp": StableDiffusionCppAdapter(),
"iopaint": IOPaintAdapter(),
Expand Down
3 changes: 3 additions & 0 deletions tinyagentos/providers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"anthropic",
"openrouter",
"kilocode",
"deepseek",
"openai-compatible",
# -- local image-generation backends --
"sd-cpp",
Expand All @@ -43,6 +44,7 @@
"anthropic",
"openrouter",
"kilocode",
"deepseek",
"openai-compatible",
}

Expand All @@ -69,6 +71,7 @@
"anthropic": "anthropic",
"openrouter": "openrouter",
"kilocode": "openai", # kilocode is OpenAI-compatible; api_base set explicitly
"deepseek": "deepseek", # native LiteLLM provider; api_base set to official base
"openai-compatible": "openai", # user-supplied OpenAI-compatible endpoint
}

Expand Down
12 changes: 12 additions & 0 deletions tinyagentos/routes/providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"openai": "https://api.openai.com/v1",
"anthropic": "https://api.anthropic.com/v1",
"openrouter": "https://openrouter.ai/api/v1",
"deepseek": "https://api.deepseek.com",
}

# Seed model list for cloud providers that don't expose an openly-listable
Expand All @@ -34,6 +35,17 @@
# so we keep that as a safety net.
PROVIDER_DEFAULT_MODELS: dict[str, list[dict]] = {
"kilocode": [{"id": "kilo-auto/free"}],
# DeepSeek's /models endpoint needs an API key, so a fresh add without a
# working key won't auto-discover. Seed the current catalog so the entry
# registers routable models either way. deepseek-v4-pro / deepseek-v4-flash
# are the V4 generation ids; deepseek-chat / deepseek-reasoner are the
# compatibility aliases (deprecated 2026/07/24).
"deepseek": [
{"id": "deepseek-v4-pro"},
{"id": "deepseek-v4-flash"},
{"id": "deepseek-chat"},
{"id": "deepseek-reasoner"},
],
Comment on lines +43 to +48

@gitar-bot gitar-bot Bot Jun 15, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Edge Case: Seed model ids may not be routable until live discovery succeeds

The seed list registers deepseek-v4-pro and deepseek-v4-flash as routable models for any DeepSeek provider added without a working API key (the /models probe needs auth, so these seeds persist until a valid key enables live discovery). If those exact ids are not yet served by https://api.deepseek.com, they will appear selectable in the picker but fail at request time with a model-not-found error, since LiteLLM emits deepseek/<id> verbatim. The deepseek-chat/deepseek-reasoner aliases are known-good; please double-check the V4 ids match DeepSeek's current public catalog (and note deepseek-chat/deepseek-reasoner are flagged deprecated 2026/07/24, so the seed will need maintenance). Consider seeding only ids you can confirm route today, or documenting that the V4 ids are placeholders pending live discovery.

Reorder to lead with confirmed-routable ids and flag the V4 ids for verification.:

"deepseek": [
    # Confirmed routable today via deepseek/<id>:
    {"id": "deepseek-chat"},
    {"id": "deepseek-reasoner"},
    # V4 generation — keep only after confirming they are served by
    # https://api.deepseek.com (otherwise they 404 at request time).
    {"id": "deepseek-v4-pro"},
    {"id": "deepseek-v4-flash"},
],

Was this helpful? React with 👍 / 👎

}


Expand Down
Loading