harry-lu-0708 Cursor commited on
Commit
2b06ef9
Β·
1 Parent(s): 918891b

Rebrand to SciDER, fix subagent output display, disable Reasoning Bank for Streamlit

Browse files

- Rebrand SciEvo to SciDER in streamlit client (app, docs, scripts)
- Replace rocket emoji with apple emoji for Full Workflow
- Persist and display intermediate state (subagent outputs) after rerun
- Fix Full Workflow to return aggregated intermediate state from all phases
- Disable Reasoning Bank when running workflows from Streamlit
- Rename scievo_uploads to scider_uploads, scievo-streamlit to scider-streamlit

Co-authored-by: Cursor <cursoragent@cursor.com>

scievo/workflows/full_workflow_with_ideation.py CHANGED
@@ -86,6 +86,7 @@ class FullWorkflowWithIdeation(BaseModel):
86
  # Ideation results
87
  ideation_summary: str = ""
88
  ideation_papers: list[dict] = []
 
89
  novelty_score: float | None = None
90
  novelty_feedback: str | None = None
91
 
@@ -232,6 +233,7 @@ class FullWorkflowWithIdeation(BaseModel):
232
  # Extract results
233
  self.ideation_summary = result_state.output_summary or ""
234
  self.ideation_papers = result_state.papers
 
235
  self.novelty_score = result_state.novelty_score
236
  self.novelty_feedback = result_state.novelty_feedback
237
 
 
86
  # Ideation results
87
  ideation_summary: str = ""
88
  ideation_papers: list[dict] = []
89
+ ideation_intermediate_state: list[dict] = []
90
  novelty_score: float | None = None
91
  novelty_feedback: str | None = None
92
 
 
233
  # Extract results
234
  self.ideation_summary = result_state.output_summary or ""
235
  self.ideation_papers = result_state.papers
236
+ self.ideation_intermediate_state = result_state.intermediate_state
237
  self.novelty_score = result_state.novelty_score
238
  self.novelty_feedback = result_state.novelty_feedback
239
 
streamlit-client/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # SciEvo Streamlit Chat Interface
2
 
3
- A ChatGPT-like web interface for running the complete SciEvo workflow with real-time progress tracking and intermediate output visualization.
4
 
5
  ## Features
6
 
@@ -33,9 +33,9 @@ Or install streamlit directly:
33
  pip install streamlit
34
  ```
35
 
36
- ### 2. Ensure SciEvo is Set Up
37
 
38
- Make sure you've completed the main SciEvo setup from the parent directory:
39
 
40
  ```bash
41
  cd ..
@@ -252,7 +252,7 @@ pip install streamlit
252
 
253
  ### Import Errors
254
 
255
- Ensure you're running from the correct directory and that the parent SciEvo package is accessible:
256
 
257
  ```bash
258
  cd streamlit-client
@@ -336,4 +336,4 @@ To improve the interface:
336
 
337
  ## License
338
 
339
- Same as parent SciEvo project.
 
1
+ # SciDER Streamlit Chat Interface
2
 
3
+ A ChatGPT-like web interface for running the complete SciDER workflow with real-time progress tracking and intermediate output visualization.
4
 
5
  ## Features
6
 
 
33
  pip install streamlit
34
  ```
35
 
36
+ ### 2. Ensure SciDER is Set Up
37
 
38
+ Make sure you've completed the main SciDER setup from the parent directory:
39
 
40
  ```bash
41
  cd ..
 
252
 
253
  ### Import Errors
254
 
255
+ Ensure you're running from the correct directory and that the parent SciDER package is accessible:
256
 
257
  ```bash
258
  cd streamlit-client
 
336
 
337
  ## License
338
 
339
+ Same as parent SciDER project.
streamlit-client/README_DOCKER.md CHANGED
@@ -1,6 +1,6 @@
1
- # Docker Setup for SciEvo Streamlit Client
2
 
3
- This directory contains Docker configuration files for running the SciEvo Streamlit client in a containerized environment.
4
 
5
  ## Quick Start
6
 
@@ -28,13 +28,13 @@ This directory contains Docker configuration files for running the SciEvo Stream
28
  1. **Build the image**:
29
  ```bash
30
  cd streamlit-client
31
- docker build -t scievo-streamlit:latest -f Dockerfile ..
32
  ```
33
 
34
  2. **Run the container**:
