simple-ai-sdk 1.0.42 → 1.0.45
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/manager.d.ts
CHANGED
|
@@ -65,9 +65,9 @@ declare class StreamManager implements IStreamManager {
|
|
|
65
65
|
private state;
|
|
66
66
|
private listeners;
|
|
67
67
|
private rafScheduled;
|
|
68
|
+
private pendingStateClone;
|
|
68
69
|
private rafId;
|
|
69
70
|
private rafFallbackTimer;
|
|
70
|
-
private pendingStateClone;
|
|
71
71
|
private getRAF;
|
|
72
72
|
private getCAF;
|
|
73
73
|
private maxSessions;
|
|
@@ -85,8 +85,9 @@ declare class StreamManager implements IStreamManager {
|
|
|
85
85
|
setOnFinishHandler(sessionId: string, handler: OnChatFinishCallback | undefined): void;
|
|
86
86
|
setOnErrorHandler(sessionId: string, handler: ((error: Error) => void) | undefined): void;
|
|
87
87
|
getSnapshot(): StreamManagerState;
|
|
88
|
-
private materializeSnapshotIfNeeded;
|
|
89
88
|
private notify;
|
|
89
|
+
private cloneStateForNotification;
|
|
90
|
+
private emitListeners;
|
|
90
91
|
getSession(sessionId: string): ChatSession | undefined;
|
|
91
92
|
touchSession(sessionId: string): void;
|
|
92
93
|
private getMessagesSnapshot;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/client/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EAEpB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAC;AAK9E,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,IAAI,CAAC;IACvD,WAAW,IAAI,kBAAkB,CAAC;IAClC;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IACvD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClE;;;;OAIG;IACH,kBAAkB,CAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,oBAAoB,GAAG,SAAS,GACxC,IAAI,CAAC;IACR;;OAEG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,GAC5C,IAAI,CAAC;IACR;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC;;;OAGG;IACH,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,IAAI,CAAC;IACR,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;KAClC,GACA,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;;OAEG;IACH,cAAc,IAAI,IAAI,CAAC;IACvB;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,cAAM,aAAc,YAAW,cAAc;IAC3C,OAAO,CAAC,KAAK,CAEX;IAEF,OAAO,CAAC,SAAS,CAAoC;IAGrD,OAAO,CAAC,YAAY,CAAS;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/client/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/client/manager.js
CHANGED
|
@@ -8,10 +8,10 @@ class StreamManager {
|
|
|
8
8
|
// setTimeout の戻り値型に依存しないための型指定
|
|
9
9
|
// rAF-based batching for frequent updates
|
|
10
10
|
rafScheduled = false;
|
|
11
|
+
// rAF バッチ中に state 複製を遅延し、flush 直前に 1 回だけ実施する
|
|
12
|
+
pendingStateClone = false;
|
|
11
13
|
rafId = null;
|
|
12
14
|
rafFallbackTimer = null;
|
|
13
|
-
// updateSession 後のスナップショット確定を遅延し、flush 時に 1 回だけ clone する
|
|
14
|
-
pendingStateClone = false;
|
|
15
15
|
// Typed accessors for rAF/cAF without relying on DOM types
|
|
16
16
|
getRAF() {
|
|
17
17
|
// If the page is hidden, avoid rAF because it can be throttled heavily
|
|
@@ -125,20 +125,9 @@ class StreamManager {
|
|
|
125
125
|
}
|
|
126
126
|
// リスナーに状態変更を通知する
|
|
127
127
|
// immediate=true の場合は即座に、false の場合は rAF で 1 フレームにまとめて通知
|
|
128
|
-
materializeSnapshotIfNeeded() {
|
|
129
|
-
if (!this.pendingStateClone)
|
|
130
|
-
return;
|
|
131
|
-
// useSyncExternalStore 向けに state / sessions の参照を更新して変更を可視化
|
|
132
|
-
this.state = {
|
|
133
|
-
...this.state,
|
|
134
|
-
sessions: new Map(this.state.sessions),
|
|
135
|
-
};
|
|
136
|
-
this.pendingStateClone = false;
|
|
137
|
-
}
|
|
138
128
|
notify(immediate = false) {
|
|
139
|
-
// 更新が発生したことを記録。実際の clone は flush 直前にまとめて 1 回だけ実施する。
|
|
140
|
-
this.pendingStateClone = true;
|
|
141
129
|
if (immediate) {
|
|
130
|
+
this.cloneStateForNotification();
|
|
142
131
|
// 重要な状態変更(ステータス変更など)は即座に通知
|
|
143
132
|
if (this.rafId != null) {
|
|
144
133
|
const caf = this.getCAF();
|
|
@@ -157,21 +146,13 @@ class StreamManager {
|
|
|
157
146
|
this.rafFallbackTimer = null;
|
|
158
147
|
}
|
|
159
148
|
this.rafScheduled = false;
|
|
160
|
-
this.
|
|
161
|
-
this.
|
|
162
|
-
try {
|
|
163
|
-
listener();
|
|
164
|
-
}
|
|
165
|
-
catch (err) {
|
|
166
|
-
// 重要: 1つの購読者の例外で全体の通知が止まらないように防御
|
|
167
|
-
if (this.debug)
|
|
168
|
-
console.warn("[SM] listener error (immediate)", err);
|
|
169
|
-
}
|
|
170
|
-
});
|
|
149
|
+
this.pendingStateClone = false;
|
|
150
|
+
this.emitListeners("immediate");
|
|
171
151
|
}
|
|
172
152
|
else {
|
|
173
153
|
// ストリーミング中の頻繁な更新は rAF で 1 フレームにまとめる。
|
|
174
|
-
//
|
|
154
|
+
// state 複製は flush 直前まで遅延する。
|
|
155
|
+
this.pendingStateClone = true;
|
|
175
156
|
if (this.rafScheduled)
|
|
176
157
|
return;
|
|
177
158
|
this.rafScheduled = true;
|
|
@@ -180,16 +161,11 @@ class StreamManager {
|
|
|
180
161
|
this.rafId = raf(() => {
|
|
181
162
|
this.rafId = null;
|
|
182
163
|
this.rafScheduled = false;
|
|
183
|
-
this.
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
catch (err) {
|
|
189
|
-
if (this.debug)
|
|
190
|
-
console.warn("[SM] listener error (rAF)", err);
|
|
191
|
-
}
|
|
192
|
-
});
|
|
164
|
+
if (this.pendingStateClone) {
|
|
165
|
+
this.cloneStateForNotification();
|
|
166
|
+
this.pendingStateClone = false;
|
|
167
|
+
}
|
|
168
|
+
this.emitListeners("rAF");
|
|
193
169
|
});
|
|
194
170
|
}
|
|
195
171
|
else {
|
|
@@ -197,20 +173,35 @@ class StreamManager {
|
|
|
197
173
|
this.rafFallbackTimer = setTimeout(() => {
|
|
198
174
|
this.rafFallbackTimer = null;
|
|
199
175
|
this.rafScheduled = false;
|
|
200
|
-
this.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
catch (err) {
|
|
206
|
-
if (this.debug)
|
|
207
|
-
console.warn("[SM] listener error (timer)", err);
|
|
208
|
-
}
|
|
209
|
-
});
|
|
176
|
+
if (this.pendingStateClone) {
|
|
177
|
+
this.cloneStateForNotification();
|
|
178
|
+
this.pendingStateClone = false;
|
|
179
|
+
}
|
|
180
|
+
this.emitListeners("timer");
|
|
210
181
|
}, 16);
|
|
211
182
|
}
|
|
212
183
|
}
|
|
213
184
|
}
|
|
185
|
+
cloneStateForNotification() {
|
|
186
|
+
// 新しい state オブジェクトを作成して参照を変更。
|
|
187
|
+
// これにより useSyncExternalStore が変更を検知できる。
|
|
188
|
+
this.state = {
|
|
189
|
+
...this.state,
|
|
190
|
+
sessions: new Map(this.state.sessions),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
emitListeners(mode) {
|
|
194
|
+
this.listeners.forEach((listener) => {
|
|
195
|
+
try {
|
|
196
|
+
listener();
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
// 重要: 1つの購読者の例外で全体の通知が止まらないように防御
|
|
200
|
+
if (this.debug)
|
|
201
|
+
console.warn(`[SM] listener error (${mode})`, err);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
214
205
|
getSession(sessionId) {
|
|
215
206
|
// 読み取り専用: lastAccessed を更新しない
|
|
216
207
|
// (アクセス時間の更新は touchSession() 側で明示的に実施するポリシー)
|
|
@@ -536,8 +527,8 @@ class StreamManager {
|
|
|
536
527
|
content: "",
|
|
537
528
|
};
|
|
538
529
|
// 配列の再構築コストを下げるため、最初に一度だけ配列を作り
|
|
539
|
-
// 以降は assistantMessage
|
|
540
|
-
//
|
|
530
|
+
// 以降は assistantMessage の content を更新していく
|
|
531
|
+
// (Map 自体の参照を変えて通知するため、参照が同一でも UI は更新される)
|
|
541
532
|
const updatedMessages = [...messages, assistantMessage];
|
|
542
533
|
this.updateSession(sessionId, {
|
|
543
534
|
messages: updatedMessages,
|
|
@@ -577,12 +568,12 @@ class StreamManager {
|
|
|
577
568
|
assistantMessage.content += parsed.text;
|
|
578
569
|
// 最初のテキストチャンクは即時反映して初動レイテンシを下げる
|
|
579
570
|
if (wasEmpty) {
|
|
580
|
-
this.updateSession(sessionId, { messages: updatedMessages }, true);
|
|
571
|
+
this.updateSession(sessionId, { messages: [...updatedMessages] }, true);
|
|
581
572
|
}
|
|
582
573
|
else {
|
|
583
|
-
// 以降は rAF
|
|
574
|
+
// 以降は rAF バッチで配列参照を更新
|
|
584
575
|
this.updateSession(sessionId, {
|
|
585
|
-
messages: updatedMessages,
|
|
576
|
+
messages: [...updatedMessages],
|
|
586
577
|
});
|
|
587
578
|
}
|
|
588
579
|
}
|
|
@@ -600,7 +591,7 @@ class StreamManager {
|
|
|
600
591
|
if (parsed.customData !== undefined) {
|
|
601
592
|
assistantMessage.customData = parsed.customData;
|
|
602
593
|
this.updateSession(sessionId, {
|
|
603
|
-
messages: updatedMessages,
|
|
594
|
+
messages: [...updatedMessages],
|
|
604
595
|
});
|
|
605
596
|
}
|
|
606
597
|
}
|
|
@@ -860,6 +851,7 @@ class StreamManager {
|
|
|
860
851
|
this.rafFallbackTimer = null;
|
|
861
852
|
}
|
|
862
853
|
this.rafScheduled = false;
|
|
854
|
+
this.pendingStateClone = false;
|
|
863
855
|
if (this.sweepTimer) {
|
|
864
856
|
clearInterval(this.sweepTimer);
|
|
865
857
|
this.sweepTimer = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createChatHandler.d.ts","sourceRoot":"","sources":["../../src/server/createChatHandler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EAGb,iBAAiB,EAIlB,MAAM,YAAY,CAAC;AAMpB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"createChatHandler.d.ts","sourceRoot":"","sources":["../../src/server/createChatHandler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EAGb,iBAAiB,EAIlB,MAAM,YAAY,CAAC;AAMpB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,iBAAiB,CA2f3E"}
|
|
@@ -214,7 +214,11 @@ export function createChatHandler(options) {
|
|
|
214
214
|
// Establish stream for this provider
|
|
215
215
|
chatStream = await config.openai.chat.completions.create({
|
|
216
216
|
model: config.model,
|
|
217
|
-
|
|
217
|
+
// idは不要(groqだとidがあるとエラーになる)
|
|
218
|
+
messages: messages.map(({ role, content }) => ({
|
|
219
|
+
role,
|
|
220
|
+
content,
|
|
221
|
+
})),
|
|
218
222
|
temperature: config.temperatureUnsupported
|
|
219
223
|
? undefined
|
|
220
224
|
: options.temperature,
|
|
@@ -295,7 +299,9 @@ export function createChatHandler(options) {
|
|
|
295
299
|
console.log(`[cch] throttle: ${JSON.stringify(throttleSettings)}`);
|
|
296
300
|
previousThrottle = throttleSettings;
|
|
297
301
|
}
|
|
298
|
-
const payload = {
|
|
302
|
+
const payload = {
|
|
303
|
+
text: deltaToSend,
|
|
304
|
+
};
|
|
299
305
|
if (metas.length > 0)
|
|
300
306
|
payload.meta = metas;
|
|
301
307
|
if (customData !== undefined)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "simple-ai-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.45",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Simple AI SDK for Hono / React19+ / OpenAI",
|
|
6
6
|
"type": "module",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"openai": "^
|
|
28
|
+
"openai": "^6.18.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@eslint/js": "^9.34.0",
|