@chai-ui/react 0.6.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.
@@ -1,96 +1,21 @@
1
- import { type DroppedMedia, type EditRegion, type GenerationEngine, type GenerationUseCase, type MediaKind, type ModelOption, type ModelRoutingInput, type ModelRoutingResult, type Run } from "@chai-ui/core";
2
- import type { ComposerSubmitPayload } from "./Composer.js";
3
- import type { EditVersion } from "./EditCard.js";
4
- /** A result's `modelId` when nothing was picked: the engine runs its own default model. */
5
- export declare const DEFAULT_MODEL_ID = "default";
6
- export interface UseComposerOptions {
7
- /** The generation engine a submitted run actually calls. Defaults to `mockEngine`. */
8
- engine?: GenerationEngine;
9
- /**
10
- * Engines per use-case kind, overriding `engine` for that kind — needed
11
- * for multi-use-case select, since one Fal engine outputs one kind, e.g.
12
- * `{ image: createFalEngine({ outputKind: "image" }), video: createFalEngine({ outputKind: "video" }) }`.
13
- */
14
- engineByKind?: Partial<Record<MediaKind, GenerationEngine>>;
15
- /**
16
- * The engine for text requests (a Composer with no use case picked, or a
17
- * text use case). Defaults to `reasoningEngine`, and to a mock text engine
18
- * when neither is set, so a text prompt always gets a reply.
19
- */
20
- textEngine?: GenerationEngine;
21
- /** The model text requests use when none is picked. Defaults to the reasoning model for the attachments' kinds, then the text engine's own default. */
22
- textModel?: string;
23
- /**
24
- * The reasoning engine Enhance calls — deliberately separate from
25
- * `engine`: Fal's own text/vision access is itself an
26
- * OpenRouter proxy, so defaulting Enhance to a Fal `engine` would
27
- * silently double-proxy. Must return text. Set together with
28
- * `reasoningModel` to override the nearest `ChaiProvider`'s pair; with
29
- * neither set here nor a provider, `enhance` stays `undefined`, same
30
- * shape as `Composer`'s own "omit `onEnhance` to hide the button" convention.
31
- */
32
- reasoningEngine?: GenerationEngine;
33
- /** Set with `reasoningEngine` to override the provider's pair; used for every kind (§5.5). */
34
- reasoningModel?: string;
35
- /** Overrides the instruction wrapping a raw prompt for Enhance. Defaults to a generic still/video-aware rewrite instruction. */
36
- enhancePrompt?: (value: string, mode?: GenerationUseCase) => string;
37
- /**
38
- * Auto-select: with `autoSelectModel` on in the payload, the reasoning
39
- * model picks one model per use case at submit, then these fire with the
40
- * pick so the Composer's trigger shows it. Wire them to the same state as
41
- * Composer's `onModelChange` / `onModelIdsChange`.
42
- */
43
- onModelChange?: (modelId: string) => void;
44
- onModelIdsChange?: (modelIds: string[]) => void;
45
- /** Replaces the routing instruction (`buildModelRoutingPrompt` in `@chai-ui/core`). */
46
- routingPrompt?: (input: ModelRoutingInput) => string;
47
- /**
48
- * Fires when auto-select couldn't route and fell back to the first listed
49
- * model: no reasoning model, a failed reasoning call (e.g. a bad key), or
50
- * a reply naming no listed model. The request still runs.
51
- */
52
- onRoutingFallback?: (result: Extract<ModelRoutingResult, {
53
- status: "fallback";
54
- }>) => void;
55
- /**
56
- * The image to edit, when the Composer's use case is an edit (e.g.
57
- * `EDIT_IMAGE_USE_CASE`) and an image is attached. While it's set, the hook
58
- * returns `edit` for an `EditCard`, and each edit's results become new
59
- * versions of the image. Changing it to another image starts over.
60
- */
61
- editImage?: DroppedMedia | null;
62
- /** Replaces how an edit's prompt and regions become the model's prompt. Defaults to `buildRegionEditPrompt` in `@chai-ui/core`, in the model's `regionFormat`. */
63
- editPrompt?: (args: {
64
- prompt: string;
65
- regions: EditRegion[];
66
- model?: ModelOption;
67
- }) => string;
68
- onRun?: (run: Run) => void;
69
- onResult?: (run: Run, resultId: string) => void;
70
- onError?: (run: Run, resultId: string) => void;
71
- }
1
+ import { type ComposerOptions } from "@chai-ui/core";
2
+ export { DEFAULT_MODEL_ID } from "@chai-ui/core";
3
+ export type UseComposerOptions = ComposerOptions;
72
4
  /**
73
- * The headless binding the design promises and the package README
74
- * flagged as missing: turns a `Composer`'s `onSubmit` payload into a real
75
- * `Request` → `Run` → `Result` (§6), fanning out across `engine.generate`
76
- * calls and folding each one back into state as it settles — pure
77
- * transitions live in `@chai-ui/core`, this is the thin React binding.
5
+ * The React binding for `createComposerStore` in `@chai-ui/core`: turns a
6
+ * `Composer`'s `onSubmit` payload into a real `Request` → `Run` → `Result`
7
+ * (§6). The behavior lives in core; this keeps its state in React.
78
8
  */
