Skip to content

[Admin UI] SchemaEditor crashes to white screen when analyze returns a table without csv_options #11

@ogawsh

Description

@ogawsh

[Admin UI] SchemaEditor crashes to white screen when analyze returns a table without csv_options

概要

Admin UI の analyze 処理後、SchemaEditor が「描画しようとしたテーブルの csv_optionsundefined な場合」にホワイトアウト(白画面)する。
ユーザーには「画面が真っ白になって何も操作できない」としか見えず、analyze 自体は完走している可能性があるのに復帰手段がない。

ブラウザコンソール:

Uncaught TypeError: Cannot read properties of undefined (reading 'delimiter')
  at index-C_F4NM9t.js:264:45372
  at Array.map (<anonymous>)
  at ore (index-C_F4NM9t.js:264:44272)
  ...

再現条件

testcase/M06-manifest-a01-1tb-single/ (1TB / 350 CSV ファイル + 1 manifest)に対して analyze を実行。2 回続けて再現。

他の manifest ケース(M01〜M05、M07/M08)では再現せず。M06 は「manifest の entries が 350 件」という点だけが際立つ。

原因(フロントエンド)

frontend/admin/src/components/SchemaEditor.tsx L99 付近:

<TextField label="delimiter" size="small" value={table.csv_options.delimiter} />

table.csv_optionsundefined のときに落ちる。null-safe ではない。

原因(推定・バックエンド)

lambda/adminwebbackend/app.py の manifest 分岐で Bedrock converse の toolUse 出力を table_def としてそのまま tables に append している。
_TABLE_TOOL_SCHEMA では csv_options は required だが、prompt 肥大化(manifest entries 350 ファイル分のファイル名リスト)で出力トークン不足が起き、tool output が途中で切れて csv_options が欠落する可能性がある。

該当箇所:

# _analyze_single_csv_with_bedrock
if len(group_keys) > 1:
    filenames = "\n".join(f"  - {k.rsplit('/', 1)[-1]}" for k in group_keys)
    user_message += f"\n\nこのテーブルには以下の {len(group_keys)} ファイルがグルーピングされています:\n{filenames}\n..."

350 ファイル × ~30 文字 = 10 KB 超のファイル名リストを prompt に埋め込む。さらに columns[].description が required で 10〜100 カラムぶんの日本語説明を出力させるため、合計トークン数が maxTokens: 8192 を超える可能性。

期待される挙動

フロントエンド:

  • table.csv_optionsundefined でもホワイトアウトせず、デフォルト(空文字)を表示するか、該当テーブルだけ warning を表示する

バックエンド:

  • 大量の manifest entries を扱うとき、ファイル名リストを全件 prompt に含めない(len(group_keys) > N の場合に省略・サンプリング)
  • toolUse 出力のバリデーション(必須フィールド欠落検知)を追加し、欠落時は errors に積むなどのハンドリングを行う

修正方針(フロント側)

SchemaEditor.tsxcsv_options が無い場合のフォールバック:

const csvOpt = table.csv_options ?? { delimiter: ',', quote_char: '"', null_as: '', dateformat: '', timeformat: '' };
// ... value={csvOpt.delimiter} のように参照

さらに columns が空 / undefined の場合も考慮すると安全。

影響

関連情報

  • 対象スタック: arn:aws:cloudformation:ap-northeast-1:411521242467:stack/stagingDwhAgentStack/6d94b460-4105-11f1-a522-0e470ca459d5
  • テストデータ: testcase/M06-manifest-a01-1tb-single/ 配下 sensor_000.csv〜sensor_349.csv + sensor.manifest (entries 350)
  • 比較用 (問題なし): M07 (150 entries) / M08 (30 entries) は同じ manifest 構造で analyze 完走

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions