@chai-ui/react 0.5.0 → 0.6.1
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/DESIGN.md +6 -1
- package/README.md +79 -17
- package/dist/ChaiProvider.d.ts +3 -42
- package/dist/ChaiProvider.d.ts.map +1 -1
- package/dist/ChaiProvider.js +5 -43
- package/dist/ChaiProvider.js.map +1 -1
- package/dist/Composer.d.ts +10 -60
- package/dist/Composer.d.ts.map +1 -1
- package/dist/Composer.js +26 -24
- package/dist/Composer.js.map +1 -1
- package/dist/EditCard.d.ts +2 -16
- package/dist/EditCard.d.ts.map +1 -1
- package/dist/EditCard.js +7 -2
- package/dist/EditCard.js.map +1 -1
- package/dist/MediaAnalyzer.d.ts +14 -18
- package/dist/MediaAnalyzer.d.ts.map +1 -1
- package/dist/MediaAnalyzer.js +26 -8
- package/dist/MediaAnalyzer.js.map +1 -1
- package/dist/ResultCard.d.ts.map +1 -1
- package/dist/ResultCard.js +10 -6
- package/dist/ResultCard.js.map +1 -1
- package/dist/icons.d.ts +1 -0
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +9 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/media-actions.d.ts +5 -2
- package/dist/media-actions.d.ts.map +1 -1
- package/dist/media-actions.js +12 -3
- package/dist/media-actions.js.map +1 -1
- package/dist/style.css +15 -0
- package/dist/useComposer.d.ts +11 -86
- package/dist/useComposer.d.ts.map +1 -1
- package/dist/useComposer.js +26 -291
- package/dist/useComposer.js.map +1 -1
- package/dist/useMediaAnalyzer.d.ts +8 -28
- package/dist/useMediaAnalyzer.d.ts.map +1 -1
- package/dist/useMediaAnalyzer.js +9 -106
- package/dist/useMediaAnalyzer.js.map +1 -1
- package/package.json +3 -3
- package/src/ChaiProvider.tsx +12 -70
- package/src/Composer.tsx +42 -90
- package/src/EditCard.tsx +18 -20
- package/src/MediaAnalyzer.tsx +51 -30
- package/src/ResultCard.tsx +12 -4
- package/src/icons.tsx +14 -0
- package/src/index.ts +10 -0
- package/src/media-actions.ts +13 -4
- package/src/style.css +15 -0
- package/src/useComposer.ts +33 -411
- package/src/useMediaAnalyzer.ts +15 -146
package/dist/useComposer.js
CHANGED
|
@@ -1,298 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { useState, useSyncExternalStore } from "react";
|
|
2
|
+
import { createComposerStore, pickReasoning } from "@chai-ui/core";
|
|
3
|
+
import { useReasoning } from "./ChaiProvider.js";
|
|
4
4
|
import { useLatest } from "./use-latest.js";
|
|
5
|
-
|
|
6
|
-
export const DEFAULT_MODEL_ID = "default";
|
|
7
|
-
const mockTextEngine = createMockEngine({ outputKind: "text" });
|
|
8
|
-
function defaultEnhancePrompt(value, mode) {
|
|
9
|
-
const subject = mode?.includes("video")
|
|
10
|
-
? "a video-generation"
|
|
11
|
-
: mode === "text-to-text" || mode === "vision"
|
|
12
|
-
? "an AI assistant"
|
|
13
|
-
: "an image-generation";
|
|
14
|
-
return `Rewrite the following ${subject} prompt to be more detailed and specific, keeping the same intent. Reply with only the rewritten prompt, nothing else.\n\n${value}`;
|
|
15
|
-
}
|
|
5
|
+
export { DEFAULT_MODEL_ID } from "@chai-ui/core";
|
|
16
6
|
/**
|
|
17
|
-
* The
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* calls and folding each one back into state as it settles — pure
|
|
21
|
-
* transitions live in `@chai-ui/core`, this is the thin React binding.
|
|
7
|
+
* The React binding for `createComposerStore` in `@chai-ui/core`: turns a
|
|
8
|
+
* `Composer`'s `onSubmit` payload into a real `Request` → `Run` → `Result`
|
|
9
|
+
* (§6). The behavior lives in core; this keeps its state in React.
|
|
22
10
|
*/
|
|
23
11
|
export function useComposer(options = {}) {
|
|
24
|
-
// One run per use case submitted: a single run unless the Composer has
|
|
25
|
-
// `multiSelectUseCases` on. `run` stays as the first, for the common case.
|
|
26
|
-
const [runs, setRuns] = useState([]);
|
|
27
|
-
const [enhancing, setEnhancing] = useState(false);
|
|
28
|
-
const [routing, setRouting] = useState(false);
|
|
29
|
-
// Edit mode. Each edit's runs are kept (not replaced by the next submit),
|
|
30
|
-
// since every result is a version of the image the person can page back to.
|
|
31
|
-
const editImage = options.editImage?.kind === "image" ? options.editImage : null;
|
|
32
|
-
const [editRuns, setEditRuns] = useState([]);
|
|
33
|
-
const [regions, setRegions] = useState([]);
|
|
34
|
-
const [activeVersion, setActiveVersion] = useState(0);
|
|
35
|
-
// Another image starts over. Reset while rendering, not in an effect (the rules of React).
|
|
36
|
-
const [editSource, setEditSource] = useState(editImage?.src ?? null);
|
|
37
|
-
// Numbers each image, so its original version has its own id and EditCard
|
|
38
|
-
// starts it clean (no half-drawn region from the last image).
|
|
39
|
-
const [editImageCount, setEditImageCount] = useState(0);
|
|
40
|
-
if ((editImage?.src ?? null) !== editSource) {
|
|
41
|
-
setEditSource(editImage?.src ?? null);
|
|
42
|
-
setEditImageCount((n) => n + 1);
|
|
43
|
-
setEditRuns([]);
|
|
44
|
-
setRegions([]);
|
|
45
|
-
setActiveVersion(0);
|
|
46
|
-
}
|
|
47
|
-
const versions = useMemo(() => editImage
|
|
48
|
-
? [
|
|
49
|
-
{ id: `original-${editImageCount}`, src: editImage.src, status: "done", regions: [] },
|
|
50
|
-
...editRuns.flatMap((run) => run.results.map((r) => ({
|
|
51
|
-
id: r.id,
|
|
52
|
-
src: r.output?.src,
|
|
53
|
-
from: run.request.attachments[0]?.src,
|
|
54
|
-
status: r.status,
|
|
55
|
-
regions: run.request.params.regions ?? [],
|
|
56
|
-
error: r.error?.message,
|
|
57
|
-
}))),
|
|
58
|
-
]
|
|
59
|
-
: [], [editImage, editRuns, editImageCount]);
|
|
60
|
-
const editRef = useLatest({ versions, activeVersion, editRuns });
|
|
61
|
-
// Each submit gets an id, so routing that settles after a newer submit is dropped.
|
|
62
|
-
const submitId = useRef(0);
|
|
63
|
-
// Aborts the current submit's engine calls: on `cancel()`, and when a newer
|
|
64
|
-
// submit replaces it (its results would be dropped anyway).
|
|
65
|
-
const controller = useRef(null);
|
|
66
|
-
// `submit` below reads through a ref so it can stay referentially stable (empty dep array — safe to
|
|
67
|
-
// pass to a memoized child) while always seeing this render's latest
|
|
68
|
-
// options, not the ones captured when `submit` was first created.
|
|
69
|
-
const optionsRef = useLatest(options);
|
|
70
|
-
// The hook's own pair wins, but only as a pair: half of one never mixes
|
|
71
|
-
// with half of the provider's (e.g. a hook engine with the provider's model).
|
|
72
12
|
const provided = useReasoning();
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
// one; otherwise the engine runs its own default. Never a silent no-op.
|
|
93
|
-
const fallback = isText ? (opts.textModel ?? (reasoning && reasoningModelFor(reasoning, attachments))) : undefined;
|
|
94
|
-
const params = payload.aspectRatio && !isEdit ? { aspectRatio: payload.aspectRatio } : {};
|
|
95
|
-
if (isEdit)
|
|
96
|
-
params.regions = payload.regions ?? [];
|
|
97
|
-
const request = {
|
|
98
|
-
mode: deriveGenerationUseCase(selection.useCase, attachments),
|
|
99
|
-
prompt: payload.value,
|
|
100
|
-
attachments,
|
|
101
|
-
modelIds: selection.modelIds.length > 0 ? selection.modelIds : [fallback ?? DEFAULT_MODEL_ID],
|
|
102
|
-
params,
|
|
103
|
-
};
|
|
104
|
-
const engine = isText
|
|
105
|
-
? (opts.textEngine ?? reasoning?.engine ?? mockTextEngine)
|
|
106
|
-
: (opts.engineByKind?.[selection.useCase.kind] ?? opts.engine ?? mockEngine);
|
|
107
|
-
return { request, engine, isEdit };
|
|
108
|
-
}, [optionsRef, reasoningRef, editRef]);
|
|
109
|
-
// Edit placeholders from routing waits, dropped from the history when the
|
|
110
|
-
// next real runs start (including ones a newer submit abandoned).
|
|
111
|
-
const placeholderIds = useRef(new Set());
|
|
112
|
-
const start = useCallback((payload, signal) => {
|
|
113
|
-
const opts = optionsRef.current;
|
|
114
|
-
const newRuns = payload.selections.map((selection) => {
|
|
115
|
-
const { request, engine, isEdit } = buildRequest(payload, selection);
|
|
116
|
-
return { run: createRun(request), engine, isEdit, models: selection.models ?? [] };
|
|
117
|
-
});
|
|
118
|
-
setRuns(newRuns.map((r) => r.run));
|
|
119
|
-
const newEditRuns = newRuns.filter((r) => r.isEdit).map((r) => r.run);
|
|
120
|
-
const placeholders = placeholderIds.current;
|
|
121
|
-
const kept = editRef.current.editRuns.filter((r) => !placeholders.has(r.id));
|
|
122
|
-
if (newEditRuns.length > 0) {
|
|
123
|
-
// Show the first new version, and start the next edit with no regions:
|
|
124
|
-
// these ones now belong to the versions they made.
|
|
125
|
-
setEditRuns([...kept, ...newEditRuns]);
|
|
126
|
-
setActiveVersion(1 + kept.reduce((n, r) => n + r.results.length, 0));
|
|
127
|
-
setRegions([]);
|
|
128
|
-
}
|
|
129
|
-
else if (placeholders.size > 0) {
|
|
130
|
-
setEditRuns(kept);
|
|
131
|
-
}
|
|
132
|
-
placeholderIds.current = new Set();
|
|
133
|
-
// Results settle independently and out of order — each update only
|
|
134
|
-
// ever touches its own run, and only if that run is still current. A
|
|
135
|
-
// run from an earlier submit is no longer in state (and its calls were
|
|
136
|
-
// aborted), so a late result can't clobber the newer ones.
|
|
137
|
-
const update = (runId, fn) => {
|
|
138
|
-
const apply = (prev) => (prev.some((r) => r.id === runId) ? prev.map((r) => (r.id === runId ? fn(r) : r)) : prev);
|
|
139
|
-
setRuns(apply);
|
|
140
|
-
setEditRuns(apply);
|
|
141
|
-
};
|
|
142
|
-
for (const { run: newRun, engine, isEdit, models } of newRuns) {
|
|
143
|
-
opts.onRun?.(newRun);
|
|
144
|
-
for (const result of newRun.results) {
|
|
145
|
-
update(newRun.id, (r) => startResult(r, result.id));
|
|
146
|
-
// An edit's prompt depends on the model: one with box support gets
|
|
147
|
-
// boxes, any other gets the regions described in words.
|
|
148
|
-
const regions = newRun.request.params.regions ?? [];
|
|
149
|
-
const model = models.find((m) => m.id === result.modelId) ?? PRECISE_EDIT_MODELS.find((m) => m.id === result.modelId);
|
|
150
|
-
const prompt = isEdit
|
|
151
|
-
? (opts.editPrompt ?? defaultEditPrompt)({ prompt: newRun.request.prompt, regions, model })
|
|
152
|
-
: newRun.request.prompt;
|
|
153
|
-
void engine
|
|
154
|
-
.generate({
|
|
155
|
-
modelId: result.modelId === DEFAULT_MODEL_ID ? undefined : result.modelId,
|
|
156
|
-
prompt,
|
|
157
|
-
attachments: newRun.request.attachments,
|
|
158
|
-
aspectRatio: newRun.request.params.aspectRatio,
|
|
159
|
-
// Text engines that stream fill `output` in while still "running".
|
|
160
|
-
onText: (text) => update(newRun.id, (r) => streamResult(r, result.id, text)),
|
|
161
|
-
signal,
|
|
162
|
-
})
|
|
163
|
-
.then(({ src, kind, usage, evaluations }) => {
|
|
164
|
-
update(newRun.id, (r) => resolveResult(r, result.id, { src, kind }, usage, evaluations));
|
|
165
|
-
optionsRef.current.onResult?.(newRun, result.id);
|
|
166
|
-
}, (err) => {
|
|
167
|
-
if (isAbortError(err))
|
|
168
|
-
return update(newRun.id, (r) => cancelResult(r, result.id));
|
|
169
|
-
update(newRun.id, (r) => failResult(r, result.id, normalizeGenerationError(err)));
|
|
170
|
-
optionsRef.current.onError?.(newRun, result.id);
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}, [optionsRef, buildRequest, editRef]);
|
|
175
|
-
const submit = useCallback((payload) => {
|
|
176
|
-
const id = ++submitId.current;
|
|
177
|
-
controller.current?.abort();
|
|
178
|
-
const { signal } = (controller.current = new AbortController());
|
|
179
|
-
const toRoute = payload.autoSelectModel && payload.selections.some((sel) => sel.models.length > 0);
|
|
180
|
-
if (!toRoute) {
|
|
181
|
-
setRouting(false);
|
|
182
|
-
start(payload, signal);
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
const opts = optionsRef.current;
|
|
186
|
-
const reasoning = reasoningRef.current;
|
|
187
|
-
if (!reasoning)
|
|
188
|
-
warnNoReasoningOnce();
|
|
189
|
-
setRouting(true);
|
|
190
|
-
// Runs exist from the moment of submit, so a result card shows progress
|
|
191
|
-
// while the reasoning model chooses. Their results read "Choosing model".
|
|
192
|
-
const placeholders = payload.selections.map((sel) => {
|
|
193
|
-
const { request, isEdit } = buildRequest(payload, sel);
|
|
194
|
-
const modelIds = sel.models.length > 0 ? [ROUTING_MODEL_ID] : request.modelIds;
|
|
195
|
-
return { run: createRun({ ...request, modelIds }), isEdit };
|
|
196
|
-
});
|
|
197
|
-
setRuns(placeholders.map((p) => p.run));
|
|
198
|
-
const editPlaceholders = placeholders.filter((p) => p.isEdit).map((p) => p.run);
|
|
199
|
-
if (editPlaceholders.length > 0) {
|
|
200
|
-
const editRuns = editRef.current.editRuns.filter((r) => !placeholderIds.current.has(r.id));
|
|
201
|
-
for (const r of editPlaceholders)
|
|
202
|
-
placeholderIds.current.add(r.id);
|
|
203
|
-
setEditRuns([...editRuns, ...editPlaceholders]);
|
|
204
|
-
setActiveVersion(1 + editRuns.reduce((n, r) => n + r.results.length, 0));
|
|
205
|
-
}
|
|
206
|
-
void Promise.all(payload.selections.map((sel) => sel.models.length === 0
|
|
207
|
-
? Promise.resolve(null)
|
|
208
|
-
: routeModel({
|
|
209
|
-
prompt: payload.value,
|
|
210
|
-
outputKind: sel.useCase.kind,
|
|
211
|
-
attachmentKinds: payload.attachments.map((a) => a.kind),
|
|
212
|
-
attachments: payload.attachments,
|
|
213
|
-
models: sel.models,
|
|
214
|
-
engine: reasoning?.engine,
|
|
215
|
-
model: reasoning && reasoningModelFor(reasoning, payload.attachments),
|
|
216
|
-
routingPrompt: opts.routingPrompt,
|
|
217
|
-
signal,
|
|
218
|
-
}))).then((results) => {
|
|
219
|
-
if (id !== submitId.current || signal.aborted)
|
|
220
|
-
return;
|
|
221
|
-
setRouting(false);
|
|
222
|
-
const latest = optionsRef.current;
|
|
223
|
-
for (const r of results)
|
|
224
|
-
if (r?.status === "fallback")
|
|
225
|
-
latest.onRoutingFallback?.(r);
|
|
226
|
-
const routedIds = results.flatMap((r) => (r ? [r.modelId] : []));
|
|
227
|
-
if (latest.onModelIdsChange)
|
|
228
|
-
latest.onModelIdsChange(routedIds);
|
|
229
|
-
else if (routedIds[0])
|
|
230
|
-
latest.onModelChange?.(routedIds[0]);
|
|
231
|
-
start({
|
|
232
|
-
...payload,
|
|
233
|
-
modelId: routedIds[0] ?? payload.modelId,
|
|
234
|
-
selections: payload.selections.map((sel, i) => ({
|
|
235
|
-
...sel,
|
|
236
|
-
modelIds: results[i] ? [results[i].modelId] : sel.modelIds,
|
|
237
|
-
})),
|
|
238
|
-
}, signal);
|
|
239
|
-
});
|
|
240
|
-
}, [start, buildRequest, optionsRef, reasoningRef, editRef]);
|
|
241
|
-
/**
|
|
242
|
-
* Stops the current submit: wire it to Composer's `onAbort`. Its
|
|
243
|
-
* unfinished results turn `"cancelled"` right away, and each engine
|
|
244
|
-
* cancels at the provider where it can (best effort: some providers keep
|
|
245
|
-
* running, and billing, once a request has started).
|
|
246
|
-
*/
|
|
247
|
-
const cancel = useCallback(() => {
|
|
248
|
-
submitId.current += 1;
|
|
249
|
-
controller.current?.abort();
|
|
250
|
-
controller.current = null;
|
|
251
|
-
setRouting(false);
|
|
252
|
-
const cancelAll = (prev) => prev.map((run) => run.results.reduce((acc, r) => cancelResult(acc, r.id), run));
|
|
253
|
-
setRuns(cancelAll);
|
|
254
|
-
setEditRuns(cancelAll);
|
|
255
|
-
}, []);
|
|
256
|
-
const run = runs[0] ?? null;
|
|
257
|
-
// `undefined` (not a no-op function) when unconfigured, so a consumer
|
|
258
|
-
// can write `onEnhance={enhance}` directly — matching how `Composer`
|
|
259
|
-
// itself treats an omitted `onEnhance` as "hide the button entirely",
|
|
260
|
-
// rather than needing an `enhance ? enhance : undefined` at every call site.
|
|
261
|
-
const enhance = useMemo(() => {
|
|
262
|
-
if (!reasoning)
|
|
263
|
-
return undefined;
|
|
264
|
-
return async (value) => {
|
|
265
|
-
setEnhancing(true);
|
|
266
|
-
try {
|
|
267
|
-
const prompt = (options.enhancePrompt ?? defaultEnhancePrompt)(value, run?.request.mode);
|
|
268
|
-
const { src } = await reasoning.engine.generate({ modelId: reasoning.model, prompt, attachments: [] });
|
|
269
|
-
return src;
|
|
270
|
-
}
|
|
271
|
-
finally {
|
|
272
|
-
setEnhancing(false);
|
|
273
|
-
}
|
|
274
|
-
};
|
|
275
|
-
}, [reasoning, options.enhancePrompt, run?.request.mode]);
|
|
276
|
-
/** Props for an `EditCard` (spread them in), and `regions` for `Composer`. `null` when there's no `editImage`. */
|
|
277
|
-
const edit = editImage
|
|
278
|
-
? {
|
|
279
|
-
versions,
|
|
280
|
-
activeVersion: Math.min(activeVersion, versions.length - 1),
|
|
281
|
-
onActiveVersionChange: setActiveVersion,
|
|
282
|
-
regions,
|
|
283
|
-
onRegionsChange: setRegions,
|
|
284
|
-
}
|
|
285
|
-
: null;
|
|
286
|
-
return { run, runs, submit, cancel, enhance, enhancing, routing, edit };
|
|
287
|
-
}
|
|
288
|
-
function defaultEditPrompt({ prompt, regions, model }) {
|
|
289
|
-
return buildRegionEditPrompt({ prompt, regions, format: model?.regionFormat });
|
|
290
|
-
}
|
|
291
|
-
let warnedNoReasoning = false;
|
|
292
|
-
function warnNoReasoningOnce() {
|
|
293
|
-
if (warnedNoReasoning)
|
|
294
|
-
return;
|
|
295
|
-
warnedNoReasoning = true;
|
|
296
|
-
console.warn("[chai-ui] Auto-select model is on, but there's no reasoning model, so each request runs on the first listed model. Wrap your app in <ChaiProvider> to route with one.");
|
|
13
|
+
// `submit` and friends are stable but read the newest options when they run.
|
|
14
|
+
const latest = useLatest({ options, provided });
|
|
15
|
+
const [store] = useState(() => createComposerStore(() => latest.current.options, () => latest.current.provided));
|
|
16
|
+
const state = useSyncExternalStore(store.subscribe, store.getState, store.getState);
|
|
17
|
+
// `undefined` (not a no-op function) without reasoning, so a consumer can
|
|
18
|
+
// write `onEnhance={enhance}` directly — matching how `Composer` treats an
|
|
19
|
+
// omitted `onEnhance` as "hide the button".
|
|
20
|
+
const enhance = pickReasoning(options, provided) ? store.enhance : undefined;
|
|
21
|
+
return {
|
|
22
|
+
run: state.runs[0] ?? null,
|
|
23
|
+
runs: state.runs,
|
|
24
|
+
submit: store.submit,
|
|
25
|
+
cancel: store.cancel,
|
|
26
|
+
enhance,
|
|
27
|
+
enhancing: state.enhancing,
|
|
28
|
+
routing: state.routing,
|
|
29
|
+
/** Props for an `EditCard` (spread them in), and `regions` for `Composer`. `null` when there's no `editImage`. */
|
|
30
|
+
edit: store.edit(state, options.editImage),
|
|
31
|
+
};
|
|
297
32
|
}
|
|
298
33
|
//# sourceMappingURL=useComposer.js.map
|
package/dist/useComposer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useComposer.js","sourceRoot":"","sources":["../src/useComposer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useComposer.js","sourceRoot":"","sources":["../src/useComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAwB,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIjD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,UAA8B,EAAE;IAC1D,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,6EAA6E;IAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAC5B,mBAAmB,CACjB,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAC5B,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAC9B,CACF,CAAC;IACF,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEpF,0EAA0E;IAC1E,2EAA2E;IAC3E,4CAA4C;IAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7E,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO;QACP,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,kHAAkH;QAClH,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -1,37 +1,17 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
|
|
3
|
-
export interface UseMediaAnalyzerOptions {
|
|
4
|
-
/**
|
|
5
|
-
* Overrides the nearest `ChaiProvider`'s reasoning engine. With neither,
|
|
6
|
-
* a mock text engine answers, so a first render works with no key.
|
|
7
|
-
*/
|
|
8
|
-
engine?: GenerationEngine;
|
|
9
|
-
/** The model when the person hasn't picked one. Defaults to the provider's reasoning model for the media's kind. */
|
|
10
|
-
model?: string;
|
|
11
|
-
onResult?: (prompt: string) => void;
|
|
12
|
-
onError?: (message: string) => void;
|
|
13
|
-
/** Auto-select: fires with the routed model so the trigger shows it. Wire it to `MediaAnalyzer`'s `onModelChange` state. */
|
|
14
|
-
onModelChange?: (modelId: string) => void;
|
|
15
|
-
/** Replaces the routing instruction (`buildModelRoutingPrompt` in `@chai-ui/core`). */
|
|
16
|
-
routingPrompt?: (input: ModelRoutingInput) => string;
|
|
17
|
-
/** Fires when auto-select fell back to the first listed model (no reasoning model, a failed call, or an unlisted reply). Analysis still runs. */
|
|
18
|
-
onRoutingFallback?: (result: Extract<ModelRoutingResult, {
|
|
19
|
-
status: "fallback";
|
|
20
|
-
}>) => void;
|
|
21
|
-
}
|
|
1
|
+
import { type MediaAnalyzerOptions } from "@chai-ui/core";
|
|
2
|
+
export type UseMediaAnalyzerOptions = MediaAnalyzerOptions;
|
|
22
3
|
/**
|
|
23
|
-
* The binding
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* generated prompt. `prompt` fills in as the text streams.
|
|
4
|
+
* The React binding for `createMediaAnalyzerStore` in `@chai-ui/core`, behind
|
|
5
|
+
* `MediaAnalyzer`'s `onSubmit`: returns the generated prompt, which fills in
|
|
6
|
+
* as the text streams.
|
|
27
7
|
*/
|
|
28
8
|
export declare function useMediaAnalyzer(options?: UseMediaAnalyzerOptions): {
|
|
29
|
-
submit: (payload: MediaAnalyzerSubmitPayload) => void;
|
|
9
|
+
submit: (payload: import("@chai-ui/core").MediaAnalyzerSubmitPayload) => void;
|
|
10
|
+
cancel: () => void;
|
|
11
|
+
reset: () => void;
|
|
30
12
|
analyzing: boolean;
|
|
31
13
|
error: string | null;
|
|
32
14
|
prompt: string | null;
|
|
33
|
-
cancel: () => void;
|
|
34
|
-
reset: () => void;
|
|
35
15
|
};
|
|
36
16
|
export type UseMediaAnalyzerReturn = ReturnType<typeof useMediaAnalyzer>;
|
|
37
17
|
//# sourceMappingURL=useMediaAnalyzer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMediaAnalyzer.d.ts","sourceRoot":"","sources":["../src/useMediaAnalyzer.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"useMediaAnalyzer.d.ts","sourceRoot":"","sources":["../src/useMediaAnalyzer.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAIpF,MAAM,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B;;;;;;;EAWrE;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|
package/dist/useMediaAnalyzer.js
CHANGED
|
@@ -1,114 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { useState, useSyncExternalStore } from "react";
|
|
2
|
+
import { createMediaAnalyzerStore } from "@chai-ui/core";
|
|
3
|
+
import { useReasoning } from "./ChaiProvider.js";
|
|
4
4
|
import { useLatest } from "./use-latest.js";
|
|
5
|
-
const mockTextEngine = createMockEngine({ outputKind: "text" });
|
|
6
5
|
/**
|
|
7
|
-
* The binding
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* generated prompt. `prompt` fills in as the text streams.
|
|
6
|
+
* The React binding for `createMediaAnalyzerStore` in `@chai-ui/core`, behind
|
|
7
|
+
* `MediaAnalyzer`'s `onSubmit`: returns the generated prompt, which fills in
|
|
8
|
+
* as the text streams.
|
|
11
9
|
*/
|
|
12
10
|
export function useMediaAnalyzer(options = {}) {
|
|
13
|
-
const [analyzing, setAnalyzing] = useState(false);
|
|
14
|
-
const [error, setError] = useState(null);
|
|
15
|
-
const [prompt, setPrompt] = useState(null);
|
|
16
11
|
const provided = useReasoning();
|
|
17
12
|
const latest = useLatest({ options, provided });
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const controller = useRef(null);
|
|
22
|
-
const submit = useCallback((payload) => {
|
|
23
|
-
const { options: opts, provided: reasoning } = latest.current;
|
|
24
|
-
const id = ++callId.current;
|
|
25
|
-
controller.current?.abort();
|
|
26
|
-
const { signal } = (controller.current = new AbortController());
|
|
27
|
-
setError(null);
|
|
28
|
-
setPrompt(null);
|
|
29
|
-
const kind = payload.attachments[0]?.kind;
|
|
30
|
-
if (kind !== "image" && kind !== "video" && kind !== "audio") {
|
|
31
|
-
const message = "Attach an image, video, or audio file to analyze.";
|
|
32
|
-
setError(message);
|
|
33
|
-
opts.onError?.(message);
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const engine = opts.engine ?? reasoning?.engine ?? mockTextEngine;
|
|
37
|
-
const defaultModel = opts.model ?? (reasoning ? reasoningModelFor(reasoning, payload.attachments) : undefined);
|
|
38
|
-
const instruction = MEDIA_ANALYSIS_PROMPTS[kind][payload.promptLength ?? DEFAULT_MEDIA_ANALYSIS_PROMPT_LENGTH];
|
|
39
|
-
const current = () => id === callId.current;
|
|
40
|
-
const autoSelect = payload.autoSelectModel && payload.models.length > 0;
|
|
41
|
-
const analyze = (modelId) => engine
|
|
42
|
-
.generate({
|
|
43
|
-
modelId,
|
|
44
|
-
prompt: instruction,
|
|
45
|
-
attachments: payload.attachments,
|
|
46
|
-
onText: (text) => current() && setPrompt(text),
|
|
47
|
-
signal,
|
|
48
|
-
})
|
|
49
|
-
.then(({ src }) => {
|
|
50
|
-
if (!current())
|
|
51
|
-
return;
|
|
52
|
-
setPrompt(src);
|
|
53
|
-
latest.current.options.onResult?.(src);
|
|
54
|
-
}, (err) => {
|
|
55
|
-
if (!current() || isAbortError(err))
|
|
56
|
-
return;
|
|
57
|
-
const { message } = normalizeGenerationError(err);
|
|
58
|
-
setError(message);
|
|
59
|
-
latest.current.options.onError?.(message);
|
|
60
|
-
})
|
|
61
|
-
.finally(() => current() && setAnalyzing(false));
|
|
62
|
-
setAnalyzing(true);
|
|
63
|
-
if (!autoSelect) {
|
|
64
|
-
void analyze(payload.modelId ?? defaultModel);
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
// Auto-select: the reasoning model looks at the media and picks the
|
|
68
|
-
// analysis model first. A routing problem falls back, never blocks.
|
|
69
|
-
void routeModel({
|
|
70
|
-
prompt: "",
|
|
71
|
-
outputKind: "text",
|
|
72
|
-
attachmentKinds: payload.attachments.map((a) => a.kind),
|
|
73
|
-
attachments: payload.attachments,
|
|
74
|
-
models: payload.models,
|
|
75
|
-
engine: opts.engine ?? reasoning?.engine,
|
|
76
|
-
model: defaultModel,
|
|
77
|
-
routingPrompt: opts.routingPrompt,
|
|
78
|
-
signal,
|
|
79
|
-
}).then((routed) => {
|
|
80
|
-
if (!current() || signal.aborted)
|
|
81
|
-
return;
|
|
82
|
-
const latestOpts = latest.current.options;
|
|
83
|
-
if (routed.status === "fallback") {
|
|
84
|
-
if (routed.reason === "no-reasoning")
|
|
85
|
-
warnNoReasoningOnce();
|
|
86
|
-
latestOpts.onRoutingFallback?.(routed);
|
|
87
|
-
}
|
|
88
|
-
latestOpts.onModelChange?.(routed.modelId);
|
|
89
|
-
return analyze(routed.modelId);
|
|
90
|
-
});
|
|
91
|
-
}, [latest]);
|
|
92
|
-
/** Stops the analysis in flight (cancelling at the provider where it can), keeping any text that already streamed in. */
|
|
93
|
-
const cancel = useCallback(() => {
|
|
94
|
-
callId.current += 1;
|
|
95
|
-
controller.current?.abort();
|
|
96
|
-
controller.current = null;
|
|
97
|
-
setAnalyzing(false);
|
|
98
|
-
}, []);
|
|
99
|
-
/** Stops anything in flight and clears the prompt and error, e.g. when the person changes their media. */
|
|
100
|
-
const reset = useCallback(() => {
|
|
101
|
-
cancel();
|
|
102
|
-
setError(null);
|
|
103
|
-
setPrompt(null);
|
|
104
|
-
}, [cancel]);
|
|
105
|
-
return { submit, analyzing, error, prompt, cancel, reset };
|
|
106
|
-
}
|
|
107
|
-
let warnedNoReasoning = false;
|
|
108
|
-
function warnNoReasoningOnce() {
|
|
109
|
-
if (warnedNoReasoning)
|
|
110
|
-
return;
|
|
111
|
-
warnedNoReasoning = true;
|
|
112
|
-
console.warn("[chai-ui] Auto-select model is on, but there's no reasoning model, so analysis runs on the first listed model. Wrap your app in <ChaiProvider> to route with one.");
|
|
13
|
+
const [store] = useState(() => createMediaAnalyzerStore(() => latest.current.options, () => latest.current.provided));
|
|
14
|
+
const state = useSyncExternalStore(store.subscribe, store.getState, store.getState);
|
|
15
|
+
return { ...state, submit: store.submit, cancel: store.cancel, reset: store.reset };
|
|
113
16
|
}
|
|
114
17
|
//# sourceMappingURL=useMediaAnalyzer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMediaAnalyzer.js","sourceRoot":"","sources":["../src/useMediaAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useMediaAnalyzer.js","sourceRoot":"","sources":["../src/useMediaAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAA6B,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAmC,EAAE;IACpE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAC5B,wBAAwB,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAC5B,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAC9B,CACF,CAAC;IACF,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpF,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AACtF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chai-ui/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "CHAI UI React components — smart, drop-in UI for AI apps: Composer, Media Analyzer, Result Card, and the useComposer hook.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "kazarazat",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
"@fontsource/roboto": "^5.3.0",
|
|
49
49
|
"@lit/react": "^1.0.8",
|
|
50
50
|
"@material/web": "^2.5.0",
|
|
51
|
-
"@chai-ui/core": "0.
|
|
52
|
-
"@chai-ui/tokens": "0.
|
|
51
|
+
"@chai-ui/core": "0.6.1",
|
|
52
|
+
"@chai-ui/tokens": "0.6.1"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@material-symbols/svg-400": "^0.47.5",
|