@glassly/engine 0.3.5-dev.824 → 0.3.5-dev.827
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/engine.d.ts +3 -0
- package/build/engine.d.ts.map +1 -1
- package/build/facades/providerKeys.d.ts +6 -2
- package/build/facades/providerKeys.d.ts.map +1 -1
- package/build/facades/providerKeys.js +6 -2
- package/build/facades/providerKeys.js.map +1 -1
- package/build/generated/releaseMetadata.js +3 -3
- package/build/generated/releaseMetadata.js.map +1 -1
- package/build/services/AiTierResolution.d.ts +3 -2
- package/build/services/AiTierResolution.d.ts.map +1 -1
- package/build/services/AiTierResolution.js +7 -2
- package/build/services/AiTierResolution.js.map +1 -1
- package/build/services/CloudClientService.d.ts +4 -4
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
- package/build/services/LocalMiniappRuntime.js +6 -2
- package/build/services/LocalMiniappRuntime.js.map +1 -1
- package/build/services/ProviderKeyValidation.d.ts +2 -0
- package/build/services/ProviderKeyValidation.d.ts.map +1 -1
- package/build/services/ProviderKeyValidation.js +4 -0
- package/build/services/ProviderKeyValidation.js.map +1 -1
- package/build/stores/settings.d.ts.map +1 -1
- package/build/stores/settings.js +7 -0
- package/build/stores/settings.js.map +1 -1
- package/package.json +7 -7
- package/src/facades/providerKeys.ts +6 -1
- package/src/generated/releaseMetadata.ts +3 -3
- package/src/services/AiTierResolution.ts +9 -3
- package/src/services/LocalMiniappRuntime.ts +6 -1
- package/src/services/ProviderKeyValidation.ts +5 -0
- package/src/stores/settings.ts +7 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@glassly/engine",
|
|
3
|
-
"version": "0.3.5-dev.
|
|
3
|
+
"version": "0.3.5-dev.827",
|
|
4
4
|
"description": "Glassly Engine — miniapp registry, WebView bridge, and miniapp store",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"react-native": "src/index.ts",
|
|
@@ -97,17 +97,17 @@
|
|
|
97
97
|
"registry": "https://registry.npmjs.org/"
|
|
98
98
|
},
|
|
99
99
|
"dependencies": {
|
|
100
|
-
"@glassly/bluetooth-sdk": "0.3.5-dev.
|
|
101
|
-
"@glassly/cloud-client": "0.3.5-dev.
|
|
102
|
-
"@glassly/cloud-protocol": "0.3.5-dev.
|
|
103
|
-
"@glassly/crust": "0.3.5-dev.
|
|
104
|
-
"@glassly/miniapp": "0.3.5-dev.
|
|
100
|
+
"@glassly/bluetooth-sdk": "0.3.5-dev.827",
|
|
101
|
+
"@glassly/cloud-client": "0.3.5-dev.827",
|
|
102
|
+
"@glassly/cloud-protocol": "0.3.5-dev.827",
|
|
103
|
+
"@glassly/crust": "0.3.5-dev.827",
|
|
104
|
+
"@glassly/miniapp": "0.3.5-dev.827",
|
|
105
105
|
"buffer": "^6.0.3",
|
|
106
106
|
"events": "^3.3.0",
|
|
107
107
|
"react-native-marked": "8.1.1",
|
|
108
108
|
"semver": "^7.7.4",
|
|
109
109
|
"typesafe-ts": "^1.7.1",
|
|
110
|
-
"@glassly/llm-providers": "0.3.5-dev.
|
|
110
|
+
"@glassly/llm-providers": "0.3.5-dev.827",
|
|
111
111
|
"@huggingface/jinja": "^0.5.9",
|
|
112
112
|
"jsonrepair": "^3.12.0"
|
|
113
113
|
},
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* providerKeys facade — `engine.providerKeys.{anthropic,gemini,elevenlabs}`:
|
|
2
|
+
* providerKeys facade — `engine.providerKeys.{anthropic,gemini,openai,deepseek,elevenlabs}`:
|
|
3
3
|
* validate-before-save probes for the user-supplied AI/voice provider keys
|
|
4
4
|
* (Settings > API Keys). Same per-provider shape as `engine.maps.mapbox` /
|
|
5
5
|
* `engine.speech.sonioxDirect` so the Keys screen treats providers uniformly.
|
|
6
6
|
*/
|
|
7
7
|
import {
|
|
8
8
|
validateAnthropicApiKey,
|
|
9
|
+
validateDeepSeekApiKey,
|
|
9
10
|
validateElevenLabsApiKey,
|
|
10
11
|
validateGeminiApiKey,
|
|
11
12
|
validateOpenAiApiKey,
|
|
@@ -24,6 +25,10 @@ export const providerKeys = {
|
|
|
24
25
|
/** Probe a key against the OpenAI API without saving it. */
|
|
25
26
|
validateKey: (...args: Parameters<typeof validateOpenAiApiKey>) => validateOpenAiApiKey(...args),
|
|
26
27
|
},
|
|
28
|
+
deepseek: {
|
|
29
|
+
/** Probe a key against the DeepSeek API without saving it. */
|
|
30
|
+
validateKey: (...args: Parameters<typeof validateDeepSeekApiKey>) => validateDeepSeekApiKey(...args),
|
|
31
|
+
},
|
|
27
32
|
elevenlabs: {
|
|
28
33
|
/** Probe a key against the ElevenLabs API without saving it. */
|
|
29
34
|
validateKey: (...args: Parameters<typeof validateElevenLabsApiKey>) => validateElevenLabsApiKey(...args),
|
|
@@ -12,9 +12,9 @@ export interface EngineReleaseMetadata {
|
|
|
12
12
|
export const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({
|
|
13
13
|
"schemaVersion": 1,
|
|
14
14
|
"familyBaseVersion": "0.3.5",
|
|
15
|
-
"releaseIdentity": "0.3.5-dev.
|
|
16
|
-
"releaseSetId": "glassly-0.3.5-dev.
|
|
17
|
-
"sourceCommit": "
|
|
15
|
+
"releaseIdentity": "0.3.5-dev.827",
|
|
16
|
+
"releaseSetId": "glassly-0.3.5-dev.827",
|
|
17
|
+
"sourceCommit": "1e8c3531056e8b57715286819f58f7caeac457b3",
|
|
18
18
|
"otaManifestUrl": null,
|
|
19
19
|
"otaManifestSha256": null
|
|
20
20
|
})
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
export type AiTier = "quick" | "balanced" | "frontier"
|
|
14
|
-
export type AiTierProvider = "anthropic" | "gemini" | "openai"
|
|
14
|
+
export type AiTierProvider = "anthropic" | "gemini" | "openai" | "deepseek"
|
|
15
15
|
|
|
16
16
|
export const AI_TIERS: readonly AiTier[] = ["quick", "balanced", "frontier"]
|
|
17
17
|
|
|
@@ -27,23 +27,27 @@ export interface TierModelOption {
|
|
|
27
27
|
* Curated per-tier model registry — the only place model ids live on the
|
|
28
28
|
* phone. Order within a tier is the "auto" preference order: first entry
|
|
29
29
|
* whose provider has a saved key wins. Anthropic leads (matching the cloud's
|
|
30
|
-
* default provider), then Gemini (the pre-tier quick default), then OpenAI
|
|
30
|
+
* default provider), then Gemini (the pre-tier quick default), then OpenAI,
|
|
31
|
+
* then DeepSeek.
|
|
31
32
|
*/
|
|
32
33
|
export const TIER_MODEL_OPTIONS: Record<AiTier, TierModelOption[]> = {
|
|
33
34
|
quick: [
|
|
34
35
|
{provider: "anthropic", model: "claude-haiku-4-5", label: "Claude Haiku 4.5"},
|
|
35
36
|
{provider: "gemini", model: "gemini-3.5-flash-lite", label: "Gemini 3.5 Flash Lite"},
|
|
36
37
|
{provider: "openai", model: "gpt-5-mini", label: "GPT-5 mini"},
|
|
38
|
+
{provider: "deepseek", model: "deepseek-chat", label: "DeepSeek Chat"},
|
|
37
39
|
],
|
|
38
40
|
balanced: [
|
|
39
41
|
{provider: "anthropic", model: "claude-haiku-4-5", label: "Claude Haiku 4.5"},
|
|
40
42
|
{provider: "gemini", model: "gemini-3.5-flash", label: "Gemini 3.5 Flash"},
|
|
41
43
|
{provider: "openai", model: "gpt-5.1", label: "GPT-5.1"},
|
|
44
|
+
{provider: "deepseek", model: "deepseek-chat", label: "DeepSeek Chat"},
|
|
42
45
|
],
|
|
43
46
|
frontier: [
|
|
44
47
|
{provider: "anthropic", model: "claude-sonnet-5", label: "Claude Sonnet 5"},
|
|
45
48
|
{provider: "gemini", model: "gemini-3.1-pro-preview", label: "Gemini 3.1 Pro"},
|
|
46
49
|
{provider: "openai", model: "gpt-5.1", label: "GPT-5.1"},
|
|
50
|
+
{provider: "deepseek", model: "deepseek-reasoner", label: "DeepSeek Reasoner"},
|
|
47
51
|
],
|
|
48
52
|
}
|
|
49
53
|
|
|
@@ -82,7 +86,9 @@ export function parseTierSetting(value: unknown): {provider: AiTierProvider; mod
|
|
|
82
86
|
const stored = value.slice(sep + 1).trim()
|
|
83
87
|
if (!stored) return null
|
|
84
88
|
const model = RETIRED_MODELS[stored] ?? stored
|
|
85
|
-
if (provider !== "anthropic" && provider !== "gemini" && provider !== "openai")
|
|
89
|
+
if (provider !== "anthropic" && provider !== "gemini" && provider !== "openai" && provider !== "deepseek") {
|
|
90
|
+
return null
|
|
91
|
+
}
|
|
86
92
|
return {provider, model}
|
|
87
93
|
}
|
|
88
94
|
|
|
@@ -46,6 +46,7 @@ import {markTranscriptSourceRecent, useTranscriptionDebugStore} from "../stores/
|
|
|
46
46
|
import {resolveMapboxRenderToken} from "./MapboxTokenService"
|
|
47
47
|
import {
|
|
48
48
|
createAnthropicProvider,
|
|
49
|
+
createDeepSeekProvider,
|
|
49
50
|
createGeminiProvider,
|
|
50
51
|
createOpenAiProvider,
|
|
51
52
|
type LlmProviderImpl,
|
|
@@ -429,6 +430,7 @@ const MINIAPP_READABLE_API_KEYS: Record<string, string> = {
|
|
|
429
430
|
anthropic: SETTINGS.anthropic_api_key.key,
|
|
430
431
|
gemini: SETTINGS.gemini_api_key.key,
|
|
431
432
|
openai: SETTINGS.openai_api_key.key,
|
|
433
|
+
deepseek: SETTINGS.deepseek_api_key.key,
|
|
432
434
|
elevenlabs: SETTINGS.elevenlabs_api_key.key,
|
|
433
435
|
mapbox: SETTINGS.mapbox_api_key.key,
|
|
434
436
|
}
|
|
@@ -450,7 +452,9 @@ function directLlmProvider(name: AiTierProvider): LlmProviderImpl {
|
|
|
450
452
|
? createGeminiProvider({logger})
|
|
451
453
|
: name === "openai"
|
|
452
454
|
? createOpenAiProvider({logger})
|
|
453
|
-
:
|
|
455
|
+
: name === "deepseek"
|
|
456
|
+
? createDeepSeekProvider({logger})
|
|
457
|
+
: createAnthropicProvider({logger})
|
|
454
458
|
directLlmProviders.set(name, built)
|
|
455
459
|
return built
|
|
456
460
|
}
|
|
@@ -470,6 +474,7 @@ function savedLlmKeys(): SavedLlmKeys {
|
|
|
470
474
|
anthropic: userLlmKey("anthropic").length > 0,
|
|
471
475
|
gemini: userLlmKey("gemini").length > 0,
|
|
472
476
|
openai: userLlmKey("openai").length > 0,
|
|
477
|
+
deepseek: userLlmKey("deepseek").length > 0,
|
|
473
478
|
}
|
|
474
479
|
}
|
|
475
480
|
|
|
@@ -51,6 +51,11 @@ export function validateOpenAiApiKey(apiKey: string): Promise<KeyValidationResul
|
|
|
51
51
|
return probe("https://api.openai.com/v1/models", {Authorization: `Bearer ${apiKey.trim()}`}, [401, 403])
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
/** GET /models with the candidate key; DeepSeek answers 401 for bad keys. */
|
|
55
|
+
export function validateDeepSeekApiKey(apiKey: string): Promise<KeyValidationResult> {
|
|
56
|
+
return probe("https://api.deepseek.com/models", {Authorization: `Bearer ${apiKey.trim()}`}, [401, 403])
|
|
57
|
+
}
|
|
58
|
+
|
|
54
59
|
/** GET /v1/user with the candidate key; ElevenLabs answers 401 for bad keys. */
|
|
55
60
|
export function validateElevenLabsApiKey(apiKey: string): Promise<KeyValidationResult> {
|
|
56
61
|
return probe("https://api.elevenlabs.io/v1/user", {"xi-api-key": apiKey.trim()}, [401, 403])
|
package/src/stores/settings.ts
CHANGED
|
@@ -352,6 +352,13 @@ export const SETTINGS: Record<string, Setting> = {
|
|
|
352
352
|
saveOnServer: false,
|
|
353
353
|
persist: true,
|
|
354
354
|
},
|
|
355
|
+
deepseek_api_key: {
|
|
356
|
+
key: "deepseek_api_key",
|
|
357
|
+
defaultValue: () => "",
|
|
358
|
+
writable: true,
|
|
359
|
+
saveOnServer: false,
|
|
360
|
+
persist: true,
|
|
361
|
+
},
|
|
355
362
|
elevenlabs_api_key: {
|
|
356
363
|
key: "elevenlabs_api_key",
|
|
357
364
|
defaultValue: () => "",
|