35
  ```bash
36
  docker run -d \
37
- --name scievo-streamlit \
38
  -p 8501:8501 \
39
  -v $(pwd)/case-study-memory:/app/streamlit-client/case-study-memory \
40
  -v $(pwd)/workspace:/app/streamlit-client/workspace \
@@ -42,7 +42,7 @@ This directory contains Docker configuration files for running the SciEvo Stream
42
  -v ../.env:/app/.env:ro \
43
  -e BRAIN_DIR=/app/streamlit-client/tmp_brain \
44
  -e WORKSPACE_PATH=/app/streamlit-client/workspace \
45
- scievo-streamlit:latest
46
  ```
47
 
48
  ## Environment Variables
@@ -80,7 +80,7 @@ ports:
80
 
81
  Make sure your `.env` file is correctly mounted and contains valid API keys. Check the container logs:
82
  ```bash
83
- docker logs scievo-streamlit
84
  ```
85
 
86
  ### Permission issues
 
1
+ # Docker Setup for SciDER Streamlit Client
2
 
3
+ This directory contains Docker configuration files for running the SciDER Streamlit client in a containerized environment.
4
 
5
  ## Quick Start
6
 
 
28
  1. **Build the image**:
29
  ```bash
30
  cd streamlit-client
31
+ docker build -t scider-streamlit:latest -f Dockerfile ..
32
  ```
33
 
34
  2. **Run the container**:
35
  ```bash
36
  docker run -d \
37
+ --name scider-streamlit \
38
  -p 8501:8501 \
39
  -v $(pwd)/case-study-memory:/app/streamlit-client/case-study-memory \
40
  -v $(pwd)/workspace:/app/streamlit-client/workspace \
 
42
  -v ../.env:/app/.env:ro \
43
  -e BRAIN_DIR=/app/streamlit-client/tmp_brain \
44
  -e WORKSPACE_PATH=/app/streamlit-client/workspace \
45
+ scider-streamlit:latest
46
  ```
47
 
48
  ## Environment Variables
 
80
 
81
  Make sure your `.env` file is correctly mounted and contains valid API keys. Check the container logs:
82
  ```bash
83
+ docker logs scider-streamlit
84
  ```
85
 
86
  ### Permission issues
streamlit-client/app.py CHANGED
@@ -26,7 +26,7 @@ from scievo.workflows.data_workflow import DataWorkflow
26
  from scievo.workflows.experiment_workflow import ExperimentWorkflow
27
  from scievo.workflows.full_workflow_with_ideation import FullWorkflowWithIdeation
28
 
29
- st.set_page_config(page_title="SciEvo Chat", layout="centered")
30
 
31
  st.markdown(
32
  """
@@ -212,12 +212,32 @@ def run_full(cfg):
212
  max_revisions=5,
213
  )
214
  w.run()
215
- return w.final_summary or "Workflow finished", []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
 
217
 
218
  def get_upload_temp_dir() -> Path:
219
  """Return temp directory for uploaded files. Clean old dirs on startup."""
220
- base = Path(tempfile.gettempdir()) / "scievo_uploads"
221
  base.mkdir(parents=True, exist_ok=True)
222
  # Clean dirs older than 1 hour (handles closed sessions)
223
  now = time.time()
@@ -262,11 +282,11 @@ def find_data_analysis_file(extract_dir: Path) -> Path | None:
262
 
263
 
264
  def _rm_upload_root(p: Path):
265
- """Remove the scievo_uploads session dir (go up to find it)."""
266
  cur = Path(p).resolve().parent if Path(p).resolve().is_file() else Path(p).resolve()
267
  while cur != cur.parent:
268
  parent = cur.parent
269
- if parent.name == "scievo_uploads":
270
  try:
271
  shutil.rmtree(cur)
272
  except OSError:
@@ -344,9 +364,9 @@ if "default_model" not in st.session_state:
344
  )
345
 
346
  if not st.session_state.api_key:
347
- st.title("SciEvo Research Assistant")
348
  st.warning("API Key Required")
349
- st.markdown("Please provide API keys to use the SciEvo Research Assistant.")
350
 
351
  # Model provider selection
352
  col1, col2 = st.columns(2)
@@ -396,7 +416,7 @@ if not st.session_state.api_key:
396
 
397
  col_title, col_reset = st.columns([5, 1])
398
  with col_title:
399
- st.title("SciEvo Research Assistant")
400
  with col_reset:
401
  if st.button("πŸ”„ Reset", help="Clear all chat history", type="secondary"):
402
  cleanup_uploaded_data()
@@ -464,7 +484,7 @@ if "default_workspace_path" not in st.session_state:
464
  st.session_state.default_workspace_path = Path.cwd() / "workspace"
465
  # If workspace_path points to expired temp upload dir, restore to default
466
  _ws = st.session_state.workspace_path
467
- if isinstance(_ws, (str, Path)) and "scievo_uploads" in str(_ws) and not Path(_ws).exists():
468
  cleanup_uploaded_data()
469
 
470
  if "selected_workflow" not in st.session_state:
@@ -490,7 +510,7 @@ with col3:
490
  st.rerun()
491
 
492
  with col4:
493
- if st.button("πŸš€ Full Workflow", use_container_width=True, key="btn_full"):
494
  st.session_state.selected_workflow = "full"
495
  st.rerun()
496
 
@@ -499,6 +519,9 @@ st.divider()
499
  for m in st.session_state.messages:
500
  with st.chat_message(m["role"]):
501
  st.markdown(m["content"])
 
 
 
502
 
503
  # Workflow input forms
504
  workflow_config = None
@@ -625,7 +648,7 @@ elif st.session_state.selected_workflow == "experiment":
625
 
626
  elif st.session_state.selected_workflow == "full":
627
  with st.form("full_form", clear_on_submit=True):
628
- st.markdown("### πŸš€ Full Workflow")
629
  topic = st.text_input("Research Topic", placeholder="Enter your research topic...")
630
  st.caption("Data (for Data Analysis): upload zip or enter path")
631
  uploaded_full_zip = st.file_uploader(
@@ -733,7 +756,10 @@ if workflow_config:
733
  loading_placeholder.empty()
734
  stream_markdown(resp)
735
  render_intermediate_state(intermediate_state)
736
- st.session_state.messages.append({"role": "assistant", "content": resp})
 
 
 
737
 
738
  metadata = {
739
  "workflow_type": workflow_config["type"],
@@ -813,7 +839,10 @@ if prompt := st.chat_input("Ask a question or select a workflow above"):
813
  loading_placeholder.empty()
814
  stream_markdown(resp)
815
  render_intermediate_state(intermediate_state)
816
- st.session_state.messages.append({"role": "assistant", "content": resp})
 
 
 
817
 
818
  memo_dir = save_chat_history(
819
  st.session_state.messages, workflow_type="ideation", metadata={"query": prompt}
 
26
  from scievo.workflows.experiment_workflow import ExperimentWorkflow
27
  from scievo.workflows.full_workflow_with_ideation import FullWorkflowWithIdeation
28
 
29
+ st.set_page_config(page_title="SciDER Chat", layout="centered")
30
 
31
  st.markdown(
32
  """
 
212
  max_revisions=5,
213
  )
214
  w.run()
215
+
216
+ # Aggregate intermediate state from all phases for subagent output display
217
+ aggregated = []
218
+ for item in w.ideation_intermediate_state:
219
+ aggregated.append({
220
+ "node_name": f"ideation/{item.get('node_name', 'unknown')}",
221
+ "output": item.get("output", ""),
222
+ })
223
+ if w._data_workflow:
224
+ for item in getattr(w._data_workflow, "data_agent_intermediate_state", []) or []:
225
+ aggregated.append({
226
+ "node_name": f"data/{item.get('node_name', 'unknown')}",
227
+ "output": item.get("output", ""),
228
+ })
229
+ if w._experiment_workflow:
230
+ for item in getattr(w._experiment_workflow, "experiment_agent_intermediate_state", []) or []:
231
+ aggregated.append({
232
+ "node_name": f"experiment/{item.get('node_name', 'unknown')}",
233
+ "output": item.get("output", ""),
234
+ })
235
+ return w.final_summary or "Workflow finished", aggregated
236
 
237
 
238
  def get_upload_temp_dir() -> Path:
239
  """Return temp directory for uploaded files. Clean old dirs on startup."""
240
+ base = Path(tempfile.gettempdir()) / "scider_uploads"
241
  base.mkdir(parents=True, exist_ok=True)
242
  # Clean dirs older than 1 hour (handles closed sessions)
243
  now = time.time()
 
282
 
283
 
284
  def _rm_upload_root(p: Path):
285
+ """Remove the scider_uploads session dir (go up to find it)."""
286
  cur = Path(p).resolve().parent if Path(p).resolve().is_file() else Path(p).resolve()
287
  while cur != cur.parent:
288
  parent = cur.parent
289
+ if parent.name == "scider_uploads":
290
  try:
291
  shutil.rmtree(cur)
292
  except OSError:
 
364
  )
365
 
366
  if not st.session_state.api_key:
367
+ st.title("SciDER Research Assistant")
368
  st.warning("API Key Required")
369
+ st.markdown("Please provide API keys to use the SciDER Research Assistant.")
370
 
371
  # Model provider selection
372
  col1, col2 = st.columns(2)
 
416
 
417
  col_title, col_reset = st.columns([5, 1])
418
  with col_title:
419
+ st.title("SciDER Research Assistant")
420
  with col_reset:
421
  if st.button("πŸ”„ Reset", help="Clear all chat history", type="secondary"):
422
  cleanup_uploaded_data()
 
484
  st.session_state.default_workspace_path = Path.cwd() / "workspace"
485
  # If workspace_path points to expired temp upload dir, restore to default
486
  _ws = st.session_state.workspace_path
487
+ if isinstance(_ws, (str, Path)) and "scider_uploads" in str(_ws) and not Path(_ws).exists():
488
  cleanup_uploaded_data()
489
 
490
  if "selected_workflow" not in st.session_state:
 
510
  st.rerun()
511
 
512
  with col4:
513
+ if st.button("🍎 Full Workflow", use_container_width=True, key="btn_full"):
514
  st.session_state.selected_workflow = "full"
515
  st.rerun()
516
 
 
519
  for m in st.session_state.messages:
520
  with st.chat_message(m["role"]):
521
  st.markdown(m["content"])
522
+ # Render subagent intermediate states if persisted (survives st.rerun)
523
+ if m.get("intermediate_state"):
524
+ render_intermediate_state(m["intermediate_state"])
525
 
526
  # Workflow input forms
527
  workflow_config = None
 
648
 
649
  elif st.session_state.selected_workflow == "full":
650
  with st.form("full_form", clear_on_submit=True):
651
+ st.markdown("### 🍎 Full Workflow")
652
  topic = st.text_input("Research Topic", placeholder="Enter your research topic...")
653
  st.caption("Data (for Data Analysis): upload zip or enter path")
