Skip to content

Commit 87d4ae7

Browse files
committed
Add Nemotron 3 Ultra 550B A55B via Kilo (kilo.ai)
- Add KILO provider to PROVIDERS, PROVIDER_ORDER, PROVIDER_API - Add KILO_NEMOTRON_3_ULTRA_550B model (nvidia/nemotron-3-ultra-550b-a55b:free) - Free tier: 200 requests/hour per IP, no API key required for anonymous use - hasRequiredApiKeyForCurrentModel() returns true for KILO (key optional) - _callOpenAiCompat skips 'No API key' error for providers with keyOptional:true - Authorization header only sent when a key is actually stored - Key manager shows KILO tab for optional paid key management - Placeholder text clarifies key is optional for Kilo
1 parent f9f4ef6 commit 87d4ae7

1 file changed

Lines changed: 17 additions & 4 deletions

File tree

index.html

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -960,10 +960,11 @@
960960
GROQ: { name:'Groq', keyUrl:'https://console.groq.com/keys', keyLabel:'Get API Key for Groq' },
961961
VERCEL: { name:'Vercel', keyUrl:'https://vercel.com/ai-gateway', keyLabel:'Get API Key for Vercel' },
962962
CLOUDFLARE:{ name:'Cloudflare',keyUrl:'https://dash.cloudflare.com/', keyLabel:'Get API Key for Cloudflare' },
963+
KILO: { name:'Kilo', keyUrl:'https://app.kilo.ai/settings/api-keys', keyLabel:'Get API Key for Kilo (optional)' },
963964
HUMAN_EXPERT:{ name:'Human Expert', keyUrl:'', keyLabel:'' },
964965
};
965966

966-
const PROVIDER_ORDER = ['VERCEL','CEREBRAS','GOOGLE','MISTRAL','GROQ','CLOUDFLARE','PUTER'];
967+
const PROVIDER_ORDER = ['VERCEL','CEREBRAS','GOOGLE','MISTRAL','GROQ','CLOUDFLARE','KILO','PUTER'];
967968

968969
/* ════════════════════════════════════════════════════════
969970
CUSTOM PROVIDERS — add a genuinely new provider/model here, entirely in
@@ -1018,6 +1019,7 @@
10181019
{ id:'PUTER_QWEN2_5_VL_72B', displayName:'Qwen3.7 Plus (Puter)', modelName:'qwen/qwen3.7-plus', apiProvider:'PUTER', supportsScreenshot:true, supportsTopK:false, supportsThinking:true, isOffline:false, hint:'$0.32/M input | $1.28/M output – thinking enabled', strike:false },
10191020
{ id:'PUTER_LING_3_FLASH', displayName:'Ling 3.0 Flash (Puter)', modelName:'inclusionai/ling-3.0-flash:free', apiProvider:'PUTER', supportsScreenshot:false, supportsTopK:false, supportsThinking:true, isOffline:false, hint:'Free - Free access is only available for a short time; after that, access will be interrupted server-side. – thinking enabled', strike:false },
10201021
{ id:'PUTER_NEMOTRON_3_NANO_OMNI_30B', displayName:'Nemotron 3 Nano Omni 30B A3B (Puter)', modelName:'nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free', apiProvider:'PUTER', supportsScreenshot:true, supportsTopK:false, supportsThinking:true, isOffline:false, hint:'free - Can watch videos. Free models could be deactivated server-side at any time – thinking enabled', strike:false },
1022+
{ id:'KILO_NEMOTRON_3_ULTRA_550B', displayName:'Nemotron 3 Ultra 550B A55B (Kilo)', modelName:'nvidia/nemotron-3-ultra-550b-a55b:free', apiProvider:'KILO', supportsScreenshot:false, supportsTopK:false, supportsThinking:false, isOffline:false, hint:'200 requests/hour per IP address are free', strike:false },
10211023
{ id:'GROQ_QWEN3_6_27B', displayName:'Qwen3.6 27B (Groq)', modelName:'qwen/qwen3.6-27b', apiProvider:'GROQ', supportsScreenshot:false, supportsTopK:true, supportsThinking:true, isOffline:false, hint:'30 free requests per min – thinking enabled', strike:false },
10221024
{ id:'GROQ_GPT_OSS_120B', displayName:'GPT-OSS 120B (Groq)', modelName:'openai/gpt-oss-120b', apiProvider:'GROQ', supportsScreenshot:false, supportsTopK:true, supportsThinking:true, isOffline:false, hint:'30 free requests per min – thinking enabled', strike:false },
10231025
{ id:'MISTRAL_LARGE_3', displayName:'Mistral Large 3', modelName:'mistral-large-latest', apiProvider:'MISTRAL', supportsScreenshot:true, supportsTopK:false, supportsThinking:false, isOffline:false, hint:'', strike:false },
@@ -1506,6 +1508,8 @@
15061508
if (!m) return true;
15071509
if (m.id === 'HUMAN_EXPERT') return true;
15081510
if (m.isOffline) return true;
1511+
// KILO free tier needs no API key (anonymous, 200 req/h per IP); key is optional for paid use.
1512+
if (m.apiProvider === 'KILO') return true;
15091513
if (m.apiProvider === 'CUSTOM') {
15101514
const keys = _getCustomModelApiKeys(m.id);
15111515
return keys.length > 0;
@@ -2077,6 +2081,13 @@
20772081
keyHeader: 'Authorization',
20782082
keyPrefix: 'Bearer ',
20792083
},
2084+
KILO: {
2085+
endpoint: () => 'https://api.kilo.ai/api/gateway/chat/completions',
2086+
keyHeader: 'Authorization',
2087+
keyPrefix: 'Bearer ',
2088+
// Free tier: no API key required (200 req/hour per IP); key is optional for paid use.
2089+
keyOptional: true,
2090+
},
20802091
};
20812092

20822093
/* ── MAIN ENTRY POINT: called by Android for every AI turn ───── */
@@ -3255,12 +3266,12 @@
32553266
keyHeader = provDef.keyHeader;
32563267
keyPrefix = provDef.keyPrefix || '';
32573268
keys = Bridge.getAllApiKeys(provider);
3258-
if (!keys.length) {
3269+
if (!keys.length && !provDef.keyOptional) {
32593270
Bridge.onCustomModelError('No API key for ' + provider + '. Please add one in the menu.');
32603271
return;
32613272
}
32623273
keyIdx = Bridge.getCurrentKeyIndex(provider) || 0;
3263-
apiKey = keys[keyIdx] || keys[0];
3274+
apiKey = keys.length ? (keys[keyIdx] || keys[0]) : undefined;
32643275
} else {
32653276
// Custom model (defined in CUSTOM_PROVIDERS above) – supports multiple keys with rotation
32663277
endpoint = payload.endpoint;
@@ -5412,7 +5423,9 @@
54125423
link.style.display = 'none';
54135424
}
54145425
document.getElementById('new-key-input').placeholder =
5415-
currentProviderId==='PUTER' ? 'Enter Puter Auth Token' : 'Enter '+PROVIDERS[currentProviderId]?.name+' API Key';
5426+
currentProviderId==='PUTER' ? 'Enter Puter Auth Token' :
5427+
currentProviderId==='KILO' ? 'Enter Kilo API Key (optional – free without key)' :
5428+
'Enter '+PROVIDERS[currentProviderId]?.name+' API Key';
54165429
}
54175430
function renderKeyList() {
54185431
const list = document.getElementById('key-list');

0 commit comments

Comments
 (0)