flashstudio 0.1.9__tar.gz → 0.2.0__tar.gz

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.

Potentially problematic release.


This version of flashstudio might be problematic. Click here for more details.

Files changed (109) hide show
  1. {flashstudio-0.1.9 → flashstudio-0.2.0}/PKG-INFO +1 -1
  2. {flashstudio-0.1.9 → flashstudio-0.2.0}/README.md +15 -13
  3. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/launcher.py +61 -36
  4. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio.egg-info/PKG-INFO +1 -1
  5. {flashstudio-0.1.9 → flashstudio-0.2.0}/pyproject.toml +1 -1
  6. {flashstudio-0.1.9 → flashstudio-0.2.0}/README_PYPI.md +0 -0
  7. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/__init__.py +0 -0
  8. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/app.py +0 -0
  9. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/cli.py +0 -0
  10. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/components/__init__.py +0 -0
  11. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/components/project_manager.py +0 -0
  12. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/components/sidebar.py +0 -0
  13. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/components/styles.py +0 -0
  14. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/components/wizard.py +0 -0
  15. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/components/zone_drawer/__init__.py +0 -0
  16. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/constants.py +0 -0
  17. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/core/__init__.py +0 -0
  18. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/core/constants.py +0 -0
  19. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/__init__.py +0 -0
  20. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/__init__.py +0 -0
  21. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/_common.py +0 -0
  22. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/overview/__init__.py +0 -0
  23. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/overview/metrics.py +0 -0
  24. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/overview/pipeline_status.py +0 -0
  25. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/overview/project_banner.py +0 -0
  26. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/overview/quick_actions.py +0 -0
  27. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/overview/recent_runs.py +0 -0
  28. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/overview/tab.py +0 -0
  29. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/dashboard/page.py +0 -0
  30. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/__init__.py +0 -0
  31. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/_common.py +0 -0
  32. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/download/__init__.py +0 -0
  33. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/download/tab.py +0 -0
  34. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/helpers.py +0 -0
  35. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/page.py +0 -0
  36. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/preview/__init__.py +0 -0
  37. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/preview/tab.py +0 -0
  38. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/upload/__init__.py +0 -0
  39. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/upload/tab.py +0 -0
  40. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/verify/__init__.py +0 -0
  41. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/data/verify/tab.py +0 -0
  42. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/export/__init__.py +0 -0
  43. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/export/page.py +0 -0
  44. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/export/weights/__init__.py +0 -0
  45. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/export/weights/exporter.py +0 -0
  46. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/export/weights/settings.py +0 -0
  47. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/__init__.py +0 -0
  48. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/_common.py +0 -0
  49. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/data/__init__.py +0 -0
  50. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/data/tab.py +0 -0
  51. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/model/__init__.py +0 -0
  52. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/model/tab.py +0 -0
  53. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/page.py +0 -0
  54. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/run/__init__.py +0 -0
  55. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/run/detection.py +0 -0
  56. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/run/tab.py +0 -0
  57. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/run/video.py +0 -0
  58. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/solution/__init__.py +0 -0
  59. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/inference/solution/tab.py +0 -0
  60. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/__init__.py +0 -0
  61. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/_common.py +0 -0
  62. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/advanced/__init__.py +0 -0
  63. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/advanced/tab.py +0 -0
  64. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/architecture/__init__.py +0 -0
  65. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/architecture/tab.py +0 -0
  66. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/augment/__init__.py +0 -0
  67. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/augment/tab.py +0 -0
  68. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/hyperparams/__init__.py +0 -0
  69. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/hyperparams/tab.py +0 -0
  70. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/page.py +0 -0
  71. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/utils/__init__.py +0 -0
  72. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/model/utils/config.py +0 -0
  73. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/__init__.py +0 -0
  74. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/_common.py +0 -0
  75. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/launch/__init__.py +0 -0
  76. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/launch/controls.py +0 -0
  77. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/launch/dialogs.py +0 -0
  78. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/launch/preflight.py +0 -0
  79. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/launch/runner.py +0 -0
  80. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/launch/tab.py +0 -0
  81. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/__init__.py +0 -0
  82. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/checkpoints.py +0 -0
  83. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/curves.py +0 -0
  84. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/dashboard.py +0 -0
  85. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/gt_verification.py +0 -0
  86. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/log_viewer.py +0 -0
  87. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/parsers.py +0 -0
  88. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/run_meta.py +0 -0
  89. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/tab.py +0 -0
  90. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/monitor/visualizations.py +0 -0
  91. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/pages/training/page.py +0 -0
  92. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/utils/__init__.py +0 -0
  93. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/utils/config.py +0 -0
  94. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/utils/device.py +0 -0
  95. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/utils/filesystem.py +0 -0
  96. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/utils/jobs.py +0 -0
  97. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio/utils/training_hooks.py +0 -0
  98. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio.egg-info/SOURCES.txt +0 -0
  99. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio.egg-info/dependency_links.txt +0 -0
  100. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio.egg-info/entry_points.txt +0 -0
  101. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio.egg-info/requires.txt +0 -0
  102. {flashstudio-0.1.9 → flashstudio-0.2.0}/flashstudio.egg-info/top_level.txt +0 -0
  103. {flashstudio-0.1.9 → flashstudio-0.2.0}/setup.cfg +0 -0
  104. {flashstudio-0.1.9 → flashstudio-0.2.0}/tests/test_app.py +0 -0
  105. {flashstudio-0.1.9 → flashstudio-0.2.0}/tests/test_cli.py +0 -0
  106. {flashstudio-0.1.9 → flashstudio-0.2.0}/tests/test_constants.py +0 -0
  107. {flashstudio-0.1.9 → flashstudio-0.2.0}/tests/test_launcher.py +0 -0
  108. {flashstudio-0.1.9 → flashstudio-0.2.0}/tests/test_pipeline_flow.py +0 -0
  109. {flashstudio-0.1.9 → flashstudio-0.2.0}/tests/test_save_dir_compat.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flashstudio