654
  uploaded_full_zip = st.file_uploader(
 
756
  loading_placeholder.empty()
757
  stream_markdown(resp)
758
  render_intermediate_state(intermediate_state)
759
+ msg = {"role": "assistant", "content": resp}
760
+ if intermediate_state:
761
+ msg["intermediate_state"] = intermediate_state
762
+ st.session_state.messages.append(msg)
763
 
764
  metadata = {
765
  "workflow_type": workflow_config["type"],
 
839
  loading_placeholder.empty()
840
  stream_markdown(resp)
841
  render_intermediate_state(intermediate_state)
842
+ msg = {"role": "assistant", "content": resp}
843
+ if intermediate_state:
844
+ msg["intermediate_state"] = intermediate_state
845
+ st.session_state.messages.append(msg)
846
 
847
  memo_dir = save_chat_history(
848
  st.session_state.messages, workflow_type="ideation", metadata={"query": prompt}
streamlit-client/display_components.py CHANGED
@@ -124,7 +124,7 @@ def display_progress_updates(updates: list[ProgressUpdate]):
124
 
125
  # Status icon
126
  status_icons = {
127
- "started": "πŸš€",
128
  "progress": "⏳",
129
  "completed": "βœ…",
130
  "error": "❌",
 
124
 
125
  # Status icon
126
  status_icons = {
127
+ "started": "🍎",
128
  "progress": "⏳",
129
  "completed": "βœ…",
130
  "error": "❌",
streamlit-client/docker-compose.yml CHANGED
@@ -5,7 +5,7 @@ services:
5
  build:
6
  context: ..
7
  dockerfile: streamlit-client/Dockerfile
8
- container_name: scievo-streamlit
9
  ports:
10
  - "8501:8501"
11
  volumes:
 
5
  build:
6
  context: ..
7
  dockerfile: streamlit-client/Dockerfile
8
+ container_name: scider-streamlit
9
  ports:
10
  - "8501:8501"
11
  volumes:
streamlit-client/example_config.yaml CHANGED
@@ -1,4 +1,4 @@
1
- # Example Configuration for SciEvo Workflows
2
  # Copy and modify these settings as needed
3
 
4
  # ==================== Example 1: Ideation Only ====================
 
1
+ # Example Configuration for SciDER Workflows
2
  # Copy and modify these settings as needed
3
 
4
  # ==================== Example 1: Ideation Only ====================
streamlit-client/run.bat CHANGED
@@ -1,5 +1,5 @@
1
  @echo off
2
- REM Quick start script for SciEvo Streamlit Interface (Windows)
3
 
4
  REM Check if streamlit is installed
5
  where streamlit >nul 2>nul
@@ -16,7 +16,7 @@ if not exist "..\\.env" (
16
  pause
17
  )
18
 
19
- echo Starting SciEvo Streamlit Interface...
20
  echo.
21
  echo Choose version:
22
  echo 1) Enhanced (recommended) - Real-time progress tracking
 
1
  @echo off
2
+ REM Quick start script for SciDER Streamlit Interface (Windows)
3
 
4
  REM Check if streamlit is installed
5
  where streamlit >nul 2>nul
 
16
  pause
17
  )
18
 
19
+ echo Starting SciDER Streamlit Interface...
20
  echo.
21
  echo Choose version:
22
  echo 1) Enhanced (recommended) - Real-time progress tracking
streamlit-client/run.sh CHANGED
@@ -1,5 +1,5 @@
1
  #!/bin/bash
2
- # Quick start script for SciEvo Streamlit Interface
3
 
4
  # Check if streamlit is installed
5
  if ! command -v streamlit &> /dev/null
@@ -16,7 +16,7 @@ if [ ! -f "../.env" ]; then
16
  read -p "Press enter to continue anyway or Ctrl+C to exit..."
17
  fi
18
 
19
- echo "πŸš€ Starting SciEvo Streamlit Interface..."
20
  echo ""
21
  echo "Choose version:"
22
  echo "1) Enhanced (recommended) - Real-time progress tracking"
 
1
  #!/bin/bash
2
+ # Quick start script for SciDER Streamlit Interface
3
 
4
  # Check if streamlit is installed
5
  if ! command -v streamlit &> /dev/null
 
16
  read -p "Press enter to continue anyway or Ctrl+C to exit..."
17
  fi
18
 
19
+ echo "🍎 Starting SciDER Streamlit Interface..."
20
  echo ""
21
  echo "Choose version:"
22
  echo "1) Enhanced (recommended) - Real-time progress tracking"
streamlit-client/test_setup.py CHANGED
@@ -1,6 +1,6 @@
1
  #!/usr/bin/env python3
2
  """
3
- Test Setup Script for SciEvo Streamlit Interface
4
 
5
  This script validates that all dependencies and configurations are correct.
6
  """
@@ -28,9 +28,9 @@ def test_imports():
28
  try:
29
  from scievo.workflows.full_workflow_with_ideation import FullWorkflowWithIdeation
30
 
31
- print(" βœ… SciEvo workflow imported successfully")
32
  except ImportError as e:
33
- print(f" ❌ SciEvo import failed: {e}")
34
  print(" Fix: Ensure parent directory is set up correctly")
35
  return False
36
 
@@ -38,9 +38,9 @@ def test_imports():
38
  from scievo.core.brain import Brain
39
  from scievo.core.llms import ModelRegistry
40
 
41
- print(" βœ… SciEvo core modules imported successfully")
42
  except ImportError as e:
43
- print(f" ❌ SciEvo core import failed: {e}")
44
  return False
45
 
46
  return True
@@ -129,7 +129,7 @@ def test_streamlit_files():
129
  def main():
130
  """Run all tests."""
131
  print("=" * 60)
132
- print("SciEvo Streamlit Interface - Setup Validation")
133
  print("=" * 60)
134
 
135
  tests = [
 
1
  #!/usr/bin/env python3
2
  """
3
+ Test Setup Script for SciDER Streamlit Interface
4
 
5
  This script validates that all dependencies and configurations are correct.
6
  """
 
28
  try:
29
  from scievo.workflows.full_workflow_with_ideation import FullWorkflowWithIdeation
30
 
31
+ print(" βœ… SciDER workflow imported successfully")
32
  except ImportError as e:
33
+ print(f" ❌ SciDER import failed: {e}")
34
  print(" Fix: Ensure parent directory is set up correctly")
35
  return False
36
 
 
38
  from scievo.core.brain import Brain
39
  from scievo.core.llms import ModelRegistry
40
 
41
+ print(" βœ… SciDER core modules imported successfully")
42
  except ImportError as e:
43
+ print(f" ❌ SciDER core import failed: {e}")
44
  return False
45
 
46
  return True
 
129
  def main():
130
  """Run all tests."""
131
  print("=" * 60)
132
+ print("SciDER Streamlit Interface - Setup Validation")
133
  print("=" * 60)
134
 
135
  tests = [