@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glassly/engine",
3
- "version": "0.3.5-dev.824",
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.824",
101
- "@glassly/cloud-client": "0.3.5-dev.824",
102
- "@glassly/cloud-protocol": "0.3.5-dev.824",
103
- "@glassly/crust": "0.3.5-dev.824",
104
- "@glassly/miniapp": "0.3.5-dev.824",
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.824",
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.824",
16
- "releaseSetId": "glassly-0.3.5-dev.824",
17
- "sourceCommit": "726bcaa9966eaeb26539b95a7a8aca96dfee6e27",
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") return null
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
- : createAnthropicProvider({logger})
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])
@@ -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: () => "",