3
- Version: 0.1.9
3
+ Version: 0.2.0
4
4
  Summary: Interactive Training & Inference UI for FlashDet — runs on Google Colab
5
5
  Author: FlashVision
6
6
  License: Apache-2.0
@@ -287,33 +287,35 @@ FlashStudio/
287
287
 
288
288
  ## Troubleshooting
289
289
 
290
- ### Colab: "localhost can't be reached"
290
+ ### Colab: "localhost can't be reached" or ngrok error
291
291
 
292
- This means the tunnel didn't connect. Try running in a new cell:
292
+ `launch()` uses Colab's built-in proxy automatically. If it doesn't work, run this in a **new cell**:
293
293
 
294
294
  ```python
295
+ import subprocess, sys, time
296
+
297
+ proc = subprocess.Popen(
298
+ [sys.executable, "-m", "streamlit", "run",
299
+ __import__('flashstudio.launcher', fromlist=['_get_app_path'])._get_app_path(),
300
+ "--server.port", "8501", "--server.headless", "true",
301
+ "--server.enableCORS", "false", "--server.enableXsrfProtection", "false"],
302
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE
303
+ )
304
+ time.sleep(5)
305
+
295
306
  from google.colab.output import eval_js
296
- print(eval_js('google.colab.kernel.proxyPort(8501)'))
307
+ print(eval_js("google.colab.kernel.proxyPort(8501)"))
297
308
  ```
298
309
 
299
- Open the printed URL in a new tab.
310
+ Open the printed URL in a new tab. No token or signup needed.
300
311
 
301
312
  ### Streamlit port already in use
302
313
 
303
314
  ```bash
304
- # Kill existing Streamlit processes
305
315
  pkill -f "streamlit run"
306
-
307
- # Then restart
308
316
  flashstudio --port 8501
309
317
  ```
310
318
 
311
- ### `ModuleNotFoundError: No module named 'flashdet'`
312
-
313
- ```bash
314
- pip install flashdet
315
- ```
316
-
317
319
  ---
318
320
 
319
321
  ## Requirements
@@ -55,14 +55,19 @@ def launch(port: int = 8501, share: bool = True, ngrok_token: str | None = None)
55
55
  app_path = _get_app_path()
56
56
 
57
57
  if is_colab():
58
- _launch_colab(app_path, port, share, ngrok_token)
58
+ return _launch_colab(app_path, port, share, ngrok_token)
59
59
  else:
60
60
  _launch_local(app_path, port)
61
+ return None
61
62
 
62
63
 
63
64
  def _launch_colab(app_path: str, port: int, share: bool, ngrok_token: str | None):
64
65
  """Launch in Google Colab with automatic tunnel detection."""
65
66
  import time as _time
67
+ import urllib.request
68
+ import urllib.error
69
+
70
+ print(" Starting FlashStudio...", end="", flush=True)
66
71
 
