@marimo-team/islands 0.15.1-dev20 → 0.15.1-dev23

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 (70) hide show
  1. package/dist/{ConnectedDataExplorerComponent-T4kWx74k.js → ConnectedDataExplorerComponent-D0XqshlU.js} +2 -2
  2. package/dist/{ImageComparisonComponent-DGrNyuT6.js → ImageComparisonComponent-CZsQglqB.js} +1 -1
  3. package/dist/{_baseUniq-DDI83xpx.js → _baseUniq-Ckiyck6A.js} +1 -1
  4. package/dist/{any-language-editor-OdwxdANJ.js → any-language-editor-BQyFbRCa.js} +1 -1
  5. package/dist/{architectureDiagram-KFL7JDKH-Bz4LLaRM.js → architectureDiagram-KFL7JDKH-Bf0uTVKX.js} +4 -4
  6. package/dist/{blockDiagram-ZYB65J3Q-Bn75dKCF.js → blockDiagram-ZYB65J3Q-COqr4VwW.js} +5 -5
  7. package/dist/{c4Diagram-AAMF2YG6-OUTC8UCE.js → c4Diagram-AAMF2YG6-BuIrt4mL.js} +2 -2
  8. package/dist/{channel-D2Pk_7pD.js → channel-DtQ-9KOG.js} +1 -1
  9. package/dist/{chunk-ANTBXLJU-BOcGK9IQ.js → chunk-ANTBXLJU-qUpcxtn9.js} +1 -1
  10. package/dist/{chunk-FHKO5MBM-Itt815NO.js → chunk-FHKO5MBM-KUh3TLMU.js} +1 -1
  11. package/dist/{chunk-GLLZNHP4-BlugZIAr.js → chunk-GLLZNHP4-BG2l4nQz.js} +1 -1
  12. package/dist/{chunk-JBRWN2VN-CMPZS_JC.js → chunk-JBRWN2VN-DcOjZ6W6.js} +4 -4
  13. package/dist/{chunk-LXBSTHXV-B9m0o3Dw.js → chunk-LXBSTHXV-1wtuuDPb.js} +3 -3
  14. package/dist/{chunk-NRVI72HA-CUWnO70H.js → chunk-NRVI72HA-BVVW7BOP.js} +1 -1
  15. package/dist/{chunk-OMD6QJNC-C0G1Ybvw.js → chunk-OMD6QJNC-BOOCPvHU.js} +1 -1
  16. package/dist/{chunk-WVR4S24B-CfqNG6BS.js → chunk-WVR4S24B-CWMArkgK.js} +1 -1
  17. package/dist/{classDiagram-v2-QTMF73CY-Du3X9bsO.js → classDiagram-3BZAVTQC-BjnqEj2F.js} +2 -2
  18. package/dist/{classDiagram-3BZAVTQC-Du3X9bsO.js → classDiagram-v2-QTMF73CY-BjnqEj2F.js} +2 -2
  19. package/dist/{clone-CHk_BpQ7.js → clone-DD_V4yHs.js} +1 -1
  20. package/dist/{dagre-2BBEFEWP-C21lJehF.js → dagre-2BBEFEWP-DyqlYi2j.js} +6 -6
  21. package/dist/{data-grid-overlay-editor-DQAvWUme.js → data-grid-overlay-editor-CcVaBCuH.js} +2 -2
  22. package/dist/{diagram-4IRLE6MV-DiqIOlJy.js → diagram-4IRLE6MV-CreyFvcp.js} +5 -5
  23. package/dist/{diagram-GUPCWM2R-QNnoayaR.js → diagram-GUPCWM2R-AveBH1M-.js} +3 -3
  24. package/dist/{diagram-RP2FKANI-D0mh9jtM.js → diagram-RP2FKANI-CHEhrmw1.js} +3 -3
  25. package/dist/{erDiagram-HZWUO2LU-CHNzznx-.js → erDiagram-HZWUO2LU-Bo1td0a2.js} +4 -4
  26. package/dist/{flowDiagram-THRYKUMA-_FZ6mTfz.js → flowDiagram-THRYKUMA-DV0yuxL7.js} +5 -5
  27. package/dist/{ganttDiagram-WV7ZQ7D5-CaYCAAh_.js → ganttDiagram-WV7ZQ7D5-DFlgXP8C.js} +4 -4
  28. package/dist/{gitGraphDiagram-OJR772UL-D_G318ZT.js → gitGraphDiagram-OJR772UL-DfdoeHs8.js} +4 -4
  29. package/dist/{glide-data-editor-DwzWASdN.js → glide-data-editor-AoDOWQjZ.js} +3 -3
  30. package/dist/{graph-Dkiu8g_M.js → graph-CreegasO.js} +3 -3
  31. package/dist/{index-Dc1_AAWe.js → index-BA-ePze6.js} +3 -3
  32. package/dist/{index-r5Jrqg8i.js → index-BrVUS1nc.js} +1 -1
  33. package/dist/{index-OIcVgWd2.js → index-C-0pD2W0.js} +1 -1
  34. package/dist/{index-CxgXuB1J.js → index-CkZ7D2Ry.js} +1 -1
  35. package/dist/{index-w90izJvc.js → index-DvKEL24D.js} +1 -1
  36. package/dist/{infoDiagram-6WOFNB3A-DtTO4vv-.js → infoDiagram-6WOFNB3A-Bzxw7XWX.js} +2 -2
  37. package/dist/{journeyDiagram-FFXJYRFH-Bc6OYvB0.js → journeyDiagram-FFXJYRFH-BzAcL7-t.js} +3 -3
  38. package/dist/{kanban-definition-KOZQBZVT-BJxHSdqr.js → kanban-definition-KOZQBZVT-DNwe7TQc.js} +2 -2
  39. package/dist/{layout-b98w0jb2.js → layout-Bhbgjfgd.js} +4 -4
  40. package/dist/{linear-DzMFB4Mu.js → linear-CMGuqFex.js} +1 -1
  41. package/dist/{main-3-uFVaKp.js → main-DqZNwn-r.js} +22 -21
  42. package/dist/main.js +1 -1
  43. package/dist/{mermaid-DnVrAn0b.js → mermaid-DYU5EKQx.js} +29 -29
  44. package/dist/{min-C8XS9LSa.js → min-cWlAN3aL.js} +2 -2
  45. package/dist/{mindmap-definition-LNHGMQRG-DNwr3bGQ.js → mindmap-definition-LNHGMQRG-SqmjJMOX.js} +2 -2
  46. package/dist/{number-overlay-editor-B97boK1K.js → number-overlay-editor-B_N8oIlq.js} +2 -2
  47. package/dist/{pieDiagram-DBDJKBY4-BL1ymVxH.js → pieDiagram-DBDJKBY4-CMBU4--E.js} +3 -3
  48. package/dist/{quadrantDiagram-YPSRARAO-DhHySUbQ.js → quadrantDiagram-YPSRARAO-C-eVThNr.js} +2 -2
  49. package/dist/{react-plotly-CTH_zZDu.js → react-plotly-BxPqO_XY.js} +1 -1
  50. package/dist/{requirementDiagram-EGVEC5DT-O8owc5D5.js → requirementDiagram-EGVEC5DT-B-JMjvqi.js} +3 -3
  51. package/dist/{sankeyDiagram-HRAUVNP4-Db6_uxKW.js → sankeyDiagram-HRAUVNP4-Dp9GioK7.js} +1 -1
  52. package/dist/{sequenceDiagram-WFGC7UMF-Bnf8-z29.js → sequenceDiagram-WFGC7UMF-DSah_xWf.js} +3 -3
  53. package/dist/{slides-component-DCeqnno4.js → slides-component-CqHjN5_K.js} +1 -1
  54. package/dist/{stateDiagram-UUKSUZ4H-Dd4BaplA.js → stateDiagram-UUKSUZ4H-3XFJ-Sg5.js} +4 -4
  55. package/dist/{stateDiagram-v2-EYPG3UTE-B2UNCxuY.js → stateDiagram-v2-EYPG3UTE-viJ4Y_Zw.js} +2 -2
  56. package/dist/{time-CACu73BN.js → time-DqeWEGuD.js} +2 -2
  57. package/dist/{timeline-definition-3HZDQTIS-CeJCv_tk.js → timeline-definition-3HZDQTIS-CMJ28VYj.js} +1 -1
  58. package/dist/{treemap-75Q7IDZK-D1YD8J0D.js → treemap-75Q7IDZK-B_H3ereo.js} +5 -5
  59. package/dist/{vega-component-B0qW_XiJ.js → vega-component-C5l0rC2E.js} +2 -2
  60. package/dist/{xychartDiagram-FDP5SA34-BCWhiZdq.js → xychartDiagram-FDP5SA34-CLpc6DE1.js} +2 -2
  61. package/package.json +19 -19
  62. package/src/components/ai/ai-model-dropdown.tsx +5 -34
  63. package/src/components/ai/display-helpers.tsx +32 -0
  64. package/src/components/app-config/ai-config.tsx +265 -9
  65. package/src/components/app-config/app-config-button.tsx +1 -1
  66. package/src/components/app-config/app-config-form.tsx +17 -6
  67. package/src/components/app-config/user-config-form.tsx +5 -1
  68. package/src/core/ai/__tests__/model-registry.test.ts +25 -1
  69. package/src/core/ai/model-registry.ts +36 -4
  70. package/src/hooks/useDebounce.ts +2 -1
@@ -78,21 +78,45 @@ describe("AiModelRegistry", () => {
78
78
  const displayedModels = ["openai/gpt-4", "anthropic/claude-3-sonnet"];
79
79
  const registry = AiModelRegistry.create({ displayedModels });
80
80
 
81
+ const ids = [...registry.getModelsMap().keys()];
82
+ expect(ids).toEqual(["openai/gpt-4", "anthropic/claude-3-sonnet"]);
81
83
  expect(registry.getCustomModels()).toEqual(new Set());
82
84
  expect(registry.getDisplayedModels()).toEqual(new Set(displayedModels));
83
85
  });
84
86
 
85
87
  it("should create registry with both custom and displayed models", () => {
86
88
  const customModels = ["openai/custom-gpt"];
87
- const displayedModels = ["openai/gpt-4", "anthropic/claude-3-sonnet"];
89
+ const displayedModels = ["openai/custom-gpt"];
88
90
  const registry = AiModelRegistry.create({
89
91
  customModels,
90
92
  displayedModels,
91
93
  });
92
94
 
95
+ const ids = [...registry.getModelsMap().keys()];
96
+ expect(ids).toEqual(["openai/custom-gpt"]);
93
97
  expect(registry.getCustomModels()).toEqual(new Set(customModels));
94
98
  expect(registry.getDisplayedModels()).toEqual(new Set(displayedModels));
95
99
  });