79
9
  export declare function useComposer(options?: UseComposerOptions): {
80
- run: Run | null;
81
- runs: Run[];
82
- submit: (payload: ComposerSubmitPayload) => void;
10
+ run: import("@chai-ui/core").Run | null;
11
+ runs: import("@chai-ui/core").Run[];
12
+ submit: (payload: import("@chai-ui/core").ComposerSubmitPayload) => void;
83
13
  cancel: () => void;
84
14
  enhance: ((value: string) => Promise<string>) | undefined;
85
15
  enhancing: boolean;
86
16
  routing: boolean;
87
- edit: {
88
- versions: EditVersion[];
89
- activeVersion: number;
90
- onActiveVersionChange: import("react").Dispatch<import("react").SetStateAction<number>>;
91
- regions: EditRegion[];
92
- onRegionsChange: import("react").Dispatch<import("react").SetStateAction<EditRegion[]>>;
93
- } | null;
17
+ /** Props for an `EditCard` (spread them in), and `regions` for `Composer`. `null` when there's no `editImage`. */
18
+ edit: import("@chai-ui/core").ComposerEdit | null;
94
19
  };
95
20
  export type UseComposerReturn = ReturnType<typeof useComposer>;
96
21
  //# sourceMappingURL=useComposer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useComposer.d.ts","sourceRoot":"","sources":["../src/useComposer.ts"],"names":[],"mappings":"AACA,OAAO,EAgBL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAEvB,KAAK,GAAG,EACT,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAqB,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjD,2FAA2F;AAC3F,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAa1C,MAAM,WAAW,kBAAkB;IACjC,sFAAsF;IACtF,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC5D;;;;OAIG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,uJAAuJ;IACvJ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,8FAA8F;IAC9F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gIAAgI;IAChI,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,iBAAiB,KAAK,MAAM,CAAC;IACpE;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAChD,uFAAuF;IACvF,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC;IACrD;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,EAAE;QAAE,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC1F;;;;;OAKG;IACH,SAAS,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAChC,kKAAkK;IAClK,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,WAAW,CAAA;KAAE,KAAK,MAAM,CAAC;IAC9F,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB;;;sBAiL9C,qBAAqB;;sBA2FV,MAAM;;;;;;;;;;EAwB9B;AAMD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC"}
1
+ {"version":3,"file":"useComposer.d.ts","sourceRoot":"","sources":["../src/useComposer.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAIzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB;;;;;;;;IAyBxD,kHAAkH;;EAGrH;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC"}
@@ -1,298 +1,33 @@
1
- import { useCallback, useMemo, useRef, useState } from "react";
2
- import { buildRegionEditPrompt, createMockEngine, createRun, deriveGenerationUseCase, cancelResult, failResult, isAbortError, mockEngine, normalizeGenerationError, PRECISE_EDIT_MODELS, resolveResult, routeModel, ROUTING_MODEL_ID, startResult, streamResult, } from "@chai-ui/core";
3
- import { reasoningModelFor, useReasoning } from "./ChaiProvider.js";
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
- /** A result's `modelId` when nothing was picked: the engine runs its own default model. */
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 headless binding the design promises and the package README
18
- * flagged as missing: turns a `Composer`'s `onSubmit` payload into a real
19
- * `Request` → `Run` → `Result` (§6), fanning out across `engine.generate`
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
- const { reasoningEngine, reasoningModel } = options;
74
- const reasoning = useMemo(() => reasoningEngine || reasoningModel
75
- ? reasoningEngine && reasoningModel
76
- ? { engine: reasoningEngine, model: reasoningModel, modelByKind: {} }
77
- : undefined
78
- : provided, [reasoningEngine, reasoningModel, provided]);
79
- const reasoningRef = useLatest(reasoning);
80
- // One request per selection. An edit runs on the image version showing
81
- // in the EditCard (the original until an edit lands) and carries its regions.
82
- const buildRequest = useCallback((payload, selection) => {
83
- const opts = optionsRef.current;
84
- const reasoning = reasoningRef.current;
85
- const isText = selection.useCase.kind === "text";
86
- const isEdit = Boolean(selection.useCase.edit && opts.editImage?.kind === "image");
87
- const { versions, activeVersion } = editRef.current;
88
- const shown = versions[activeVersion];
89
- const editFrom = shown?.status === "done" && shown.src ? shown.src : opts.editImage?.src;
90
- const attachments = isEdit && editFrom ? [{ src: editFrom, kind: "image" }] : payload.attachments;
91
- // Nothing picked: text uses the builder's text model when there is
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
@@ -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 GenerationEngine, type ModelRoutingInput, type ModelRoutingResult } from "@chai-ui/core";
2
- import type { MediaAnalyzerSubmitPayload } from "./MediaAnalyzer.js";
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 behind `MediaAnalyzer`'s `onSubmit`: sends the attached
24
- * media and the instruction for its kind and prompt length
25
- * (`MEDIA_ANALYSIS_PROMPTS`) to the reasoning engine, and returns the
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,EAOL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAMrE,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,oHAAoH;IACpH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,4HAA4H;IAC5H,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,uFAAuF;IACvF,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC;IACrD,iJAAiJ;IACjJ,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,EAAE;QAAE,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;CAC3F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B;sBAY/B,0BAA0B;;;;;;EA2FhE;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
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"}