matt1847 Claude Opus 4.5 commited on
Commit
b4e822f
·
1 Parent(s): c8db51a

修正: 初期画面の空白表示とGPU必須モデルの除外

Browse files

- 結果がない初期状態では空白コンテナを非表示
- GPU必須モデル(7B以上)を選択肢から除外
- 生成中にスピナー表示を追加

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

src/ui/streamlit/components.py CHANGED
@@ -3,13 +3,22 @@ UIコンポーネント
3
 
4
  再利用可能なUIコンポーネントを提供する
5
  """
6
- from typing import Optional
7
 
8
  import streamlit as st
9
 
10
  from ...models.registry import ModelRegistry, DEFAULT_MODEL_KEY
11
 
12
 
 
 
 
 
 
 
 
 
 
13
  def render_model_selector() -> str:
14
  """
15
  モデル選択UIをレンダリング
@@ -17,8 +26,9 @@ def render_model_selector() -> str:
17
  Returns:
18
  選択されたモデルのキー
19
  """
20
- # 利用可能なモデル一覧を取得
21
- model_keys = ModelRegistry.list_models()
 
22
  configs = ModelRegistry.get_all_configs()
23
 
24
  # 表示名とキーのマッピング
 
3
 
4
  再利用可能なUIコンポーネントを提供する
5
  """
6
+ from typing import Optional, Set
7
 
8
  import streamlit as st
9
 
10
  from ...models.registry import ModelRegistry, DEFAULT_MODEL_KEY
11
 
12
 
13
+ # GPU必須モデル(CPUでは動作しない)
14
+ GPU_REQUIRED_MODELS: Set[str] = {
15
+ "gpt-oss-20b", # 21B - 16GB VRAM必要
16
+ "olmo-7b", # 7B - 14GB VRAM必要
17
+ "mistral-7b", # 7B - 14GB VRAM必要
18
+ "llama-3.2-3b", # 3B - 6GB VRAM必要
19
+ }
20
+
21
+
22
  def render_model_selector() -> str:
23
  """
24
  モデル選択UIをレンダリング
 
26
  Returns:
27
  選択されたモデルのキー
28
  """
29
+ # 利用可能なモデル一覧を取得(GPU必須モデルを除外)
30
+ all_model_keys = ModelRegistry.list_models()
31
+ model_keys = [k for k in all_model_keys if k not in GPU_REQUIRED_MODELS]
32
  configs = ModelRegistry.get_all_configs()
33
 
34
  # 表示名とキーのマッピング
src/ui/streamlit/pages/generate.py CHANGED
@@ -42,6 +42,7 @@ def render_generate_page() -> None:
42
  st.session_state.debris = None
43
  st.session_state.seed = None
44
  st.session_state.signal_img = None
 
45
 
46
  # LISTENボタン
47
  col1, col2, col3 = st.columns([1, 1, 1])
@@ -49,23 +50,25 @@ def render_generate_page() -> None:
49
  clicked = st.button("LISTEN", key="listen_btn", use_container_width=True)
50
 
51
  if clicked:
52
- # モデルとジェネレータの取得
53
- model = _get_model(selected_model_key)
54
- generator = DebrisGenerator(model)
55
- visualizer = SignalVisualizer()
 
56
 
57
- # デブリ生成
58
- result = generator.generate()
59
 
60
- # 結果をセッション状態に保存
61
- st.session_state.debris = result.debris
62
- st.session_state.seed = result.seed
63
- st.session_state.signal_img = visualizer.generate_image(
64
- result.noise, result.corrupted_logits
65
- )
 
66
 
67
- # 結果の表示
68
- if st.session_state.debris:
69
  st.markdown(
70
  f'''
71
  <div class="debris-container">
 
42
  st.session_state.debris = None
43
  st.session_state.seed = None
44
  st.session_state.signal_img = None
45
+ st.session_state.has_result = False
46
 
47
  # LISTENボタン
48
  col1, col2, col3 = st.columns([1, 1, 1])
 
50
  clicked = st.button("LISTEN", key="listen_btn", use_container_width=True)
51
 
52
  if clicked:
53
+ with st.spinner("Generating..."):
54
+ # モデルとジェネレータの取得
55
+ model = _get_model(selected_model_key)
56
+ generator = DebrisGenerator(model)
57
+ visualizer = SignalVisualizer()
58
 
59
+ # デブリ生成
60
+ result = generator.generate()
61
 
62
+ # 結果をセッション状態に保存
63
+ st.session_state.debris = result.debris
64
+ st.session_state.seed = result.seed
65
+ st.session_state.signal_img = visualizer.generate_image(
66
+ result.noise, result.corrupted_logits
67
+ )
68
+ st.session_state.has_result = True
69
 
70
+ # 結果の表示(結果がある場合のみ)
71
+ if st.session_state.get("has_result", False) and st.session_state.debris:
72
  st.markdown(
73
  f'''
74
  <div class="debris-container">