100
+
101
+ it("should create registry with non-existent displayed_model", () => {
102
+ const customModels = ["openai/custom-gpt"];
103
+ const displayedModels = ["something-wrong/model-id"];
104
+ const registry = AiModelRegistry.create({
105
+ customModels,
106
+ displayedModels,
107
+ });
108
+
109
+ const ids = [...registry.getModelsMap().keys()];
110
+ // Include custom and all default ones.
111
+ expect(ids).toEqual([
112
+ "openai/custom-gpt",
113
+ "openai/gpt-4",
114
+ "anthropic/claude-3-sonnet",
115
+ "google/gemini-pro",
116
+ "openai/multi-model",
117
+ "anthropic/multi-model",
118
+ ]);
119
+ });
96
120
  });
97
121
 
98
122
  describe("getModelsByProvider", () => {
@@ -7,6 +7,7 @@ import type {
7
7
  } from "@marimo-team/llm-info";
8
8
  import { models } from "@marimo-team/llm-info/models.json";
9
9
  import { providers } from "@marimo-team/llm-info/providers.json";
10
+ import { Logger } from "@/utils/Logger";
10
11
  import { MultiMap } from "@/utils/multi-map";
11
12
  import { once } from "@/utils/once";
12
13
  import type { ProviderId } from "./ids/ids";
@@ -14,6 +15,7 @@ import { AiModelId, type QualifiedModelId, type ShortModelId } from "./ids/ids";
14
15
 
15
16
  export interface AiModel extends AiModelType {
16
17
  roles: Role[];
18
+ model: ShortModelId;
17
19
  providers: ProviderId[];
18
20
  /** Whether this is a custom model. */
19
21
  custom: boolean;
@@ -25,6 +27,7 @@ const getKnownModelMap = once((): ReadonlyMap<QualifiedModelId, AiModel> => {
25
27
  const modelId = model.model as ShortModelId;
26
28
  const modelInfo: AiModel = {
27
29
  ...model,
30
+ model: model.model as ShortModelId,
28
31
  roles: model.roles.map((role) => role as Role),
29
32
  providers: model.providers as ProviderId[],
30
33
  custom: false,
@@ -84,14 +87,42 @@ export class AiModelRegistry {
84
87
  * Builds the maps of models by provider and custom models.
85
88
  */
86
89
  private buildMaps() {
87
- const displayedModels = this.displayedModels;
90
+ let result = AiModelRegistry.buildMapsFromConfig({
91
+ displayedModels: this.displayedModels,
92
+ customModels: this.customModels,
93
+ });
94
+
95
+ // If we got zero results, then build the maps with no displayedModels
96
+ // This can happen if displayedModels is configured to non existent models
97
+ if (result.modelsMap.size === 0) {
98
+ Logger.error(
99
+ "The configured displayed_models have filtered out all registered models. Reverting back to showing all models.",
100
+ [...this.displayedModels],
101
+ );
102
+
103
+ result = AiModelRegistry.buildMapsFromConfig({
104
+ displayedModels: new Set(),
105
+ customModels: this.customModels,
106
+ });
107
+ }
108
+
109
+ this.modelsByProviderMap = result.modelsByProviderMap;
110
+ this.modelsMap = result.modelsMap;
111
+ }
112
+
113
+ private static buildMapsFromConfig(opts: {
114
+ customModels: ReadonlySet<QualifiedModelId>;
115
+ displayedModels: ReadonlySet<QualifiedModelId>;
116
+ }) {
117
+ const { displayedModels, customModels } = opts;
88
118
  const hasDisplayedModels = displayedModels.size > 0;
89
119
  const knownModelMap = getKnownModelMap();
90
120
  const customModelsMap = new Map<QualifiedModelId, AiModel>();
91
121
 
92
122
  let modelsMap = new Map<QualifiedModelId, AiModel>();
123
+ const modelsByProviderMap = new MultiMap<ProviderId, AiModel>();
93
124
 
94
- for (const model of this.customModels) {
125
+ for (const model of customModels) {
95
126
  if (hasDisplayedModels && !displayedModels.has(model)) {
96
127
  continue;
97
128
  }
@@ -121,15 +152,16 @@ export class AiModelRegistry {
121
152
  }
122
153
 
123
154
  // Set custom models first, then known models
155
+ // Known models will overwrite custom models (which is desired)
124
156
  modelsMap = new Map([...customModelsMap, ...modelsMap]);
125
157
 
126
158
  // Group by provider
127
159
  for (const [qualifiedModelId, model] of modelsMap.entries()) {
128
160
  const modelId = AiModelId.parse(qualifiedModelId);
129
- this.modelsByProviderMap.add(modelId.providerId, model);
161
+ modelsByProviderMap.add(modelId.providerId, model);
130
162
  }
131
163
 
132
- this.modelsMap = modelsMap;
164
+ return { modelsByProviderMap, modelsMap };
133
165
  }
134
166
 
135
167
  getDisplayedModels() {
@@ -84,7 +84,8 @@ export function useDebounceControlledState<T>(opts: {
84
84
  };
85
85
  }
86
86
 
87
- export function useDebouncedCallback<T extends (...args: unknown[]) => unknown>(
87
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
+ export function useDebouncedCallback<T extends (...args: any[]) => unknown>(
88
89
  callback: T,
89
90
  delay: number,
90
91
  ) {