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.
@@ -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":"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"}
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,EAIrB,MAAM,YAAY,CAAC;AAuEpB,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,qBAAqB,GAC7B,oBAAoB,CAkMtB"}
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, throttleMs } = options;
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
- // throttle 状態を初期化
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, throttleMs]), useCallback(() => manager.getSnapshot(), [manager]),
38
+ }, [manager, sessionId]), useCallback(() => manager.getSnapshot(), [manager]),
107
39
  // SSR時は安定した空スナップショットを返し、Hydration差分を避ける
108
40
  useCallback(() => ({ sessions: new Map() }), []));
109
41
  // ハンドラが変わるたびに最新を登録
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simple-ai-sdk",
3
- "version": "1.0.37",
3
+ "version": "1.0.38",
4
4
  "private": false,
5
5
  "description": "Simple AI SDK for Hono / React19+ / OpenAI",
6
6
  "type": "module",