simple-ai-sdk 1.0.37 → 1.0.38
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/client/types.d.ts
CHANGED
|
@@ -59,12 +59,6 @@ export type UseChatSessionOptions = {
|
|
|
59
59
|
* @returns
|
|
60
60
|
*/
|
|
61
61
|
onFinish?: OnChatFinishCallback;
|
|
62
|
-
/**
|
|
63
|
-
* messages 更新通知の最小間隔(ミリ秒)。
|
|
64
|
-
* 指定すると、ストリーミング中の messages 変更通知がこの間隔で間引かれる。
|
|
65
|
-
* status / error / finishedReason の変化は即時通知される。
|
|
66
|
-
*/
|
|
67
|
-
throttleMs?: number;
|
|
68
62
|
};
|
|
69
63
|
export type SendMessageReqBody = Record<string, JSONValue>;
|
|
70
64
|
export type SendMessageOptions = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE9E,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,WAAW,GACX,WAAW,GACX,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IACjC;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC;;OAEG;IACH,cAAc,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACxC;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAEzD,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,EAAE,gBAAgB,CAAC;IACjC;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CACjC,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,mBAAmB,KACzB,IAAI,CAAC;AAEV,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatSession.d.ts","sourceRoot":"","sources":["../../src/client/useChatSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"useChatSession.d.ts","sourceRoot":"","sources":["../../src/client/useChatSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAGrB,MAAM,YAAY,CAAC;AAKpB,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,qBAAqB,GAC7B,oBAAoB,CAiKtB"}
|
|
@@ -1,53 +1,8 @@
|
|
|
1
1
|
import { useEffect, useSyncExternalStore, useCallback, useRef } from "react";
|
|
2
2
|
import { useAIStreamManager } from "./context.js";
|
|
3
3
|
import { generateMessageId } from "../shared/generate-id.js";
|
|
4
|
-
/**
|
|
5
|
-
* messages のみの変更を throttle し、status/error/finishedReason の変化は即時通知するコールバックを作成
|
|
6
|
-
*/
|
|
7
|
-
function createThrottledCallback(callback, throttleMs, sessionId, getSnapshot, throttleState) {
|
|
8
|
-
const emitNow = (snapshot) => {
|
|
9
|
-
if (throttleState.timerId) {
|
|
10
|
-
clearTimeout(throttleState.timerId);
|
|
11
|
-
throttleState.timerId = null;
|
|
12
|
-
}
|
|
13
|
-
throttleState.lastEmittedAt = Date.now();
|
|
14
|
-
throttleState.lastSnapshot = snapshot;
|
|
15
|
-
callback();
|
|
16
|
-
};
|
|
17
|
-
const hasImportantChange = (current, last) => {
|
|
18
|
-
return (!last ||
|
|
19
|
-
current?.status !== last.status ||
|
|
20
|
-
current?.error !== last.error ||
|
|
21
|
-
current?.finishedReason !== last.finishedReason);
|
|
22
|
-
};
|
|
23
|
-
return () => {
|
|
24
|
-
const now = Date.now();
|
|
25
|
-
const currentSnapshot = getSnapshot();
|
|
26
|
-
const currentSession = currentSnapshot.sessions.get(sessionId);
|
|
27
|
-
const lastSession = throttleState.lastSnapshot?.sessions.get(sessionId);
|
|
28
|
-
// status / error / finishedReason が変化した場合は即時通知
|
|
29
|
-
if (hasImportantChange(currentSession, lastSession)) {
|
|
30
|
-
emitNow(currentSnapshot);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
// messages のみの変更の場合は throttle を適用
|
|
34
|
-
const elapsed = now - throttleState.lastEmittedAt;
|
|
35
|
-
if (elapsed >= throttleMs) {
|
|
36
|
-
emitNow(currentSnapshot);
|
|
37
|
-
}
|
|
38
|
-
else if (!throttleState.timerId) {
|
|
39
|
-
// まだ待機中でなければタイマーをセット
|
|
40
|
-
throttleState.timerId = setTimeout(() => {
|
|
41
|
-
throttleState.timerId = null;
|
|
42
|
-
throttleState.lastEmittedAt = Date.now();
|
|
43
|
-
throttleState.lastSnapshot = getSnapshot();
|
|
44
|
-
callback();
|
|
45
|
-
}, throttleMs - elapsed);
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
4
|
export function useChatSession(sessionId, options) {
|
|
50
|
-
const { api, initialMessages = [], onError, onFinish
|
|
5
|
+
const { api, initialMessages = [], onError, onFinish } = options;
|
|
51
6
|
const manager = useAIStreamManager();
|
|
52
7
|
// セッションIDの変更検知用。初期化時に正しい initialMessages を渡すため、
|
|
53
8
|
// レンダリング中に参照を更新する(副作用ではないので安全)。
|
|
@@ -67,43 +22,20 @@ export function useChatSession(sessionId, options) {
|
|
|
67
22
|
// その間のストリーミング更新は manager 側で通知が抑制され、UI が更新されないことがある。
|
|
68
23
|
// - これを避けるため、initialMessages は useRef で固定化し、subscribe の依存配列から外す。
|
|
69
24
|
// - また、initSession の即時通知を確実に受け取れるよう、retain → subscribe → init の順に実行する。
|
|
70
|
-
//
|
|
71
|
-
// throttleMs が指定されている場合:
|
|
72
|
-
// - messages のみの変更は throttleMs 間隔で間引かれる
|
|
73
|
-
// - status / error / finishedReason の変化は即時通知される
|
|
74
|
-
// - 初回の messages 更新は即時通知される(UX のため)
|
|
75
|
-
const throttleRef = useRef({
|
|
76
|
-
timerId: null,
|
|
77
|
-
lastEmittedAt: 0,
|
|
78
|
-
lastSnapshot: null,
|
|
79
|
-
});
|
|
80
25
|
const state = useSyncExternalStore(useCallback((callback) => {
|
|
81
26
|
// セッション初期化とサブスクリプション管理を同期的に実行
|
|
82
27
|
// - レース回避のため retain を先に行い subCount>0 を担保
|
|
83
28
|
// - initSession の即時通知を受け取るため、subscribe 登録後に init を実行
|
|
84
29
|
manager.retainSession(sessionId);
|
|
85
|
-
|
|
86
|
-
const throttleState = throttleRef.current;
|
|
87
|
-
throttleState.timerId = null;
|
|
88
|
-
throttleState.lastEmittedAt = 0;
|
|
89
|
-
throttleState.lastSnapshot = null;
|
|
90
|
-
const wrappedCallback = throttleMs
|
|
91
|
-
? createThrottledCallback(callback, throttleMs, sessionId, () => manager.getSnapshot(), throttleState)
|
|
92
|
-
: callback;
|
|
93
|
-
const unsubscribe = manager.subscribe(wrappedCallback);
|
|
30
|
+
const unsubscribe = manager.subscribe(callback);
|
|
94
31
|
manager.initSession(sessionId, initialMessagesRef.current);
|
|
95
32
|
return () => {
|
|
96
|
-
// タイマーをクリア
|
|
97
|
-
if (throttleState.timerId) {
|
|
98
|
-
clearTimeout(throttleState.timerId);
|
|
99
|
-
throttleState.timerId = null;
|
|
100
|
-
}
|
|
101
33
|
// 先に release して購読者数を即時に正しく反映
|
|
102
34
|
manager.releaseSession(sessionId);
|
|
103
35
|
unsubscribe();
|
|
104
36
|
// アンマウント時にハンドラは消さない(完了時に呼ぶため残す)
|
|
105
37
|
};
|
|
106
|
-
}, [manager, sessionId
|
|
38
|
+
}, [manager, sessionId]), useCallback(() => manager.getSnapshot(), [manager]),
|
|
107
39
|
// SSR時は安定した空スナップショットを返し、Hydration差分を避ける
|
|
108
40
|
useCallback(() => ({ sessions: new Map() }), []));
|
|
109
41
|
// ハンドラが変わるたびに最新を登録
|