@realtimex/folio 0.1.13 → 0.1.14

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.
@@ -209,14 +209,11 @@ router.post(
209
209
  }
210
210
  const { data: settingsRow } = await req.supabase
211
211
  .from("user_settings")
212
- .select("llm_provider, llm_model")
212
+ .select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model")
213
213
  .eq("user_id", req.user.id)
214
214
  .maybeSingle();
215
215
 
216
- const llmSettings = {
217
- llm_provider: settingsRow?.llm_provider ?? undefined,
218
- llm_model: settingsRow?.llm_model ?? undefined,
219
- };
216
+ const llmSettings = IngestionService.resolveIngestionLlmSettings(settingsRow);
220
217
 
221
218
  const summary = await IngestionService.summarize(
222
219
  req.params["id"] as string,
@@ -36,6 +36,8 @@ router.patch("/", asyncHandler(async (req, res) => {
36
36
  const payload = {
37
37
  llm_provider: body.llm_provider,
38
38
  llm_model: body.llm_model,
39
+ ingestion_llm_provider: body.ingestion_llm_provider,
40
+ ingestion_llm_model: body.ingestion_llm_model,
39
41
  sync_interval_minutes: body.sync_interval_minutes,
40
42
  tts_auto_play: body.tts_auto_play,
41
43
  tts_provider: body.tts_provider,
@@ -262,6 +262,18 @@ export class IngestionService {
262
262
  return `data:${mimeType};base64,${base64}`;
263
263
  }
264
264
 
265
+ static resolveIngestionLlmSettings(settingsRow: {
266
+ llm_provider?: string | null;
267
+ llm_model?: string | null;
268
+ ingestion_llm_provider?: string | null;
269
+ ingestion_llm_model?: string | null;
270
+ } | null | undefined): { llm_provider?: string; llm_model?: string } {
271
+ return {
272
+ llm_provider: settingsRow?.ingestion_llm_provider ?? settingsRow?.llm_provider ?? undefined,
273
+ llm_model: settingsRow?.ingestion_llm_model ?? settingsRow?.llm_model ?? undefined,
274
+ };
275
+ }
276
+
265
277
  private static errorToMessage(error: unknown): string {
266
278
  if (error instanceof Error) return error.message;
267
279
  if (typeof error === "string") return error;
@@ -426,7 +438,7 @@ export class IngestionService {
426
438
  // Pre-fetch settings to decide whether we should attempt VLM.
427
439
  const { data: triageSettingsRow } = await supabase
428
440
  .from("user_settings")
429
- .select("llm_provider, llm_model, embedding_provider, embedding_model, vision_model_capabilities")
441
+ .select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model, embedding_provider, embedding_model, vision_model_capabilities")
430
442
  .eq("user_id", userId)
431
443
  .maybeSingle();
432
444
  const imageResolution = ModelCapabilityService.resolveVisionSupport(triageSettingsRow, "image");
@@ -502,13 +514,10 @@ export class IngestionService {
502
514
  // 3. Fast Path — fetch all dependencies in parallel
503
515
  const [userPolicies, processingSettingsRow, baselineConfig] = await Promise.all([
504
516
  PolicyLoader.load(false, supabase),
505
- supabase.from("user_settings").select("llm_provider, llm_model, embedding_provider, embedding_model").eq("user_id", userId).maybeSingle(),
517
+ supabase.from("user_settings").select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model, embedding_provider, embedding_model").eq("user_id", userId).maybeSingle(),
506
518
  BaselineConfigService.getActive(supabase, userId),
507
519
  ]);
508
- const llmSettings = {
509
- llm_provider: processingSettingsRow.data?.llm_provider ?? undefined,
510
- llm_model: processingSettingsRow.data?.llm_model ?? undefined,
511
- };
520
+ const llmSettings = this.resolveIngestionLlmSettings(processingSettingsRow.data);
512
521
  const embedSettings = {
513
522
  embedding_provider: processingSettingsRow.data?.embedding_provider ?? undefined,
514
523
  embedding_model: processingSettingsRow.data?.embedding_model ?? undefined,
@@ -809,7 +818,7 @@ export class IngestionService {
809
818
 
810
819
  const { data: triageSettingsRow } = await supabase
811
820
  .from("user_settings")
812
- .select("llm_provider, llm_model, embedding_provider, embedding_model, vision_model_capabilities")
821
+ .select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model, embedding_provider, embedding_model, vision_model_capabilities")
813
822
  .eq("user_id", userId)
814
823
  .maybeSingle();
815
824
  const imageResolution = ModelCapabilityService.resolveVisionSupport(triageSettingsRow, "image");
@@ -881,13 +890,10 @@ export class IngestionService {
881
890
  if (isFastPath) {
882
891
  const [userPolicies, processingSettingsRow, baselineConfig] = await Promise.all([
883
892
  PolicyLoader.load(false, supabase),
884
- supabase.from("user_settings").select("llm_provider, llm_model, embedding_provider, embedding_model").eq("user_id", userId).maybeSingle(),
893
+ supabase.from("user_settings").select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model, embedding_provider, embedding_model").eq("user_id", userId).maybeSingle(),
885
894
  BaselineConfigService.getActive(supabase, userId),
886
895
  ]);
887
- const llmSettings = {
888
- llm_provider: processingSettingsRow.data?.llm_provider ?? undefined,
889
- llm_model: processingSettingsRow.data?.llm_model ?? undefined,
890
- };
896
+ const llmSettings = this.resolveIngestionLlmSettings(processingSettingsRow.data);
891
897
  const embedSettings = {
892
898
  embedding_provider: processingSettingsRow.data?.embedding_provider ?? undefined,
893
899
  embedding_model: processingSettingsRow.data?.embedding_model ?? undefined,
@@ -23,6 +23,8 @@ type VisionCapabilityMap = Record<string, StoredVisionCapability>;
23
23
  interface SettingsLike {
24
24
  llm_provider?: string | null;
25
25
  llm_model?: string | null;
26
+ ingestion_llm_provider?: string | null;
27
+ ingestion_llm_model?: string | null;
26
28
  vision_model_capabilities?: unknown;
27
29
  }
28
30
 
@@ -59,8 +61,16 @@ export class ModelCapabilityService {
59
61
  settingsRow: SettingsLike | null | undefined,
60
62
  modality: VisionCapabilityModality = "image"
61
63
  ): VisionResolution {
62
- const provider = (settingsRow?.llm_provider || SDKService.DEFAULT_LLM_PROVIDER).trim();
63
- const model = (settingsRow?.llm_model || SDKService.DEFAULT_LLM_MODEL).trim();
64
+ const provider = (
65
+ settingsRow?.ingestion_llm_provider ||
66
+ settingsRow?.llm_provider ||
67
+ SDKService.DEFAULT_LLM_PROVIDER
68
+ ).trim();
69
+ const model = (
70
+ settingsRow?.ingestion_llm_model ||
71
+ settingsRow?.llm_model ||
72
+ SDKService.DEFAULT_LLM_MODEL
73
+ ).trim();
64
74
  const state = this.getVisionState(settingsRow?.vision_model_capabilities, provider, model, modality);
65
75
  return {
66
76
  provider,
@@ -94,6 +94,8 @@ export interface UserSettings {
94
94
  user_id: string;
95
95
  llm_provider: string | null;
96
96
  llm_model: string | null;
97
+ ingestion_llm_provider: string | null;
98
+ ingestion_llm_model: string | null;
97
99
  vision_model_capabilities: Record<string, unknown> | null;
98
100
  sync_interval_minutes: number;
99
101
  created_at: string;
@@ -158,13 +158,10 @@ router.post("/:id/summarize", asyncHandler(async (req, res) => {
158
158
  }
159
159
  const { data: settingsRow } = await req.supabase
160
160
  .from("user_settings")
161
- .select("llm_provider, llm_model")
161
+ .select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model")
162
162
  .eq("user_id", req.user.id)
163
163
  .maybeSingle();
164
- const llmSettings = {
165
- llm_provider: settingsRow?.llm_provider ?? undefined,
166
- llm_model: settingsRow?.llm_model ?? undefined,
167
- };
164
+ const llmSettings = IngestionService.resolveIngestionLlmSettings(settingsRow);
168
165
  const summary = await IngestionService.summarize(req.params["id"], req.supabase, req.user.id, llmSettings);
169
166
  res.json({ success: true, summary });
170
167
  }));
@@ -29,6 +29,8 @@ router.patch("/", asyncHandler(async (req, res) => {
29
29
  const payload = {
30
30
  llm_provider: body.llm_provider,
31
31
  llm_model: body.llm_model,
32
+ ingestion_llm_provider: body.ingestion_llm_provider,
33
+ ingestion_llm_model: body.ingestion_llm_model,
32
34
  sync_interval_minutes: body.sync_interval_minutes,
33
35
  tts_auto_play: body.tts_auto_play,
34
36
  tts_provider: body.tts_provider,
@@ -186,6 +186,12 @@ export class IngestionService {
186
186
  const base64 = buffer.toString("base64");
187
187
  return `data:${mimeType};base64,${base64}`;
188
188
  }
189
+ static resolveIngestionLlmSettings(settingsRow) {
190
+ return {
191
+ llm_provider: settingsRow?.ingestion_llm_provider ?? settingsRow?.llm_provider ?? undefined,
192
+ llm_model: settingsRow?.ingestion_llm_model ?? settingsRow?.llm_model ?? undefined,
193
+ };
194
+ }
189
195
  static errorToMessage(error) {
190
196
  if (error instanceof Error)
191
197
  return error.message;
@@ -311,7 +317,7 @@ export class IngestionService {
311
317
  // Pre-fetch settings to decide whether we should attempt VLM.
312
318
  const { data: triageSettingsRow } = await supabase
313
319
  .from("user_settings")
314
- .select("llm_provider, llm_model, embedding_provider, embedding_model, vision_model_capabilities")
320
+ .select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model, embedding_provider, embedding_model, vision_model_capabilities")
315
321
  .eq("user_id", userId)
316
322
  .maybeSingle();
317
323
  const imageResolution = ModelCapabilityService.resolveVisionSupport(triageSettingsRow, "image");
@@ -392,13 +398,10 @@ export class IngestionService {
392
398
  // 3. Fast Path — fetch all dependencies in parallel
393
399
  const [userPolicies, processingSettingsRow, baselineConfig] = await Promise.all([
394
400
  PolicyLoader.load(false, supabase),
395
- supabase.from("user_settings").select("llm_provider, llm_model, embedding_provider, embedding_model").eq("user_id", userId).maybeSingle(),
401
+ supabase.from("user_settings").select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model, embedding_provider, embedding_model").eq("user_id", userId).maybeSingle(),
396
402
  BaselineConfigService.getActive(supabase, userId),
397
403
  ]);
398
- const llmSettings = {
399
- llm_provider: processingSettingsRow.data?.llm_provider ?? undefined,
400
- llm_model: processingSettingsRow.data?.llm_model ?? undefined,
401
- };
404
+ const llmSettings = this.resolveIngestionLlmSettings(processingSettingsRow.data);
402
405
  const embedSettings = {
403
406
  embedding_provider: processingSettingsRow.data?.embedding_provider ?? undefined,
404
407
  embedding_model: processingSettingsRow.data?.embedding_model ?? undefined,
@@ -668,7 +671,7 @@ export class IngestionService {
668
671
  const ext = filename.toLowerCase().split('.').pop() || '';
669
672
  const { data: triageSettingsRow } = await supabase
670
673
  .from("user_settings")
671
- .select("llm_provider, llm_model, embedding_provider, embedding_model, vision_model_capabilities")
674
+ .select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model, embedding_provider, embedding_model, vision_model_capabilities")
672
675
  .eq("user_id", userId)
673
676
  .maybeSingle();
674
677
  const imageResolution = ModelCapabilityService.resolveVisionSupport(triageSettingsRow, "image");
@@ -745,13 +748,10 @@ export class IngestionService {
745
748
  if (isFastPath) {
746
749
  const [userPolicies, processingSettingsRow, baselineConfig] = await Promise.all([
747
750
  PolicyLoader.load(false, supabase),
748
- supabase.from("user_settings").select("llm_provider, llm_model, embedding_provider, embedding_model").eq("user_id", userId).maybeSingle(),
751
+ supabase.from("user_settings").select("llm_provider, llm_model, ingestion_llm_provider, ingestion_llm_model, embedding_provider, embedding_model").eq("user_id", userId).maybeSingle(),
749
752
  BaselineConfigService.getActive(supabase, userId),
750
753
  ]);
751
- const llmSettings = {
752
- llm_provider: processingSettingsRow.data?.llm_provider ?? undefined,
753
- llm_model: processingSettingsRow.data?.llm_model ?? undefined,
754
- };
754
+ const llmSettings = this.resolveIngestionLlmSettings(processingSettingsRow.data);
755
755
  const embedSettings = {
756
756
  embedding_provider: processingSettingsRow.data?.embedding_provider ?? undefined,
757
757
  embedding_model: processingSettingsRow.data?.embedding_model ?? undefined,
@@ -9,8 +9,12 @@ export class ModelCapabilityService {
9
9
  static UNSUPPORTED_CONFIRMATION_FAILURES = 2;
10
10
  static UNSUPPORTED_SCORE_THRESHOLD = 3;
11
11
  static resolveVisionSupport(settingsRow, modality = "image") {
12
- const provider = (settingsRow?.llm_provider || SDKService.DEFAULT_LLM_PROVIDER).trim();
13
- const model = (settingsRow?.llm_model || SDKService.DEFAULT_LLM_MODEL).trim();
12
+ const provider = (settingsRow?.ingestion_llm_provider ||
13
+ settingsRow?.llm_provider ||
14
+ SDKService.DEFAULT_LLM_PROVIDER).trim();
15
+ const model = (settingsRow?.ingestion_llm_model ||
16
+ settingsRow?.llm_model ||
17
+ SDKService.DEFAULT_LLM_MODEL).trim();
14
18
  const state = this.getVisionState(settingsRow?.vision_model_capabilities, provider, model, modality);
15
19
  return {
16
20
  provider,