@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.
- package/dist/{ConnectedDataExplorerComponent-T4kWx74k.js → ConnectedDataExplorerComponent-D0XqshlU.js} +2 -2
- package/dist/{ImageComparisonComponent-DGrNyuT6.js → ImageComparisonComponent-CZsQglqB.js} +1 -1
- package/dist/{_baseUniq-DDI83xpx.js → _baseUniq-Ckiyck6A.js} +1 -1
- package/dist/{any-language-editor-OdwxdANJ.js → any-language-editor-BQyFbRCa.js} +1 -1
- package/dist/{architectureDiagram-KFL7JDKH-Bz4LLaRM.js → architectureDiagram-KFL7JDKH-Bf0uTVKX.js} +4 -4
- package/dist/{blockDiagram-ZYB65J3Q-Bn75dKCF.js → blockDiagram-ZYB65J3Q-COqr4VwW.js} +5 -5
- package/dist/{c4Diagram-AAMF2YG6-OUTC8UCE.js → c4Diagram-AAMF2YG6-BuIrt4mL.js} +2 -2
- package/dist/{channel-D2Pk_7pD.js → channel-DtQ-9KOG.js} +1 -1
- package/dist/{chunk-ANTBXLJU-BOcGK9IQ.js → chunk-ANTBXLJU-qUpcxtn9.js} +1 -1
- package/dist/{chunk-FHKO5MBM-Itt815NO.js → chunk-FHKO5MBM-KUh3TLMU.js} +1 -1
- package/dist/{chunk-GLLZNHP4-BlugZIAr.js → chunk-GLLZNHP4-BG2l4nQz.js} +1 -1
- package/dist/{chunk-JBRWN2VN-CMPZS_JC.js → chunk-JBRWN2VN-DcOjZ6W6.js} +4 -4
- package/dist/{chunk-LXBSTHXV-B9m0o3Dw.js → chunk-LXBSTHXV-1wtuuDPb.js} +3 -3
- package/dist/{chunk-NRVI72HA-CUWnO70H.js → chunk-NRVI72HA-BVVW7BOP.js} +1 -1
- package/dist/{chunk-OMD6QJNC-C0G1Ybvw.js → chunk-OMD6QJNC-BOOCPvHU.js} +1 -1
- package/dist/{chunk-WVR4S24B-CfqNG6BS.js → chunk-WVR4S24B-CWMArkgK.js} +1 -1
- package/dist/{classDiagram-v2-QTMF73CY-Du3X9bsO.js → classDiagram-3BZAVTQC-BjnqEj2F.js} +2 -2
- package/dist/{classDiagram-3BZAVTQC-Du3X9bsO.js → classDiagram-v2-QTMF73CY-BjnqEj2F.js} +2 -2
- package/dist/{clone-CHk_BpQ7.js → clone-DD_V4yHs.js} +1 -1
- package/dist/{dagre-2BBEFEWP-C21lJehF.js → dagre-2BBEFEWP-DyqlYi2j.js} +6 -6
- package/dist/{data-grid-overlay-editor-DQAvWUme.js → data-grid-overlay-editor-CcVaBCuH.js} +2 -2
- package/dist/{diagram-4IRLE6MV-DiqIOlJy.js → diagram-4IRLE6MV-CreyFvcp.js} +5 -5
- package/dist/{diagram-GUPCWM2R-QNnoayaR.js → diagram-GUPCWM2R-AveBH1M-.js} +3 -3
- package/dist/{diagram-RP2FKANI-D0mh9jtM.js → diagram-RP2FKANI-CHEhrmw1.js} +3 -3
- package/dist/{erDiagram-HZWUO2LU-CHNzznx-.js → erDiagram-HZWUO2LU-Bo1td0a2.js} +4 -4
- package/dist/{flowDiagram-THRYKUMA-_FZ6mTfz.js → flowDiagram-THRYKUMA-DV0yuxL7.js} +5 -5
- package/dist/{ganttDiagram-WV7ZQ7D5-CaYCAAh_.js → ganttDiagram-WV7ZQ7D5-DFlgXP8C.js} +4 -4
- package/dist/{gitGraphDiagram-OJR772UL-D_G318ZT.js → gitGraphDiagram-OJR772UL-DfdoeHs8.js} +4 -4
- package/dist/{glide-data-editor-DwzWASdN.js → glide-data-editor-AoDOWQjZ.js} +3 -3
- package/dist/{graph-Dkiu8g_M.js → graph-CreegasO.js} +3 -3
- package/dist/{index-Dc1_AAWe.js → index-BA-ePze6.js} +3 -3
- package/dist/{index-r5Jrqg8i.js → index-BrVUS1nc.js} +1 -1
- package/dist/{index-OIcVgWd2.js → index-C-0pD2W0.js} +1 -1
- package/dist/{index-CxgXuB1J.js → index-CkZ7D2Ry.js} +1 -1
- package/dist/{index-w90izJvc.js → index-DvKEL24D.js} +1 -1
- package/dist/{infoDiagram-6WOFNB3A-DtTO4vv-.js → infoDiagram-6WOFNB3A-Bzxw7XWX.js} +2 -2
- package/dist/{journeyDiagram-FFXJYRFH-Bc6OYvB0.js → journeyDiagram-FFXJYRFH-BzAcL7-t.js} +3 -3
- package/dist/{kanban-definition-KOZQBZVT-BJxHSdqr.js → kanban-definition-KOZQBZVT-DNwe7TQc.js} +2 -2
- package/dist/{layout-b98w0jb2.js → layout-Bhbgjfgd.js} +4 -4
- package/dist/{linear-DzMFB4Mu.js → linear-CMGuqFex.js} +1 -1
- package/dist/{main-3-uFVaKp.js → main-DqZNwn-r.js} +22 -21
- package/dist/main.js +1 -1
- package/dist/{mermaid-DnVrAn0b.js → mermaid-DYU5EKQx.js} +29 -29
- package/dist/{min-C8XS9LSa.js → min-cWlAN3aL.js} +2 -2
- package/dist/{mindmap-definition-LNHGMQRG-DNwr3bGQ.js → mindmap-definition-LNHGMQRG-SqmjJMOX.js} +2 -2
- package/dist/{number-overlay-editor-B97boK1K.js → number-overlay-editor-B_N8oIlq.js} +2 -2
- package/dist/{pieDiagram-DBDJKBY4-BL1ymVxH.js → pieDiagram-DBDJKBY4-CMBU4--E.js} +3 -3
- package/dist/{quadrantDiagram-YPSRARAO-DhHySUbQ.js → quadrantDiagram-YPSRARAO-C-eVThNr.js} +2 -2
- package/dist/{react-plotly-CTH_zZDu.js → react-plotly-BxPqO_XY.js} +1 -1
- package/dist/{requirementDiagram-EGVEC5DT-O8owc5D5.js → requirementDiagram-EGVEC5DT-B-JMjvqi.js} +3 -3
- package/dist/{sankeyDiagram-HRAUVNP4-Db6_uxKW.js → sankeyDiagram-HRAUVNP4-Dp9GioK7.js} +1 -1
- package/dist/{sequenceDiagram-WFGC7UMF-Bnf8-z29.js → sequenceDiagram-WFGC7UMF-DSah_xWf.js} +3 -3
- package/dist/{slides-component-DCeqnno4.js → slides-component-CqHjN5_K.js} +1 -1
- package/dist/{stateDiagram-UUKSUZ4H-Dd4BaplA.js → stateDiagram-UUKSUZ4H-3XFJ-Sg5.js} +4 -4
- package/dist/{stateDiagram-v2-EYPG3UTE-B2UNCxuY.js → stateDiagram-v2-EYPG3UTE-viJ4Y_Zw.js} +2 -2
- package/dist/{time-CACu73BN.js → time-DqeWEGuD.js} +2 -2
- package/dist/{timeline-definition-3HZDQTIS-CeJCv_tk.js → timeline-definition-3HZDQTIS-CMJ28VYj.js} +1 -1
- package/dist/{treemap-75Q7IDZK-D1YD8J0D.js → treemap-75Q7IDZK-B_H3ereo.js} +5 -5
- package/dist/{vega-component-B0qW_XiJ.js → vega-component-C5l0rC2E.js} +2 -2
- package/dist/{xychartDiagram-FDP5SA34-BCWhiZdq.js → xychartDiagram-FDP5SA34-CLpc6DE1.js} +2 -2
- package/package.json +19 -19
- package/src/components/ai/ai-model-dropdown.tsx +5 -34
- package/src/components/ai/display-helpers.tsx +32 -0
- package/src/components/app-config/ai-config.tsx +265 -9
- package/src/components/app-config/app-config-button.tsx +1 -1
- package/src/components/app-config/app-config-form.tsx +17 -6
- package/src/components/app-config/user-config-form.tsx +5 -1
- package/src/core/ai/__tests__/model-registry.test.ts +25 -1
- package/src/core/ai/model-registry.ts +36 -4
- 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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
161
|
+
modelsByProviderMap.add(modelId.providerId, model);
|
|
130
162
|
}
|
|
131
163
|
|
|
132
|
-
|
|
164
|
+
return { modelsByProviderMap, modelsMap };
|
|
133
165
|
}
|
|
134
166
|
|
|
135
167
|
getDisplayedModels() {
|
package/src/hooks/useDebounce.ts
CHANGED
|
@@ -84,7 +84,8 @@ export function useDebounceControlledState<T>(opts: {
|
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
|
|
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
|
) {
|