@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.
- 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 +3 -58
- package/dist/Composer.d.ts.map +1 -1
- package/dist/Composer.js +2 -5
- 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.map +1 -1
- package/dist/MediaAnalyzer.d.ts +2 -13
- package/dist/MediaAnalyzer.d.ts.map +1 -1
- package/dist/MediaAnalyzer.js.map +1 -1
- 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 +11 -64
- package/src/EditCard.tsx +3 -17
- package/src/MediaAnalyzer.tsx +3 -15
- package/src/useComposer.ts +33 -411
- package/src/useMediaAnalyzer.ts +15 -146
package/dist/useComposer.d.ts
CHANGED
|
@@ -1,96 +1,21 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
|
|
3
|
-
|
|
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
|
|
74
|
-
*
|
|
75
|
-
*
|
|
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
|
-
|
|
88
|
-
|
|
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,
|
|
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"}
|
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"}
|