67
72
  proc = subprocess.Popen(
68
73
  [sys.executable, "-m", "streamlit", "run", app_path,
@@ -74,28 +79,47 @@ def _launch_colab(app_path: str, port: int, share: bool, ngrok_token: str | None
74
79
  stderr=subprocess.PIPE,
75
80
  )
76
81
 
77
- _time.sleep(3)
82
+ # Wait until Streamlit is actually responding (up to 30s)
83
+ ready = False
84
+ for i in range(30):
85
+ _time.sleep(1)
86
+ if proc.poll() is not None:
87
+ _, stderr = proc.communicate()
88
+ err_msg = stderr.decode("utf-8", errors="replace")[-500:] if stderr else "Unknown error"
89
+ print(f"\n\n FlashStudio failed to start:\n {err_msg}")
90
+ return proc
91
+ try:
92
+ urllib.request.urlopen(f"http://localhost:{port}/_stcore/health", timeout=2)
93
+ ready = True
94
+ break
95
+ except Exception:
96
+ print(".", end="", flush=True)
97
+
98
+ if ready:
99
+ print(" Ready!")
100
+ else:
101
+ print(" (still loading, URL may take a moment)")
78
102
 
79
103
  public_url = None
80
104
 
81
105
  # Method 1: Colab's built-in proxy (simplest, no install needed)
106
+ try:
107
+ from google.colab.output import eval_js
108
+ result = eval_js(f"google.colab.kernel.proxyPort({port})")
109
+ if result and str(result).startswith("http"):
110
+ public_url = str(result)
111
+ except Exception:
112
+ pass
113
+
114
+ # Method 2: ngrok (only if token is provided)
82
115
  if not public_url:
83
- try:
84
- from google.colab.output import eval_js
85
- public_url = str(eval_js(f"google.colab.kernel.proxyPort({port})"))
86
- except Exception:
87
- pass
88
-
89
- # Method 2: ngrok (if token provided or pyngrok available)
90
- if not public_url and share:
91
116
  token = ngrok_token or os.environ.get("NGROK_TOKEN", "")
92
- try:
93
- from pyngrok import ngrok, conf
94
- if token:
117
+ if token:
118
+ try:
119
+ from pyngrok import ngrok, conf
95
120
  conf.get_default().auth_token = token
96
- public_url = str(ngrok.connect(port, "http"))
97
- except ImportError:
98
- if token:
121
+ public_url = str(ngrok.connect(port, "http"))
122
+ except ImportError:
99
123
  try:
100
124
  subprocess.check_call(
101
125
  [sys.executable, "-m", "pip", "install", "-q", "pyngrok"],
@@ -106,22 +130,8 @@ def _launch_colab(app_path: str, port: int, share: bool, ngrok_token: str | None
106
130
  public_url = str(ngrok.connect(port, "http"))
107
131
  except Exception:
108
132
  pass
109
- except Exception:
110
- pass
111
-
112
- # Method 3: localtunnel (no auth needed)
113
- if not public_url and share:
114
- try:
115
- lt_proc = subprocess.run(
116
- ["npx", "localtunnel", "--port", str(port)],
117
- capture_output=True, text=True, timeout=15,
118
- )
119
- for line in lt_proc.stdout.splitlines():
120
- if "https://" in line:
121
- public_url = line.strip().split()[-1]
122
- break
123
- except Exception:
124
- pass
133
+ except Exception:
134
+ pass
125
135
 
126
136
  print(f"\n{'=' * 60}")
127
137
  print(" FlashStudio is running!")
@@ -129,8 +139,8 @@ def _launch_colab(app_path: str, port: int, share: bool, ngrok_token: str | None
129
139
  print(f" Open: {public_url}")
130
140
  else:
131
141
  print(f" Port: {port}")
132
- print(" ")
133
- print(" If the URL doesn't work, try in a Colab cell:")
142
+ print("")
143
+ print(" Run this in a new cell to get the URL:")
134
144
  print(f" from google.colab.output import eval_js")
135
145
  print(f" print(eval_js('google.colab.kernel.proxyPort({port})'))")
136
146
  print(f"{'=' * 60}\n")
@@ -140,12 +150,27 @@ def _launch_colab(app_path: str, port: int, share: bool, ngrok_token: str | None
140
150
  from IPython.display import display, HTML
141
151
  display(HTML(
142
152
  f'<a href="{public_url}" target="_blank" '
143
- f'style="font-size:16px;padding:8px 16px;background:#7C3AED;'
144
- f'color:white;border-radius:6px;text-decoration:none;">'
153
+ f'style="display:inline-block;font-size:16px;padding:10px 24px;'
154
+ f'background:#7C3AED;color:white;border-radius:8px;'
155
+ f'text-decoration:none;font-weight:600;margin:8px 0;">'
145
156
  f'Open FlashStudio</a>'
146
157
  ))
147
158
  except Exception:
148
159
  pass
160
+ else:
161
+ try:
162
+ from IPython.display import display, HTML
163
+ display(HTML(
164
+ f'<div style="padding:12px;background:#FEF3C7;border-radius:8px;'
165
+ f'margin:8px 0;font-size:14px;">'
166
+ f'Run in a <b>new cell</b>:<br>'
167
+ f'<code style="background:#F3F4F6;padding:4px 8px;border-radius:4px;">'
168
+ f'from google.colab.output import eval_js; '
169
+ f'print(eval_js("google.colab.kernel.proxyPort({port})"))</code>'
170
+ f'</div>'
171
+ ))
172
+ except Exception:
173
+ pass
149
174
 
150
175
  return proc
151
176
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flashstudio
3
- Version: 0.1.9
3
+ Version: 0.2.0
4
4
  Summary: Interactive Training & Inference UI for FlashDet — runs on Google Colab
5
5
  Author: FlashVision
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "flashstudio"
7
- version = "0.1.9"
7
+ version = "0.2.0"
8
8
  description = "Interactive Training & Inference UI for FlashDet — runs on Google Colab"
9
9
  readme = "README_PYPI.md"
10
10
  license = {text = "Apache-2.0"}
File without changes
File without changes