@camstack/addon-ai 0.4.52 → 0.4.53

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.
Files changed (3) hide show
  1. package/dist/addon.js +145 -40
  2. package/dist/addon.mjs +145 -40
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -7921,7 +7921,8 @@ var OpsLogReasonSchema = _enum([
7921
7921
  "quota",
7922
7922
  "manual",
7923
7923
  "operator",
7924
- "maintenance"
7924
+ "maintenance",
7925
+ "orphaned-device"
7925
7926
  ]);
7926
7927
  /** One audit row, shared verbatim by both domains. */
7927
7928
  var OpsLogEntrySchema = object({
@@ -12952,10 +12953,39 @@ var DevicePersistConfigPayloadSchema = object({
12952
12953
  deviceId: number$1(),
12953
12954
  data: record(string(), unknown())
12954
12955
  });
12956
+ /** What a migration actually did, per switch. `unreachable` is a first-class
12957
+ * answer: a camera that could not be asked is not a camera that was silenced. */
12958
+ var MigrateSwitchOutcomeSchema = _enum([
12959
+ "off",
12960
+ "on",
12961
+ "not-offered",
12962
+ "unreachable"
12963
+ ]);
12964
+ var MigrateSwitchReportSchema = object({
12965
+ deviceId: number$1(),
12966
+ switchId: CameraSwitchIdSchema,
12967
+ outcome: MigrateSwitchOutcomeSchema,
12968
+ detail: string().optional()
12969
+ });
12970
+ var MigrateDeviceResultSchema = object({
12971
+ sourceId: number$1(),
12972
+ targetId: number$1(),
12973
+ switches: array(MigrateSwitchReportSchema).readonly(),
12974
+ /** Switches that could NOT be turned off on the source. Empty is the only
12975
+ * value meaning the replaced hardware is quiet. */
12976
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
12977
+ swapped: boolean()
12978
+ });
12955
12979
  method(object({
12956
12980
  addonId: string(),
12957
12981
  stableId: string()
12958
- }), object({ id: number$1() }), { kind: "mutation" }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number$1() }), record(string(), unknown())), method(object({ deviceId: number$1() }), record(string(), unknown())), method(object({ deviceId: number$1() }), DeviceMetaSchema.nullable()), method(object({
12982
+ }), object({ id: number$1() }), { kind: "mutation" }), method(object({
12983
+ sourceId: number$1(),
12984
+ targetId: number$1()
12985
+ }), MigrateDeviceResultSchema, {
12986
+ kind: "mutation",
12987
+ auth: "admin"
12988
+ }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number$1() }), record(string(), unknown())), method(object({ deviceId: number$1() }), record(string(), unknown())), method(object({ deviceId: number$1() }), DeviceMetaSchema.nullable()), method(object({
12959
12989
  deviceId: number$1(),
12960
12990
  name: string()
12961
12991
  }), _void(), {
@@ -30552,6 +30582,12 @@ Object.freeze({
30552
30582
  addonId: null,
30553
30583
  access: "view"
30554
30584
  },
30585
+ "deviceManager.migrateDevice": {
30586
+ capName: "device-manager",
30587
+ capScope: "system",
30588
+ addonId: null,
30589
+ access: "create"
30590
+ },
30555
30591
  "deviceManager.persistConfig": {
30556
30592
  capName: "device-manager",
30557
30593
  capScope: "system",
@@ -74735,43 +74771,6 @@ var LLAMA = textEntry({
74735
74771
  minRamBytes: Math.round(3.5 * GIB),
74736
74772
  contextSizeDefault: 4096
74737
74773
  });
74738
- var SMOLVLM_MODEL_BYTES = 1112602656;
74739
- var SMOLVLM_MMPROJ_BYTES = 872303680;
74740
- var SMOLVLM_MMPROJ_URL = "https://huggingface.co/ggml-org/SmolVLM2-2.2B-Instruct-GGUF/resolve/main/mmproj-SmolVLM2-2.2B-Instruct-f16.gguf";
74741
- var SMOLVLM = {
74742
- meta: {
74743
- id: "llm-smolvlm2-2.2b-instruct-q4",
74744
- label: "SmolVLM2 2.2B Instruct (vision)",
74745
- family: "smolvlm2",
74746
- purpose: "vision",
74747
- url: "https://huggingface.co/ggml-org/SmolVLM2-2.2B-Instruct-GGUF/resolve/main/SmolVLM2-2.2B-Instruct-Q4_K_M.gguf",
74748
- sha256: "0cf76814555b8665149075b74ab6b5c1d428ea1d3d01c1918c12012e8d7c9f58",
74749
- sizeBytes: SMOLVLM_MODEL_BYTES,
74750
- quantization: "Q4_K_M",
74751
- minRamBytes: 4 * GIB,
74752
- contextSizeDefault: 4096,
74753
- mmprojUrl: SMOLVLM_MMPROJ_URL
74754
- },
74755
- entry: {
74756
- id: "llm-smolvlm2-2.2b-instruct-q4",
74757
- name: "SmolVLM2 2.2B Instruct (vision)",
74758
- description: "smolvlm2 · Q4_K_M · +mmproj",
74759
- formats: { gguf: {
74760
- url: "https://huggingface.co/ggml-org/SmolVLM2-2.2B-Instruct-GGUF/resolve/main/SmolVLM2-2.2B-Instruct-Q4_K_M.gguf",
74761
- sizeMB: mb(SMOLVLM_MODEL_BYTES)
74762
- } },
74763
- inputSize: {
74764
- width: 0,
74765
- height: 0
74766
- },
74767
- labels: [],
74768
- extraFiles: [{
74769
- url: SMOLVLM_MMPROJ_URL,
74770
- filename: "mmproj-SmolVLM2-2.2B-Instruct-f16.gguf",
74771
- sizeMB: mb(SMOLVLM_MMPROJ_BYTES)
74772
- }]
74773
- }
74774
- };
74775
74774
  var QWEN3VL2B_MODEL_BYTES = 1107410624;
74776
74775
  var QWEN3VL2B_MMPROJ_BYTES = 819395232;
74777
74776
  var QWEN3VL2B_BASE = "https://huggingface.co/unsloth/Qwen3-VL-2B-Instruct-GGUF/resolve/main";
@@ -74818,6 +74817,111 @@ var QWEN3VL_2B = {
74818
74817
  }]
74819
74818
  }
74820
74819
  };
74820
+ var QWEN3VL4B_MODEL_BYTES = 2497282336;
74821
+ var QWEN3VL4B_MMPROJ_BYTES = 836180640;
74822
+ var QWEN3VL4B_BASE = "https://huggingface.co/unsloth/Qwen3-VL-4B-Instruct-GGUF/resolve/main";
74823
+ var QWEN3VL4B_MMPROJ_URL = `${QWEN3VL4B_BASE}/mmproj-F16.gguf`;
74824
+ var QWEN3VL4B_URL = `${QWEN3VL4B_BASE}/Qwen3-VL-4B-Instruct-Q4_K_M.gguf`;
74825
+ /**
74826
+ * The middle rung. It exists because the catalogue used to jump from 2B to a
74827
+ * 35B MoE, and the operator was running an 8B through an EXTERNAL LM Studio
74828
+ * endpoint precisely because nothing in between was offered here — the gap was
74829
+ * pushing the work outside the addon that is supposed to own it.
74830
+ *
74831
+ * At ~3.3 GB all in, this is also the only tier above 2B that a small
74832
+ * mini-PC-class node can hold, so the ladder is now 2B → 4B → 8B rather than
74833
+ * 2B → nothing.
74834
+ *
74835
+ * Same `qwen3vl_merger` projector as the 2B and the 8B: one prompt set and one
74836
+ * download shape cover all three. That is the reason this family was chosen
74837
+ * over its neighbours, not a benchmark — Gemma 4 and GLM-4.6V each want a
74838
+ * projector this addon has never exercised, for no verified gain at this size.
74839
+ */
74840
+ var QWEN3VL_4B = {
74841
+ meta: {
74842
+ id: "llm-qwen3-vl-4b-instruct-q4",
74843
+ label: "Qwen3-VL 4B Instruct (vision)",
74844
+ family: "qwen3-vl",
74845
+ purpose: "vision",
74846
+ url: QWEN3VL4B_URL,
74847
+ sha256: "d4dcd426bfba75752a312b266b80fec8136fbaca13c62d93b7ac41fa67f0492b",
74848
+ sizeBytes: QWEN3VL4B_MODEL_BYTES,
74849
+ quantization: "Q4_K_M",
74850
+ minRamBytes: 5 * GIB,
74851
+ contextSizeDefault: 8192,
74852
+ mmprojUrl: QWEN3VL4B_MMPROJ_URL
74853
+ },
74854
+ entry: {
74855
+ id: "llm-qwen3-vl-4b-instruct-q4",
74856
+ name: "Qwen3-VL 4B Instruct (vision)",
74857
+ description: "qwen3-vl · Q4_K_M · +mmproj",
74858
+ formats: { gguf: {
74859
+ url: QWEN3VL4B_URL,
74860
+ sizeMB: mb(QWEN3VL4B_MODEL_BYTES)
74861
+ } },
74862
+ inputSize: {
74863
+ width: 0,
74864
+ height: 0
74865
+ },
74866
+ labels: [],
74867
+ extraFiles: [{
74868
+ url: QWEN3VL4B_MMPROJ_URL,
74869
+ filename: "mmproj-F16.gguf",
74870
+ sizeMB: mb(QWEN3VL4B_MMPROJ_BYTES)
74871
+ }]
74872
+ }
74873
+ };
74874
+ var QWEN3VL8B_MODEL_BYTES = 5027785568;
74875
+ var QWEN3VL8B_MMPROJ_BYTES = 1159030336;
74876
+ var QWEN3VL8B_BASE = "https://huggingface.co/unsloth/Qwen3-VL-8B-Instruct-GGUF/resolve/main";
74877
+ var QWEN3VL8B_MMPROJ_URL = `${QWEN3VL8B_BASE}/mmproj-F16.gguf`;
74878
+ var QWEN3VL8B_URL = `${QWEN3VL8B_BASE}/Qwen3-VL-8B-Instruct-Q4_K_M.gguf`;
74879
+ /**
74880
+ * The tier the operator already trusts, brought in-house.
74881
+ *
74882
+ * This is the same weight class as the `qwen/qwen3-vl-8b` served by an external
74883
+ * LM Studio endpoint on the Mac: as a `managed-local` profile the addon owns
74884
+ * the runtime and `nodePin` puts the INFERENCE on that node, instead of the hub
74885
+ * calling out over HTTP to a process nobody here supervises.
74886
+ *
74887
+ * ~6.2 GB resident is a real bite on a 16 GB machine shared with the rest of
74888
+ * CamStack — that is what `minRamBytes` is for, and it is why the 4B above
74889
+ * exists rather than this being the only new rung.
74890
+ */
74891
+ var QWEN3VL_8B = {
74892
+ meta: {
74893
+ id: "llm-qwen3-vl-8b-instruct-q4",
74894
+ label: "Qwen3-VL 8B Instruct (vision)",
74895
+ family: "qwen3-vl",
74896
+ purpose: "vision",
74897
+ url: QWEN3VL8B_URL,
74898
+ sha256: "108e7ff92b78eefd3db4741885104acba514255c11b617d3c7b197a5f46efe89",
74899
+ sizeBytes: QWEN3VL8B_MODEL_BYTES,
74900
+ quantization: "Q4_K_M",
74901
+ minRamBytes: 8 * GIB,
74902
+ contextSizeDefault: 8192,
74903
+ mmprojUrl: QWEN3VL8B_MMPROJ_URL
74904
+ },
74905
+ entry: {
74906
+ id: "llm-qwen3-vl-8b-instruct-q4",
74907
+ name: "Qwen3-VL 8B Instruct (vision)",
74908
+ description: "qwen3-vl · Q4_K_M · +mmproj",
74909
+ formats: { gguf: {
74910
+ url: QWEN3VL8B_URL,
74911
+ sizeMB: mb(QWEN3VL8B_MODEL_BYTES)
74912
+ } },
74913
+ inputSize: {
74914
+ width: 0,
74915
+ height: 0
74916
+ },
74917
+ labels: [],
74918
+ extraFiles: [{
74919
+ url: QWEN3VL8B_MMPROJ_URL,
74920
+ filename: "mmproj-F16.gguf",
74921
+ sizeMB: mb(QWEN3VL8B_MMPROJ_BYTES)
74922
+ }]
74923
+ }
74924
+ };
74821
74925
  var QWEN36_MODEL_BYTES = 22134528992;
74822
74926
  var QWEN36_MMPROJ_BYTES = 899283680;
74823
74927
  var QWEN36_BASE = "https://huggingface.co/unsloth/Qwen3.6-35B-A3B-GGUF/resolve/main";
@@ -74826,8 +74930,9 @@ var QWEN36_URL = `${QWEN36_BASE}/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf`;
74826
74930
  var LLM_MODEL_CATALOG = [
74827
74931
  QWEN,
74828
74932
  LLAMA,
74829
- SMOLVLM,
74830
74933
  QWEN3VL_2B,
74934
+ QWEN3VL_4B,
74935
+ QWEN3VL_8B,
74831
74936
  {
74832
74937
  meta: {
74833
74938
  id: "llm-qwen3.6-35b-a3b-ud-q4",
package/dist/addon.mjs CHANGED
@@ -7948,7 +7948,8 @@ var OpsLogReasonSchema = _enum([
7948
7948
  "quota",
7949
7949
  "manual",
7950
7950
  "operator",
7951
- "maintenance"
7951
+ "maintenance",
7952
+ "orphaned-device"
7952
7953
  ]);
7953
7954
  /** One audit row, shared verbatim by both domains. */
7954
7955
  var OpsLogEntrySchema = object({
@@ -12979,10 +12980,39 @@ var DevicePersistConfigPayloadSchema = object({
12979
12980
  deviceId: number$1(),
12980
12981
  data: record(string(), unknown())
12981
12982
  });
12983
+ /** What a migration actually did, per switch. `unreachable` is a first-class
12984
+ * answer: a camera that could not be asked is not a camera that was silenced. */
12985
+ var MigrateSwitchOutcomeSchema = _enum([
12986
+ "off",
12987
+ "on",
12988
+ "not-offered",
12989
+ "unreachable"
12990
+ ]);
12991
+ var MigrateSwitchReportSchema = object({
12992
+ deviceId: number$1(),
12993
+ switchId: CameraSwitchIdSchema,
12994
+ outcome: MigrateSwitchOutcomeSchema,
12995
+ detail: string().optional()
12996
+ });
12997
+ var MigrateDeviceResultSchema = object({
12998
+ sourceId: number$1(),
12999
+ targetId: number$1(),
13000
+ switches: array(MigrateSwitchReportSchema).readonly(),
13001
+ /** Switches that could NOT be turned off on the source. Empty is the only
13002
+ * value meaning the replaced hardware is quiet. */
13003
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
13004
+ swapped: boolean()
13005
+ });
12982
13006
  method(object({
12983
13007
  addonId: string(),
12984
13008
  stableId: string()
12985
- }), object({ id: number$1() }), { kind: "mutation" }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number$1() }), record(string(), unknown())), method(object({ deviceId: number$1() }), record(string(), unknown())), method(object({ deviceId: number$1() }), DeviceMetaSchema.nullable()), method(object({
13009
+ }), object({ id: number$1() }), { kind: "mutation" }), method(object({
13010
+ sourceId: number$1(),
13011
+ targetId: number$1()
13012
+ }), MigrateDeviceResultSchema, {
13013
+ kind: "mutation",
13014
+ auth: "admin"
13015
+ }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number$1() }), record(string(), unknown())), method(object({ deviceId: number$1() }), record(string(), unknown())), method(object({ deviceId: number$1() }), DeviceMetaSchema.nullable()), method(object({
12986
13016
  deviceId: number$1(),
12987
13017
  name: string()
12988
13018
  }), _void(), {
@@ -30579,6 +30609,12 @@ Object.freeze({
30579
30609
  addonId: null,
30580
30610
  access: "view"
30581
30611
  },
30612
+ "deviceManager.migrateDevice": {
30613
+ capName: "device-manager",
30614
+ capScope: "system",
30615
+ addonId: null,
30616
+ access: "create"
30617
+ },
30582
30618
  "deviceManager.persistConfig": {
30583
30619
  capName: "device-manager",
30584
30620
  capScope: "system",
@@ -74762,43 +74798,6 @@ var LLAMA = textEntry({
74762
74798
  minRamBytes: Math.round(3.5 * GIB),
74763
74799
  contextSizeDefault: 4096
74764
74800
  });
74765
- var SMOLVLM_MODEL_BYTES = 1112602656;
74766
- var SMOLVLM_MMPROJ_BYTES = 872303680;
74767
- var SMOLVLM_MMPROJ_URL = "https://huggingface.co/ggml-org/SmolVLM2-2.2B-Instruct-GGUF/resolve/main/mmproj-SmolVLM2-2.2B-Instruct-f16.gguf";
74768
- var SMOLVLM = {
74769
- meta: {
74770
- id: "llm-smolvlm2-2.2b-instruct-q4",
74771
- label: "SmolVLM2 2.2B Instruct (vision)",
74772
- family: "smolvlm2",
74773
- purpose: "vision",
74774
- url: "https://huggingface.co/ggml-org/SmolVLM2-2.2B-Instruct-GGUF/resolve/main/SmolVLM2-2.2B-Instruct-Q4_K_M.gguf",
74775
- sha256: "0cf76814555b8665149075b74ab6b5c1d428ea1d3d01c1918c12012e8d7c9f58",
74776
- sizeBytes: SMOLVLM_MODEL_BYTES,
74777
- quantization: "Q4_K_M",
74778
- minRamBytes: 4 * GIB,
74779
- contextSizeDefault: 4096,
74780
- mmprojUrl: SMOLVLM_MMPROJ_URL
74781
- },
74782
- entry: {
74783
- id: "llm-smolvlm2-2.2b-instruct-q4",
74784
- name: "SmolVLM2 2.2B Instruct (vision)",
74785
- description: "smolvlm2 · Q4_K_M · +mmproj",
74786
- formats: { gguf: {
74787
- url: "https://huggingface.co/ggml-org/SmolVLM2-2.2B-Instruct-GGUF/resolve/main/SmolVLM2-2.2B-Instruct-Q4_K_M.gguf",
74788
- sizeMB: mb(SMOLVLM_MODEL_BYTES)
74789
- } },
74790
- inputSize: {
74791
- width: 0,
74792
- height: 0
74793
- },
74794
- labels: [],
74795
- extraFiles: [{
74796
- url: SMOLVLM_MMPROJ_URL,
74797
- filename: "mmproj-SmolVLM2-2.2B-Instruct-f16.gguf",
74798
- sizeMB: mb(SMOLVLM_MMPROJ_BYTES)
74799
- }]
74800
- }
74801
- };
74802
74801
  var QWEN3VL2B_MODEL_BYTES = 1107410624;
74803
74802
  var QWEN3VL2B_MMPROJ_BYTES = 819395232;
74804
74803
  var QWEN3VL2B_BASE = "https://huggingface.co/unsloth/Qwen3-VL-2B-Instruct-GGUF/resolve/main";
@@ -74845,6 +74844,111 @@ var QWEN3VL_2B = {
74845
74844
  }]
74846
74845
  }
74847
74846
  };
74847
+ var QWEN3VL4B_MODEL_BYTES = 2497282336;
74848
+ var QWEN3VL4B_MMPROJ_BYTES = 836180640;
74849
+ var QWEN3VL4B_BASE = "https://huggingface.co/unsloth/Qwen3-VL-4B-Instruct-GGUF/resolve/main";
74850
+ var QWEN3VL4B_MMPROJ_URL = `${QWEN3VL4B_BASE}/mmproj-F16.gguf`;
74851
+ var QWEN3VL4B_URL = `${QWEN3VL4B_BASE}/Qwen3-VL-4B-Instruct-Q4_K_M.gguf`;
74852
+ /**
74853
+ * The middle rung. It exists because the catalogue used to jump from 2B to a
74854
+ * 35B MoE, and the operator was running an 8B through an EXTERNAL LM Studio
74855
+ * endpoint precisely because nothing in between was offered here — the gap was
74856
+ * pushing the work outside the addon that is supposed to own it.
74857
+ *
74858
+ * At ~3.3 GB all in, this is also the only tier above 2B that a small
74859
+ * mini-PC-class node can hold, so the ladder is now 2B → 4B → 8B rather than
74860
+ * 2B → nothing.
74861
+ *
74862
+ * Same `qwen3vl_merger` projector as the 2B and the 8B: one prompt set and one
74863
+ * download shape cover all three. That is the reason this family was chosen
74864
+ * over its neighbours, not a benchmark — Gemma 4 and GLM-4.6V each want a
74865
+ * projector this addon has never exercised, for no verified gain at this size.
74866
+ */
74867
+ var QWEN3VL_4B = {
74868
+ meta: {
74869
+ id: "llm-qwen3-vl-4b-instruct-q4",
74870
+ label: "Qwen3-VL 4B Instruct (vision)",
74871
+ family: "qwen3-vl",
74872
+ purpose: "vision",
74873
+ url: QWEN3VL4B_URL,
74874
+ sha256: "d4dcd426bfba75752a312b266b80fec8136fbaca13c62d93b7ac41fa67f0492b",
74875
+ sizeBytes: QWEN3VL4B_MODEL_BYTES,
74876
+ quantization: "Q4_K_M",
74877
+ minRamBytes: 5 * GIB,
74878
+ contextSizeDefault: 8192,
74879
+ mmprojUrl: QWEN3VL4B_MMPROJ_URL
74880
+ },
74881
+ entry: {
74882
+ id: "llm-qwen3-vl-4b-instruct-q4",
74883
+ name: "Qwen3-VL 4B Instruct (vision)",
74884
+ description: "qwen3-vl · Q4_K_M · +mmproj",
74885
+ formats: { gguf: {
74886
+ url: QWEN3VL4B_URL,
74887
+ sizeMB: mb(QWEN3VL4B_MODEL_BYTES)
74888
+ } },
74889
+ inputSize: {
74890
+ width: 0,
74891
+ height: 0
74892
+ },
74893
+ labels: [],
74894
+ extraFiles: [{
74895
+ url: QWEN3VL4B_MMPROJ_URL,
74896
+ filename: "mmproj-F16.gguf",
74897
+ sizeMB: mb(QWEN3VL4B_MMPROJ_BYTES)
74898
+ }]
74899
+ }
74900
+ };
74901
+ var QWEN3VL8B_MODEL_BYTES = 5027785568;
74902
+ var QWEN3VL8B_MMPROJ_BYTES = 1159030336;
74903
+ var QWEN3VL8B_BASE = "https://huggingface.co/unsloth/Qwen3-VL-8B-Instruct-GGUF/resolve/main";
74904
+ var QWEN3VL8B_MMPROJ_URL = `${QWEN3VL8B_BASE}/mmproj-F16.gguf`;
74905
+ var QWEN3VL8B_URL = `${QWEN3VL8B_BASE}/Qwen3-VL-8B-Instruct-Q4_K_M.gguf`;
74906
+ /**
74907
+ * The tier the operator already trusts, brought in-house.
74908
+ *
74909
+ * This is the same weight class as the `qwen/qwen3-vl-8b` served by an external
74910
+ * LM Studio endpoint on the Mac: as a `managed-local` profile the addon owns
74911
+ * the runtime and `nodePin` puts the INFERENCE on that node, instead of the hub
74912
+ * calling out over HTTP to a process nobody here supervises.
74913
+ *
74914
+ * ~6.2 GB resident is a real bite on a 16 GB machine shared with the rest of
74915
+ * CamStack — that is what `minRamBytes` is for, and it is why the 4B above
74916
+ * exists rather than this being the only new rung.
74917
+ */
74918
+ var QWEN3VL_8B = {
74919
+ meta: {
74920
+ id: "llm-qwen3-vl-8b-instruct-q4",
74921
+ label: "Qwen3-VL 8B Instruct (vision)",
74922
+ family: "qwen3-vl",
74923
+ purpose: "vision",
74924
+ url: QWEN3VL8B_URL,
74925
+ sha256: "108e7ff92b78eefd3db4741885104acba514255c11b617d3c7b197a5f46efe89",
74926
+ sizeBytes: QWEN3VL8B_MODEL_BYTES,
74927
+ quantization: "Q4_K_M",
74928
+ minRamBytes: 8 * GIB,
74929
+ contextSizeDefault: 8192,
74930
+ mmprojUrl: QWEN3VL8B_MMPROJ_URL
74931
+ },
74932
+ entry: {
74933
+ id: "llm-qwen3-vl-8b-instruct-q4",
74934
+ name: "Qwen3-VL 8B Instruct (vision)",
74935
+ description: "qwen3-vl · Q4_K_M · +mmproj",
74936
+ formats: { gguf: {
74937
+ url: QWEN3VL8B_URL,
74938
+ sizeMB: mb(QWEN3VL8B_MODEL_BYTES)
74939
+ } },
74940
+ inputSize: {
74941
+ width: 0,
74942
+ height: 0
74943
+ },
74944
+ labels: [],
74945
+ extraFiles: [{
74946
+ url: QWEN3VL8B_MMPROJ_URL,
74947
+ filename: "mmproj-F16.gguf",
74948
+ sizeMB: mb(QWEN3VL8B_MMPROJ_BYTES)
74949
+ }]
74950
+ }
74951
+ };
74848
74952
  var QWEN36_MODEL_BYTES = 22134528992;
74849
74953
  var QWEN36_MMPROJ_BYTES = 899283680;
74850
74954
  var QWEN36_BASE = "https://huggingface.co/unsloth/Qwen3.6-35B-A3B-GGUF/resolve/main";
@@ -74853,8 +74957,9 @@ var QWEN36_URL = `${QWEN36_BASE}/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf`;
74853
74957
  var LLM_MODEL_CATALOG = [
74854
74958
  QWEN,
74855
74959
  LLAMA,
74856
- SMOLVLM,
74857
74960
  QWEN3VL_2B,
74961
+ QWEN3VL_4B,
74962
+ QWEN3VL_8B,
74858
74963
  {
74859
74964
  meta: {
74860
74965
  id: "llm-qwen3.6-35b-a3b-ud-q4",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.52",
3
+ "version": "0.4.53",
4
4
  "description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
5
5
  "keywords": [
6
6
  "camstack",