simple-ai-sdk 1.0.47 → 1.1.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 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/client/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/client/manager.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { generateMessageId } from "../shared/generate-id.js";
2
- import { isAbortError } from "../shared/error-utils.js";
2
+ import { isAbortError, ChatError } from "../shared/error-utils.js";
3
3
  class StreamManager {
4
4
  state = {
5
5
  sessions: new Map(),
@@ -629,15 +629,29 @@ class StreamManager {
629
629
  let finishedReason = null;
630
630
  if (isDonePayload(parsed))
631
631
  finishedReason = toChatFinishReason(parsed.finished_reason);
632
- this.updateSession(sessionId, {
633
- status: "ready",
634
- abortController: null,
635
- finishedReason,
636
- nextAssistantMessageId: null,
637
- }, true);
638
- this.deliverOrQueueFinish(sessionId, {
639
- finishedReason,
640
- });
632
+ if (finishedReason === "content_filter") {
633
+ // content_filter は完了ではなく既知エラーとして扱う
634
+ const err = new ChatError("content_filter");
635
+ this.updateSession(sessionId, {
636
+ status: "error",
637
+ error: err,
638
+ abortController: null,
639
+ finishedReason,
640
+ nextAssistantMessageId: null,
641
+ }, true);
642
+ this.deliverOrQueueError(sessionId, err);
643
+ }
644
+ else {
645
+ this.updateSession(sessionId, {
646
+ status: "ready",
647
+ abortController: null,
648
+ finishedReason,
649
+ nextAssistantMessageId: null,
650
+ }, true);
651
+ this.deliverOrQueueFinish(sessionId, {
652
+ finishedReason,
653
+ });
654
+ }
641
655
  shouldTerminate = true;
642
656
  break;
643
657
  }
@@ -698,13 +712,31 @@ class StreamManager {
698
712
  // 意図: 正常完了(サーバが done を送らないケース)だけをここで処理。
699
713
  // failed=true(error)の場合は既に状態更新済みなので何もしない。
700
714
  if (!failed && !shouldTerminate) {
701
- this.updateSession(sessionId, {
702
- status: "ready",
703
- abortController: null,
704
- finishedReason: null,
705
- nextAssistantMessageId: null,
706
- }, true); // Immediate for status change
707
- this.deliverOrQueueFinish(sessionId, { finishedReason: null }, "completion");
715
+ const s = this.state.sessions.get(sessionId);
716
+ const lastMsg = s?.messages.at(-1);
717
+ const hasAssistantContent = lastMsg !== undefined &&
718
+ lastMsg.role === "assistant" &&
719
+ lastMsg.content.length > 0;
720
+ if (!hasAssistantContent) {
721
+ const err = new ChatError("no_response");
722
+ this.updateSession(sessionId, {
723
+ status: "error",
724
+ error: err,
725
+ abortController: null,
726
+ finishedReason: null,
727
+ nextAssistantMessageId: null,
728
+ }, true);
729
+ this.deliverOrQueueError(sessionId, err);
730
+ }
731
+ else {
732
+ this.updateSession(sessionId, {
733
+ status: "ready",
734
+ abortController: null,
735
+ finishedReason: null,
736
+ nextAssistantMessageId: null,
737
+ }, true); // Immediate for status change
738
+ this.deliverOrQueueFinish(sessionId, { finishedReason: null }, "completion");
739
+ }
708
740
  }
709
741
  }
710
742
  catch (error) {
@@ -715,6 +747,7 @@ class StreamManager {
715
747
  if (s?.status !== "aborted") {
716
748
  this.updateSession(sessionId, {
717
749
  status: "aborted",
750
+ error: new ChatError("aborted"),
718
751
  abortController: null,
719
752
  nextAssistantMessageId: null,
720
753
  }, true); // Immediate for status change
@@ -768,6 +801,7 @@ class StreamManager {
768
801
  // ユーザーによる中断を明示的に示すため status を "aborted" に更新
769
802
  this.updateSession(sessionId, {
770
803
  status: "aborted",
804
+ error: new ChatError("aborted"),
771
805
  abortController: null,
772
806
  nextAssistantMessageId: null,
773
807
  }, true);
@@ -1,2 +1,7 @@
1
1
  export declare function isAbortError(e: unknown): boolean;
2
+ export type ChatErrorCode = "content_filter" | "aborted" | "no_response";
3
+ export declare class ChatError extends Error {
4
+ readonly code: ChatErrorCode;
5
+ constructor(code: ChatErrorCode, message?: string);
6
+ }
2
7
  //# sourceMappingURL=error-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-utils.d.ts","sourceRoot":"","sources":["../../src/shared/error-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAYhD"}
1
+ {"version":3,"file":"error-utils.d.ts","sourceRoot":"","sources":["../../src/shared/error-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAYhD;AAED,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,SAAS,GAAG,aAAa,CAAC;AAEzE,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;gBAEjB,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM;CAKlD"}
@@ -9,3 +9,11 @@ export function isAbortError(e) {
9
9
  "code" in e &&
10
10
  e.code === "ABORT_ERR"));
11
11
  }
12
+ export class ChatError extends Error {
13
+ code;
14
+ constructor(code, message) {
15
+ super(message ?? code);
16
+ this.code = code;
17
+ this.name = "ChatError";
18
+ }
19
+ }
@@ -1,4 +1,5 @@
1
1
  export * from "./types.js";
2
2
  export * from "./wire.js";
3
3
  export * from "./generate-id.js";
4
+ export { isAbortError, ChatError, type ChatErrorCode } from "./error-utils.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from "./types.js";
2
2
  export * from "./wire.js";
3
3
  export * from "./generate-id.js";
4
+ export { isAbortError, ChatError } from "./error-utils.js";
package/dist/spec.md CHANGED
@@ -396,6 +396,10 @@ type UseChatSessionReturn = {
396
396
  */
397
397
  messagesVersion: number
398
398
  status: ChatStatus
399
+ /**
400
+ * 既知ケースでは ChatError が入る(Error のサブクラス)。
401
+ * - code: "content_filter" | "aborted" | "no_response"
402
+ */
399
403
  error: Error | null
400
404
  /**
401
405
  * API を呼ばずに現在のセッションの messages を即時上書きする。
@@ -450,6 +454,9 @@ await Promise.all([
450
454
  - `onFinish` の `details.metadata` は、そのストリーム中に受信したメタデータの最新スナップショットです。
451
455
  - 複数購読時の優先: 同一 `sessionId` を複数コンポーネントが使用する場合、最後に登録された `onFinish` が有効です。
452
456
  - `onError` は per-call: `sendMessage`/`reload` 呼び出し時に渡されたハンドラが呼ばれます(最新保持は行いません)。
457
+ - `content_filter` は完了ではなくエラー扱い: `status: "error"` になり、`onFinish` ではなく `onError` が呼ばれます(`error.code === "content_filter"`)。
458
+ - ユーザー中断は既知エラー扱い: `stop()` または AbortError 由来の中断時は `status: "aborted"` かつ `error.code === "aborted"` になります。
459
+ - サーバが `done` を送らずに終了し assistant 応答が空の場合は `status: "error"` になり、`onError` が呼ばれます(`error.code === "no_response"`)。
453
460
 
454
461
  ### ページ遷移前のセッション事前準備(`usePrefetchChatSession`)
455
462
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simple-ai-sdk",
3
- "version": "1.0.47",
3
+ "version": "1.1.1",
4
4
  "private": false,
5
5
  "description": "Simple AI SDK for Hono / React19+ / OpenAI",
6
6
  "type": "module",
@@ -59,7 +59,9 @@
59
59
  "dev": "tsc --watch",
60
60
  "typecheck": "tsc --noEmit",
61
61
  "lint": "eslint .",
62
+ "pretest": "pnpm build",
62
63
  "test": "node --test test/**/*.test.mjs",
64
+ "test:types": "tsc --project test-types/tsconfig.json --noEmit",
63
65
  "publish-sdk": "npm version patch --no-git-tag-version && pnpm build && pnpm publish --no-git-checks --access public"
64
66
  }
65
67
  }