local-data-studio 1.1.0__tar.gz → 2.0.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.
- local_data_studio-2.0.0/CHANGELOG.md +142 -0
- local_data_studio-1.1.0/README.md → local_data_studio-2.0.0/PKG-INFO +178 -16
- local_data_studio-1.1.0/PKG-INFO → local_data_studio-2.0.0/README.md +132 -63
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/docs/IMPLEMENTATION_NOTES.md +110 -2
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/docs/IMPLEMENTATION_NOTES_ja.md +110 -2
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/docs/README_ja.md +132 -16
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/local_data_studio.example.toml +30 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/pyproject.toml +27 -13
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/__init__.py +1 -1
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/app.py +30 -4
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/cli.py +8 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/runtime_config.py +2 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/analysis.py +7 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/datasets.py +76 -16
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/jobs.py +43 -3
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/schemas.py +57 -2
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/contracts.py +1 -1
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/embedding_backends.py +64 -8
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/embedding_session.py +13 -12
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/projection_inputs.py +88 -9
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/service.py +22 -9
- local_data_studio-2.0.0/src/local_data_studio/server/audio_decode.py +144 -0
- local_data_studio-2.0.0/src/local_data_studio/server/audio_values.py +273 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/cache.py +16 -5
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/config.py +42 -0
- local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/__init__.py +5 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/common.py +60 -3
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/contracts.py +14 -0
- local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/delimited.py +244 -0
- local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/json_reader.py +450 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/jsonl.py +63 -56
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/line.py +1 -1
- local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/line_cursor.py +407 -0
- local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/line_indexing.py +388 -0
- local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/parquet.py +321 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/service.py +89 -25
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/db.py +20 -8
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/delete_ops.py +25 -4
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/eda.py +5 -5
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/eda_reports.py +3 -3
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/embedder_capabilities.py +7 -2
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/embedder_models.py +1 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/files.py +7 -5
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/jobs.py +28 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/line_index.py +61 -9
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/readers.py +2 -0
- local_data_studio-2.0.0/src/local_data_studio/server/serialization.py +257 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/sql.py +175 -22
- local_data_studio-2.0.0/src/local_data_studio/server/transcription_config.py +137 -0
- local_data_studio-2.0.0/src/local_data_studio/server/transcription_service.py +385 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/application.js +424 -151
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/atlas.js +13 -7
- local_data_studio-2.0.0/src/local_data_studio/static/app/audio.js +517 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/dom.js +3 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/formatting.js +17 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/http.js +32 -5
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/images.js +21 -2
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/state.js +11 -3
- local_data_studio-2.0.0/src/local_data_studio/static/app/transcription.js +292 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/translation.js +1 -1
- local_data_studio-2.0.0/src/local_data_studio/static/icons/pause.svg +1 -0
- local_data_studio-2.0.0/src/local_data_studio/static/icons/play.svg +1 -0
- local_data_studio-2.0.0/src/local_data_studio/static/icons/transcribe.svg +1 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/index.html +28 -3
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/styles.css +409 -90
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_api_jobs.py +114 -8
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_app_contracts.py +7 -0
- local_data_studio-2.0.0/tests/test_atlas_audio.py +136 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_atlas_prompts.py +101 -0
- local_data_studio-2.0.0/tests/test_audio.py +213 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_eda.py +5 -15
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_embedder_capabilities.py +30 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_files.py +11 -11
- local_data_studio-2.0.0/tests/test_readers.py +733 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_runtime_contracts.py +40 -5
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_serialization.py +50 -4
- local_data_studio-2.0.0/tests/test_transcription.py +260 -0
- local_data_studio-2.0.0/uv.lock +5387 -0
- local_data_studio-1.1.0/CHANGELOG.md +0 -65
- local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/__init__.py +0 -5
- local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/delimited.py +0 -174
- local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/json_reader.py +0 -86
- local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/line_cursor.py +0 -75
- local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/line_indexing.py +0 -57
- local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/parquet.py +0 -202
- local_data_studio-1.1.0/src/local_data_studio/server/serialization.py +0 -118
- local_data_studio-1.1.0/tests/test_readers.py +0 -422
- local_data_studio-1.1.0/uv.lock +0 -3824
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/.gitignore +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/LICENSE +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_01.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_02.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_03.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_04.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_05.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_06.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_07.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_08.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_09.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_10.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_11.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_12.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_icon.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_icon_transparent.png +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_icon_transparent.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/__main__.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/__init__.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/__init__.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/atlas_proxy.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/mutations.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/services.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/static.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_cache.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_cache_patch.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/__init__.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/command.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/dataset.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/image_values.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/images.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/output_frames.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/ports.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/process.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/projection.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/prompts.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/readiness.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/reducers.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/runtime.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/sampling.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/column_stats/__init__.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/column_stats/accumulator.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/column_stats/heuristics.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/column_stats/service.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/deleted_rows.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm_client.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm_profiles.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm_prompt.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm_service.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/stats.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/translation_config.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/translation_service.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/translation_values.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/llm.js +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/selects.js +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app.js +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/chevron-backward.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/chevron-forward.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/close.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/code.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/content-copy.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/delete-row.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/delete.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/refresh.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/reset-settings.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/search.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/search_black.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/search_white.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/send.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/translation.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/unfold-less.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/unfold-more.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/local_data_studio_icon_transparent.svg +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_atlas.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_atlas_projection.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_atlas_proxy.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_cache.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_cli.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_jobs.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_llm.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_llm_profiles.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_stats.py +0 -0
- {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_translation.py +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Notable changes to Local Data Studio are recorded here. Release Please updates
|
|
4
|
+
this file from Conventional Commits when it prepares a release pull request.
|
|
5
|
+
|
|
6
|
+
## [2.0.0](https://github.com/Onely7/local_data_studio/compare/v1.1.1...v2.0.0) (2026-11-02)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### ⚠ BREAKING CHANGES
|
|
10
|
+
|
|
11
|
+
* **index:** Jumps past the row index return HTTP 409 with the detail {"code": "row_index_required", "row": ..., "message": ...} instead of HTTP 400, and build_line_index_with_progress reports indexed_rows and complete alongside row_count, which is None until the index is complete.
|
|
12
|
+
* **preview:** resolve_raw_image_file is renamed to resolve_raw_media_file, and preview responses carry audio markers instead of hex strings for audio bytes.
|
|
13
|
+
* **deps:** Sentence Transformers 6.2+, Transformers 5.19+, Pillow 13+, and LiteLLM 1.100.4+ are now required.
|
|
14
|
+
* **sql:** guard_select_sql_for_dataset was removed; synchronous callers of execute_query_guarded still receive HTTP 400 for full scans of large datasets.
|
|
15
|
+
* **preview:** image bytes in preview responses are thumbnails rather than the original bytes, and raw rows return image bytes as data URLs instead of hex strings.
|
|
16
|
+
* **readers:** Parquet and search page tokens use a new format, search responses include next_page_token, and line rows more than 1M rows past a checkpoint require the row index.
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
* **atlas:** embed audio columns ([56c17ba](https://github.com/Onely7/local_data_studio/commit/56c17ba96bb07d1fcceaf36ed781673b408af1e4))
|
|
21
|
+
* **atlas:** support EmbeddingGemma 2 and multimodal ST 6 models ([6d1a5ef](https://github.com/Onely7/local_data_studio/commit/6d1a5ef2400f66c98d6b7d2645c95d343857fe0d))
|
|
22
|
+
* **index:** index rows in the background and resume interrupted scans ([858033f](https://github.com/Onely7/local_data_studio/commit/858033f7ba2fd24420f1af472dea8def643f9f59))
|
|
23
|
+
* **json:** stream JSON arrays and read JSON Lines saved as .json ([ca7376a](https://github.com/Onely7/local_data_studio/commit/ca7376a66b0ff19d5827e35ae07822c9a53d4678))
|
|
24
|
+
* **preview:** play audio in dataset cells ([6010bc8](https://github.com/Onely7/local_data_studio/commit/6010bc8d5061354e0a9ed4ed82fff83c39cc0d77))
|
|
25
|
+
* **sql:** run full-scan queries on large datasets in the background ([be78154](https://github.com/Onely7/local_data_studio/commit/be78154f50f953d8de4d232a1e77b0d1e5e476da))
|
|
26
|
+
* **transcription:** transcribe audio cells with a configurable speech model ([0f0b332](https://github.com/Onely7/local_data_studio/commit/0f0b33221dc52e1bcc05ce0641c5bcf0220379fd))
|
|
27
|
+
* **ui:** jump to any row and page through search results ([3dd9ff9](https://github.com/Onely7/local_data_studio/commit/3dd9ff9cdbdec0bcc8b2386767982c3a00a3f739))
|
|
28
|
+
* **ui:** show row totals and index far jumps with progress ([7b5389d](https://github.com/Onely7/local_data_studio/commit/7b5389d1a33a56f4f9dfe6c00a57d15577bd19c7))
|
|
29
|
+
* support Python 3.14 ([7678336](https://github.com/Onely7/local_data_studio/commit/7678336d2df53ba67b331a7a69e61f585b132ded))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Bug Fixes
|
|
33
|
+
|
|
34
|
+
* **atlas:** sample large datasets instead of loading every row ([6ba0907](https://github.com/Onely7/local_data_studio/commit/6ba0907499ac1967249ea95c89aefd09c53b8e67))
|
|
35
|
+
* **csv:** keep quoted line breaks inside one row ([fbc8f48](https://github.com/Onely7/local_data_studio/commit/fbc8f483a9bfb18b2f64af65e735ffd318767df7))
|
|
36
|
+
* **readers:** scan small line files to the end instead of rejecting jumps ([ad346ef](https://github.com/Onely7/local_data_studio/commit/ad346efa6a64d5cf450e7fb310bcf5a967cda07f))
|
|
37
|
+
* **ui:** keep pagination and panel buttons readable on narrow screens ([23f4ca2](https://github.com/Onely7/local_data_studio/commit/23f4ca28fa34acba254478eff6fc7397b99b8285))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
### Performance Improvements
|
|
41
|
+
|
|
42
|
+
* **preview:** convert text-only pages without the thread pool ([0a2bb3c](https://github.com/Onely7/local_data_studio/commit/0a2bb3c983b02063ec64754ec1d71eeb063d1ae7))
|
|
43
|
+
* **preview:** send image thumbnails instead of full image bytes ([05eabcd](https://github.com/Onely7/local_data_studio/commit/05eabcdac895c87fd8a7dbaee9f0547183c70ab6))
|
|
44
|
+
* **readers:** read pages, jumps, and visible rows without rereading files ([be8e3ec](https://github.com/Onely7/local_data_studio/commit/be8e3ec7d4e99958218f444fdae46a7cdecb89ed))
|
|
45
|
+
* **readers:** scan, jump, and search large datasets in bounded time ([fef4c6f](https://github.com/Onely7/local_data_studio/commit/fef4c6fcc6c195c3ada2bcfaa23926b3973bcd70))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
### Dependencies
|
|
49
|
+
|
|
50
|
+
* **deps:** bump astral-sh/setup-uv in the github-actions group ([#53](https://github.com/Onely7/local_data_studio/issues/53)) ([96d74c5](https://github.com/Onely7/local_data_studio/commit/96d74c55310d95aed8b054027cf4065659b5f146))
|
|
51
|
+
* remove the unused polars dependency ([d163e9e](https://github.com/Onely7/local_data_studio/commit/d163e9ec890197aa8ef7df09fba55f4f13704257))
|
|
52
|
+
* replace ydata-profiling with fg-data-profiling ([ab39eca](https://github.com/Onely7/local_data_studio/commit/ab39eca11bcbb77d3023629037d38e9f0924dd68))
|
|
53
|
+
* upgrade numpy, scipy, matplotlib and numba ([c4c4411](https://github.com/Onely7/local_data_studio/commit/c4c44118a9136208c15608ac6631f2bb9cbdbd83))
|
|
54
|
+
* upgrade pandas to 2.3.3 ([a0d645e](https://github.com/Onely7/local_data_studio/commit/a0d645e05d1622c5764441b61ee9971aab573f87))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
### Documentation
|
|
58
|
+
|
|
59
|
+
* describe audio playback, transcription, and audio embeddings ([9bcb80d](https://github.com/Onely7/local_data_studio/commit/9bcb80da8d8ee6339f3a1a0cf7963a199eafe683))
|
|
60
|
+
* describe background indexing and large-file reading ([96d9924](https://github.com/Onely7/local_data_studio/commit/96d9924b68f1e549f65e97761ea840c195a2b266))
|
|
61
|
+
* describe large-dataset navigation, background SQL, and EmbeddingGemma 2 ([1cde4c2](https://github.com/Onely7/local_data_studio/commit/1cde4c26bb83d2f6a262b74c708787767cdca3ac))
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
### Build System
|
|
65
|
+
|
|
66
|
+
* **deps:** upgrade dependencies and resolve security advisories ([1b40f87](https://github.com/Onely7/local_data_studio/commit/1b40f87cabf8837102e20375c5d134ffb9f59537))
|
|
67
|
+
|
|
68
|
+
## [1.1.1](https://github.com/Onely7/local_data_studio/compare/v1.1.0...v1.1.1) (2026-07-23)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
### Bug Fixes
|
|
72
|
+
|
|
73
|
+
* preserve compatibility in dependency updates ([caf5beb](https://github.com/Onely7/local_data_studio/commit/caf5bebafbb3da47432b27bef5caf78304328f76))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
### Dependencies
|
|
77
|
+
|
|
78
|
+
* **deps:** bump https://github.com/astral-sh/ty-pre-commit ([9fa50ca](https://github.com/Onely7/local_data_studio/commit/9fa50caefd27154addf2cfc9d71afd7851242ba4))
|
|
79
|
+
* **deps:** bump the github-actions group with 2 updates ([6faf4ab](https://github.com/Onely7/local_data_studio/commit/6faf4ab65668734ae0ce5c247a50aeaef19e29cf))
|
|
80
|
+
* **deps:** bump the python-dependencies group with 4 updates ([2e5a599](https://github.com/Onely7/local_data_studio/commit/2e5a59918bb4c8666b3caf11107007298174f66c))
|
|
81
|
+
* **deps:** bump the python-dependencies group with 9 updates ([c7a47e5](https://github.com/Onely7/local_data_studio/commit/c7a47e50df31b5285fc669a4fe8a2a2bfceb4904))
|
|
82
|
+
|
|
83
|
+
## [1.1.0](https://github.com/Onely7/local_data_studio/compare/v1.0.0...v1.1.0) (2026-07-15)
|
|
84
|
+
|
|
85
|
+
### Translation
|
|
86
|
+
|
|
87
|
+
- Added manual translation for a cell or the currently visible values in a
|
|
88
|
+
Preview column. Translation-enabled LiteLLM profiles are selected separately
|
|
89
|
+
from SQL-generation profiles, and source datasets are never modified.
|
|
90
|
+
([3b5d102](https://github.com/Onely7/local_data_studio/commit/3b5d102500f8a250c0c5ca60525f403cca0e7b59),
|
|
91
|
+
[5537318](https://github.com/Onely7/local_data_studio/commit/5537318fae385a527230250ed073031b8a2614fa))
|
|
92
|
+
- Added 68 target languages and independent defaults for the translation model
|
|
93
|
+
and target language. The target language can be set in
|
|
94
|
+
`local_data_studio.toml`, with browser preferences used as fallbacks.
|
|
95
|
+
([943033d](https://github.com/Onely7/local_data_studio/commit/943033ddd0e93f21162db6ebbb03de13ef7c704f))
|
|
96
|
+
- Added bounded, cancellable background translation jobs. Server-side limits
|
|
97
|
+
cover rows, strings, characters, chunk size, and provider concurrency;
|
|
98
|
+
malformed provider responses are validated and retried once.
|
|
99
|
+
([3b5d102](https://github.com/Onely7/local_data_studio/commit/3b5d102500f8a250c0c5ca60525f403cca0e7b59))
|
|
100
|
+
- Preserved nested list and object structure while translating natural-language
|
|
101
|
+
strings. Numeric, Boolean, binary, identifier, URL, image, and audio values
|
|
102
|
+
are excluded, and completed translations remain only in browser memory.
|
|
103
|
+
([5537318](https://github.com/Onely7/local_data_studio/commit/5537318fae385a527230250ed073031b8a2614fa))
|
|
104
|
+
|
|
105
|
+
### Data Analysis
|
|
106
|
+
|
|
107
|
+
- Applied `EDA_ROW_LIMIT` to the dataset source before pandas DataFrame
|
|
108
|
+
materialization when no rows are hidden in the current session. This avoids
|
|
109
|
+
loading an entire large JSONL dataset before selecting the requested EDA
|
|
110
|
+
rows. Unlimited mode (`-1`) continues to load all selected rows.
|
|
111
|
+
([7d799ed](https://github.com/Onely7/local_data_studio/commit/7d799ed1e99b9d969f2c6677ab7388d3889646f1))
|
|
112
|
+
|
|
113
|
+
### Interface
|
|
114
|
+
|
|
115
|
+
- Added translation controls and copy actions to expanded values and JSON code
|
|
116
|
+
views, with shared JSON syntax coloring for structured values.
|
|
117
|
+
- Refined the dataset selector, search and pagination controls, responsive
|
|
118
|
+
one-column ordering, mobile scrolling, and compact desktop toolbar so the
|
|
119
|
+
Preview keeps as much space as possible.
|
|
120
|
+
- Updated the visual theme, bundled action icons, application branding, and
|
|
121
|
+
screenshots while retaining the existing dataset, SQL, EDA, and Atlas
|
|
122
|
+
workflows.
|
|
123
|
+
([0b4f5fd](https://github.com/Onely7/local_data_studio/commit/0b4f5fd1565d65105e6c147e365d7f05224e27ad),
|
|
124
|
+
[40944f7](https://github.com/Onely7/local_data_studio/commit/40944f739aef7ee86b546efcada9441b573b0092),
|
|
125
|
+
[cfa2b54](https://github.com/Onely7/local_data_studio/commit/cfa2b54b8d5edc46efe4a1eaea353a07f6fb972b),
|
|
126
|
+
[f9690c5](https://github.com/Onely7/local_data_studio/commit/f9690c51a918f31d6cbb07eeaeae4a7aeb08bcae))
|
|
127
|
+
|
|
128
|
+
### Release And Documentation
|
|
129
|
+
|
|
130
|
+
- Added Release Please automation for version updates, changelog maintenance,
|
|
131
|
+
release pull requests, tags, and GitHub Releases.
|
|
132
|
+
([4a70f10](https://github.com/Onely7/local_data_studio/commit/4a70f105308545e1cd9789b5972f1ff085cd86b0))
|
|
133
|
+
- Updated the English and Japanese user guides, implementation notes,
|
|
134
|
+
configuration example, and screenshots for translation, EDA loading, and the
|
|
135
|
+
refined workspace.
|
|
136
|
+
([f23e800](https://github.com/Onely7/local_data_studio/commit/f23e800722f16cf00ff758761afa6f20467092d7),
|
|
137
|
+
[0a6e32c](https://github.com/Onely7/local_data_studio/commit/0a6e32c942cc7ee19e08bb27ae96def1b44a0ea),
|
|
138
|
+
[b53a213](https://github.com/Onely7/local_data_studio/commit/b53a213fa35ce8981c85e8278532c2d400878fe8))
|
|
139
|
+
|
|
140
|
+
## [1.0.0](https://github.com/Onely7/local_data_studio/releases/tag/v1.0.0) (2026-07-13)
|
|
141
|
+
|
|
142
|
+
- Published the first stable Local Data Studio package to PyPI.
|
|
@@ -1,3 +1,49 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: local-data-studio
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: Local data studio for JSONL/JSON/CSV/TSV/Parquet with scalable previews, image inspection, DuckDB SQL, EDA, and Embedding Atlas
|
|
5
|
+
Project-URL: Homepage, https://github.com/Onely7/local_data_studio
|
|
6
|
+
Project-URL: Repository, https://github.com/Onely7/local_data_studio
|
|
7
|
+
Project-URL: Issues, https://github.com/Onely7/local_data_studio/issues
|
|
8
|
+
Author: Daiki Shiono
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: data-exploration,data-viewer,dataset-viewer,duckdb,eda,embedding-atlas,image-datasets,jsonl,parquet
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Framework :: FastAPI
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Requires-Python: <3.15,>=3.11
|
|
23
|
+
Requires-Dist: av>=18.1.0
|
|
24
|
+
Requires-Dist: duckdb<2.0.0,>=1.4.0
|
|
25
|
+
Requires-Dist: embedding-atlas<0.21.0,>=0.20.0
|
|
26
|
+
Requires-Dist: fastapi<1,>=0.139
|
|
27
|
+
Requires-Dist: fg-data-profiling<5,>=4.20.0
|
|
28
|
+
Requires-Dist: httpx<1,>=0.28
|
|
29
|
+
Requires-Dist: litellm<2,>=1.100.4
|
|
30
|
+
Requires-Dist: pandas<3,>=2.3.3
|
|
31
|
+
Requires-Dist: pillow>=13.0.0
|
|
32
|
+
Requires-Dist: pyarrow>=24.0.0
|
|
33
|
+
Requires-Dist: pydantic-settings<3,>=2.6
|
|
34
|
+
Requires-Dist: pydantic<3,>=2.10
|
|
35
|
+
Requires-Dist: python-dotenv
|
|
36
|
+
Requires-Dist: python-multipart
|
|
37
|
+
Requires-Dist: qwen-vl-utils>=0.0.14
|
|
38
|
+
Requires-Dist: requests<3,>=2.33
|
|
39
|
+
Requires-Dist: scikit-learn<2,>=1.7.0
|
|
40
|
+
Requires-Dist: sentence-transformers>=6.2.0
|
|
41
|
+
Requires-Dist: starlette<2,>=1.3.1
|
|
42
|
+
Requires-Dist: torchvision>=0.27.1
|
|
43
|
+
Requires-Dist: transformers>=5.19.0
|
|
44
|
+
Requires-Dist: uvicorn>=0.50.0
|
|
45
|
+
Description-Content-Type: text/markdown
|
|
46
|
+
|
|
1
47
|
<div align="center">
|
|
2
48
|
|
|
3
49
|
# Local Data Studio <img src="images/local_data_studio_icon.png" alt="Local Data Studio Icon" align="right" width="150" style="margin-left:50px;"/>
|
|
@@ -25,21 +71,24 @@ Click the Local Data Studio logo in the top bar to open this GitHub repository i
|
|
|
25
71
|
|
|
26
72
|
## Key Features
|
|
27
73
|
|
|
28
|
-
* Preview
|
|
74
|
+
* Preview terabyte-scale datasets quickly: each page reads only the rows it shows
|
|
75
|
+
* Index rows in the background while you browse, so totals, far jumps, and later pages are ready sooner
|
|
29
76
|
* Run read-only searches and aggregations with DuckDB SQL
|
|
30
77
|
* Apply SQL timeouts, memory limits, and warnings when a query may read a large amount of data
|
|
31
78
|
* Generate EDA reports for an entire dataset or SQL results
|
|
32
|
-
* Visualize text
|
|
79
|
+
* Visualize text, image, or audio columns, or SQL results, with Embedding Atlas
|
|
33
80
|
* Inspect complete row contents with the **Row Inspector**
|
|
34
81
|
* Display images from URLs, local file paths, and values stored in `{bytes, path}` format
|
|
35
82
|
* Open enlarged image previews and switch between multiple images in the same row
|
|
83
|
+
* Play audio stored as bytes, Hugging Face `Audio` values, data URLs, or file paths
|
|
84
|
+
* Transcribe audio with a configured speech-recognition model such as Qwen3-ASR or Whisper
|
|
36
85
|
* Manually translate visible cells or columns with configured LiteLLM-compatible models
|
|
37
86
|
* Upload files by dragging and dropping them into the application
|
|
38
87
|
* Hide rows while the application page is open and, when needed, delete them from the source file
|
|
39
88
|
|
|
40
89
|
## Supported Environments and Data Formats
|
|
41
90
|
|
|
42
|
-
* Python 3.11, 3.12, or 3.
|
|
91
|
+
* Python 3.11, 3.12, 3.13, or 3.14
|
|
43
92
|
* Supported formats: `.jsonl`, `.json`, `.csv`, `.tsv`, and `.parquet`
|
|
44
93
|
|
|
45
94
|
## Quick Start
|
|
@@ -102,7 +151,17 @@ Use the controls at the top of the page to change what is displayed:
|
|
|
102
151
|
|
|
103
152
|
* **Search**: Searches the data.
|
|
104
153
|
* **Rows**: Changes the number of rows shown per page.
|
|
105
|
-
* **
|
|
154
|
+
* **Go to row**: Enter a row number and press `Enter` to jump directly to that row.
|
|
155
|
+
When the row lies past the indexed part of a large JSONL, CSV, TSV, or JSON file, the rows up to it are indexed first.
|
|
156
|
+
The progress appears above the table, with a **Cancel** button.
|
|
157
|
+
* **Prev** / **Next**: Moves to the previous or next page of the data or of the search results.
|
|
158
|
+
|
|
159
|
+
The number at the left of each row is its position in the dataset, so it stays the same after jumps, searches, and hidden rows.
|
|
160
|
+
|
|
161
|
+
The line above the table shows the number of columns and the rows on screen, followed by the total number of rows.
|
|
162
|
+
Parquet totals are known immediately.
|
|
163
|
+
For JSONL, CSV, TSV, and JSON files, the total is an estimate, such as `of about 2.4B`, until the background row index reaches the end of the file.
|
|
164
|
+
Image cells show small thumbnails; select an image to view it at its original resolution.
|
|
106
165
|
|
|
107
166
|
<img src="images/local_data_studio_03.png" alt="Searching data and moving between pages" width="45%">
|
|
108
167
|
|
|
@@ -116,6 +175,10 @@ If the server has a LiteLLM model connection setting, called a model profile, yo
|
|
|
116
175
|
You can choose from configured OpenAI, Anthropic, Gemini, hosted vLLM, and other LiteLLM-compatible models.
|
|
117
176
|
|
|
118
177
|
SQL execution is subject to timeouts, memory limits, and checks for queries that may read a large amount of data.
|
|
178
|
+
|
|
179
|
+
On datasets larger than 256 MiB, queries that aggregate, sort, deduplicate, join, or use window functions scan the whole dataset in the background.
|
|
180
|
+
While such a query runs, its progress is shown and **Run Query** changes to **Cancel Query**.
|
|
181
|
+
Up to 1,000,000 result rows are cached, so later pages, **Show raw row**, and EDA or Atlas on the query results reuse them without scanning again.
|
|
119
182
|
For restrictions on generated SQL, see [LLM Model Profiles for SQL Generation and Translation](#llm-model-profiles-for-sql-generation-and-translation).
|
|
120
183
|
|
|
121
184
|
<img src="images/local_data_studio_04.png" alt="SQL console" width="45%">
|
|
@@ -141,7 +204,7 @@ The default value is `minimal`.
|
|
|
141
204
|
|
|
142
205
|
### 5. Visualize Embeddings
|
|
143
206
|
|
|
144
|
-
An embedding represents the features of text
|
|
207
|
+
An embedding represents the features of text, an image, or audio as a sequence of numbers called a vector.
|
|
145
208
|
Embeddings usually contain many numbers, which makes them difficult to compare directly on a screen.
|
|
146
209
|
Local Data Studio uses methods such as UMAP, t-SNE, and PCA to convert embeddings into two-dimensional coordinates and displays them with Embedding Atlas.
|
|
147
210
|
This conversion is called **dimensionality reduction**.
|
|
@@ -149,13 +212,14 @@ Some configuration keys and internal code use the term `projection`, but this RE
|
|
|
149
212
|
|
|
150
213
|
To use this feature, you must provide a local encoder model in Hugging Face format.
|
|
151
214
|
Hugging Face format means that the model's configuration files and related data are stored in the expected directory structure.
|
|
152
|
-
An encoder model converts text or
|
|
215
|
+
An encoder model converts text, images, or audio into embeddings.
|
|
153
216
|
|
|
154
217
|
Place the model under `models/embedder`, or under the directory specified by `--models-dir` or `EMBEDDER_MODELS_DIR`.
|
|
155
218
|
|
|
156
219
|
Example locations:
|
|
157
220
|
|
|
158
221
|
```text
|
|
222
|
+
models/embedder/google/embeddinggemma-2
|
|
159
223
|
models/embedder/google/siglip2-base-patch16-224
|
|
160
224
|
models/embedder/Qwen/Qwen3-Embedding-0.6B
|
|
161
225
|
models/embedder/Qwen/Qwen3-VL-Embedding-2B
|
|
@@ -165,7 +229,7 @@ A directory appears in the **Model** selector when it contains model-identifying
|
|
|
165
229
|
|
|
166
230
|
Under **Visualize Embedding**, select the following:
|
|
167
231
|
|
|
168
|
-
1. A text or
|
|
232
|
+
1. A text, image, or audio column
|
|
169
233
|
2. The model to use
|
|
170
234
|
3. The library that loads the model and computes embeddings, referred to as the backend
|
|
171
235
|
4. The dimensionality-reduction method used to convert embeddings into two dimensions
|
|
@@ -197,6 +261,26 @@ If the field is left empty, the default prompt stored with the model is used.
|
|
|
197
261
|
|
|
198
262
|
</details>
|
|
199
263
|
|
|
264
|
+
<details>
|
|
265
|
+
<summary><strong>Using EmbeddingGemma 2</strong></summary>
|
|
266
|
+
|
|
267
|
+
[EmbeddingGemma 2](https://huggingface.co/google/embeddinggemma-2) embeds text, images, and audio into the same 768-dimensional space.
|
|
268
|
+
The model is not gated, so you can download it without a Hugging Face token:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
hf download google/embeddinggemma-2 --local-dir models/embedder/google/embeddinggemma-2
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Select `google/embeddinggemma-2` as the **Model**.
|
|
275
|
+
Sentence Transformers embeds text, image, and audio columns, and Transformers embeds text columns.
|
|
276
|
+
The model expects a task prefix on text, so for visualization enter `task: clustering | query: ` in **Prompt**.
|
|
277
|
+
Leave **Prompt** empty for image columns, because images are embedded without a prefix.
|
|
278
|
+
Audio is also embedded without a prefix, so a prompt is ignored for audio columns.
|
|
279
|
+
Audio is resampled to 16 kHz, and clips longer than 300 seconds are embedded from their start.
|
|
280
|
+
In Atlas, the audio column shows each clip's file name and duration.
|
|
281
|
+
|
|
282
|
+
</details>
|
|
283
|
+
|
|
200
284
|
<img src="images/local_data_studio_07.png" alt="Embedding Atlas settings" width="45%"> <img src="images/local_data_studio_08.png" alt="Embedding Atlas visualization" width="45%">
|
|
201
285
|
|
|
202
286
|
### 6. Use the Row Inspector and Enlarged Image View
|
|
@@ -219,7 +303,56 @@ If that fails, it uses `path` as a fallback.
|
|
|
219
303
|
|
|
220
304
|
<img src="images/local_data_studio_09.png" alt="Row Inspector" width="45%"> <img src="images/local_data_studio_10.png" alt="Enlarged image preview" width="45%">
|
|
221
305
|
|
|
222
|
-
### 7.
|
|
306
|
+
### 7. Play and Transcribe Audio
|
|
307
|
+
|
|
308
|
+
Local Data Studio recognizes WAV, FLAC, MP3, OGG (including Opus), AAC, M4A, and AIFF audio stored in these forms:
|
|
309
|
+
|
|
310
|
+
* Bytes in a binary column
|
|
311
|
+
* Dictionaries (objects) in `{ "bytes": ..., "path": ... }` format, such as Hugging Face `Audio` values
|
|
312
|
+
* `data:audio/...` URLs
|
|
313
|
+
* Audio URLs and relative or absolute file paths
|
|
314
|
+
|
|
315
|
+
In the table, an audio value appears as a play button with its duration, format, and size.
|
|
316
|
+
WAV and FLAC show their duration before playback; other formats show it once they have been played.
|
|
317
|
+
An expanded field shows a full player with a seek bar and volume control.
|
|
318
|
+
Only one clip plays at a time, and playback continues while the table updates.
|
|
319
|
+
|
|
320
|
+
Preview pages do not carry audio bytes.
|
|
321
|
+
Audio is loaded only when you play it or expand its row, so pages of large clips stay light.
|
|
322
|
+
Relative paths are resolved next to the dataset file first and then below the data directory and `file_serve_roots`; files outside those directories are not served.
|
|
323
|
+
The browser loads audio URLs directly.
|
|
324
|
+
|
|
325
|
+
To transcribe audio, add a speech-recognition model to the `[transcription]` section of `local_data_studio.toml` and select it in **Transcriber** in the toolbar.
|
|
326
|
+
For example, download Qwen3-ASR 1.7B and configure it as follows:
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
hf download Qwen/Qwen3-ASR-1.7B-hf --local-dir models/asr/Qwen/Qwen3-ASR-1.7B-hf
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
```toml
|
|
333
|
+
[transcription]
|
|
334
|
+
default_model = "qwen3-asr-1.7b"
|
|
335
|
+
|
|
336
|
+
[[transcription.models]]
|
|
337
|
+
id = "qwen3-asr-1.7b"
|
|
338
|
+
label = "Qwen3-ASR 1.7B"
|
|
339
|
+
model = "models/asr/Qwen/Qwen3-ASR-1.7B-hf"
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Use the `-hf` repository, because Transformers cannot load the original `Qwen/Qwen3-ASR-1.7B` checkpoint.
|
|
343
|
+
`model` can also be a Hugging Face model ID such as `openai/whisper-large-v3-turbo`; any model that the Transformers speech-recognition pipeline loads works.
|
|
344
|
+
Add `language = "ja"` to a model to fix the language instead of detecting it, or `device = "cpu"` or `device = "cuda:1"` to choose where it runs.
|
|
345
|
+
|
|
346
|
+
The transcription icon in a column header transcribes the audio that is visible in that column; select it again to cancel.
|
|
347
|
+
The **Transcribe** button in an expanded field transcribes that field's audio.
|
|
348
|
+
Each transcript appears below its audio with the detected language and a copy icon.
|
|
349
|
+
|
|
350
|
+
The model loads on first use, which can take a minute, and is released after `idle_unload_seconds` (600 seconds by default).
|
|
351
|
+
Qwen3-ASR 1.7B uses about 4 GB of GPU memory.
|
|
352
|
+
Audio longer than `chunk_seconds` is split at quiet points, and clips longer than `max_audio_seconds` are rejected.
|
|
353
|
+
Transcripts are cached under the cache directory by audio content and model, so the same clip is not transcribed twice.
|
|
354
|
+
|
|
355
|
+
### 8. Translate Visible Values
|
|
223
356
|
|
|
224
357
|
To use translation, set `translation = true` in an LLM model profile.
|
|
225
358
|
Then select a model and target language from the toolbar at the top of the page.
|
|
@@ -296,6 +429,7 @@ The main sections are as follows:
|
|
|
296
429
|
* `[server]`: Server settings
|
|
297
430
|
* `[settings]`: EDA, Embedding Atlas, source-file deletion, and related settings
|
|
298
431
|
* `[llm]`: LLM model profiles used for SQL generation and manual translation
|
|
432
|
+
* `[transcription]`: Speech-recognition models and limits for audio transcription
|
|
299
433
|
* `[translation]`: Initial target language and translation request limits
|
|
300
434
|
|
|
301
435
|
For example, configure the data location and the maximum number of rows loaded for EDA as follows:
|
|
@@ -388,7 +522,7 @@ The environment variables below can also be specified in the TOML `[settings]` s
|
|
|
388
522
|
* `EMBEDDER_MODELS_DIR`: The parent directory containing local Hugging Face encoder models. By default, Local Data Studio uses `models/embedder` under the workspace or current working directory.
|
|
389
523
|
* `ATLAS_HOST`, `ATLAS_PORT`: The IPv4 loopback host used by an Embedding Atlas child process, meaning a separate process started by Local Data Studio, and the first port number to check when selecting an internal port. A loopback host refers only to the same computer. `localhost` is normalized to `127.0.0.1`. IPv6 and externally reachable hosts are not allowed. Browsers do not connect to this port directly.
|
|
390
524
|
* `ATLAS_MAX_INSTANCES`: The maximum number of pending and running Atlas child processes combined. The default is `4`, and the value must be at least `1`.
|
|
391
|
-
* `ATLAS_SAMPLE`: The maximum number of rows used for embedding computation and dimensionality reduction and stored in the cached Atlas Parquet file. Sampling is applied after SQL, with a fixed random seed of 42 so that the same rows are selected for the same input. When unset or set to `0`, all selected rows are used. Negative values are rejected.
|
|
525
|
+
* `ATLAS_SAMPLE`: The maximum number of rows used for embedding computation and dimensionality reduction and stored in the cached Atlas Parquet file. Sampling is applied after SQL, with a fixed random seed of 42 so that the same rows are selected for the same input. When unset or set to `0`, all selected rows are used, except that datasets larger than 256 MiB use a sample of 100,000 rows. Negative values are rejected.
|
|
392
526
|
* `ATLAS_BATCH_SIZE`: The number of rows processed at once during embedding computation. When unset or set to `0`, the Embedding Atlas default is used.
|
|
393
527
|
* `ATLAS_CACHE_MAX_BYTES`: The maximum total size of Embedding Atlas-related files stored in `./cache/atlas`. When the limit is exceeded, the oldest cache files are removed first.
|
|
394
528
|
* `ATLAS_TEXT_MAX_CHARS`: The maximum number of characters retained from a text cell for both embedding input and the cached Atlas Parquet file. Set this to `0` to disable truncation.
|
|
@@ -399,6 +533,14 @@ The environment variables below can also be specified in the TOML `[settings]` s
|
|
|
399
533
|
|
|
400
534
|
</details>
|
|
401
535
|
|
|
536
|
+
<details>
|
|
537
|
+
<summary><strong>Large Dataset Settings</strong></summary>
|
|
538
|
+
|
|
539
|
+
* `BACKGROUND_INDEX`: When `true` (the default), opening a JSONL, CSV, TSV, or JSON file indexes its rows in the background, so the total row count, far jumps, and later pages are available without waiting for a full scan. The scan pauses while pages and rows are being loaded, and it stops when you open another file; its progress is kept and resumed later. Set it to `false` to index rows only when you select **Count Rows** or jump past the indexed rows. The `--background-index` and `--no-background-index` command-line options override this setting.
|
|
540
|
+
* `BACKGROUND_INDEX_MAX_BYTES`: How many bytes of each file the background index reads. The default is 16 GiB (`17179869184`). Files up to this size are indexed completely, which also gives their exact row count. Set it to `0` to index whole files of any size.
|
|
541
|
+
|
|
542
|
+
</details>
|
|
543
|
+
|
|
402
544
|
<details>
|
|
403
545
|
<summary><strong>Data Deletion Settings</strong></summary>
|
|
404
546
|
|
|
@@ -413,7 +555,7 @@ The environment variables below can also be specified in the TOML `[settings]` s
|
|
|
413
555
|
For development or source-code changes, you can run Local Data Studio from the repository.
|
|
414
556
|
The following software is required:
|
|
415
557
|
|
|
416
|
-
* Python 3.11, 3.12, or 3.
|
|
558
|
+
* Python 3.11, 3.12, 3.13, or 3.14
|
|
417
559
|
* Git, which is used to download the source code from GitHub
|
|
418
560
|
* uv, which creates the Python environment and installs the required libraries
|
|
419
561
|
|
|
@@ -512,7 +654,8 @@ Atlas pages are served through Local Data Studio, so you do not need to forward
|
|
|
512
654
|
* Searching and generating EDA reports may take time for large datasets.
|
|
513
655
|
* Row counting, full-dataset search, sample statistics, and EDA run as background jobs that support progress reporting and cancellation.
|
|
514
656
|
* Setting `EDA_ROW_LIMIT=-1` loads all selected rows into memory for analysis. Use this only when the complete dataset fits comfortably in memory.
|
|
515
|
-
* JSON array files
|
|
657
|
+
* JSON array files are previewed page by page, but counting, indexing, and searching them is several times slower than for JSONL. Use JSONL or Parquet for very large datasets.
|
|
658
|
+
* **Count Rows** indexes a JSONL, CSV, TSV, or JSON file to its end. Jumps past the indexed rows index the rows up to the target automatically.
|
|
516
659
|
* t-SNE can become dramatically slower and consume much more memory as the amount of data increases. Set a practical `ATLAS_SAMPLE` limit for large datasets.
|
|
517
660
|
|
|
518
661
|
> [!WARNING]
|
|
@@ -530,9 +673,26 @@ You can skip it if you only need the standard browsing and analysis features.
|
|
|
530
673
|
<details>
|
|
531
674
|
<summary><strong>Large-Dataset Preview and Background Processing</strong></summary>
|
|
532
675
|
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
676
|
+
Previews never read a dataset from its beginning to reach a page.
|
|
677
|
+
|
|
678
|
+
* JSONL, CSV, TSV, and JSON pages continue from the byte position recorded in a `page_token`.
|
|
679
|
+
A sparse row index, with one checkpoint every 10,000 rows, lets **Go to row** start reading near the requested row.
|
|
680
|
+
The background index, **Count Rows**, and jumps past the index extend one shared scan from where the last scan stopped.
|
|
681
|
+
Searches and jumps also record the checkpoints they pass.
|
|
682
|
+
Without nearby checkpoints, one jump may skip at most 1,000,000 rows unless less than 256 MiB remains to be read; farther jumps index the rows up to the target first.
|
|
683
|
+
* `.json` files that hold one JSON value per line are read like JSONL. JSON arrays are read element by element, so the whole document is never loaded.
|
|
684
|
+
* CSV and TSV files whose quoted fields contain line breaks are read record by record, following RFC 4180 quoting.
|
|
685
|
+
If quotes in a file are unbalanced, rows are split at every line break and a warning is shown.
|
|
686
|
+
* Parquet pages are read by physical row number using the row-group metadata, so any row is available immediately.
|
|
687
|
+
The file's metadata is read once and kept in memory, and only the data pages a page needs are read.
|
|
688
|
+
The next page continues from where the previous page stopped, without decoding its row group again.
|
|
689
|
+
* Each page reads at most 32 MiB of source data, so pages of very large rows contain fewer rows.
|
|
690
|
+
* Rows shown on the current page are kept in memory, up to 64 MiB, so the **Row Inspector**, enlarged images, and audio playback open them without reading the file again.
|
|
691
|
+
* Searches resume after the previous page's last match instead of starting over.
|
|
692
|
+
|
|
693
|
+
Line scans read 16 MiB blocks and locate rows with vectorized byte searches on several threads.
|
|
694
|
+
Counting rows and searching therefore run close to disk speed.
|
|
695
|
+
Jumps and single-row reads start with a 256 KiB read and grow it only when needed.
|
|
536
696
|
|
|
537
697
|
Row counting, full-dataset search, sample statistics, and EDA run as background jobs that support progress reporting and cancellation.
|
|
538
698
|
|
|
@@ -622,7 +782,7 @@ Values converted into encoder input format are stored only in an internal embedd
|
|
|
622
782
|
|
|
623
783
|
When `ATLAS_SAMPLE=N` is specified, DuckDB selects rows deterministically after SQL filtering and before creating a pandas DataFrame.
|
|
624
784
|
As a result, at most `N` rows are materialized for embedding computation, dimensionality reduction, and the cached Atlas Parquet file.
|
|
625
|
-
When `ATLAS_SAMPLE=0`, all selected rows are processed.
|
|
785
|
+
When `ATLAS_SAMPLE=0`, all selected rows are processed, except that datasets larger than 256 MiB use a sample of 100,000 rows.
|
|
626
786
|
|
|
627
787
|
Text and prompt templates are expanded only for the current embedding batch.
|
|
628
788
|
Image `bytes` values are written incrementally to a temporary disk-backed work area, and only the data required for the current batch is loaded into memory.
|
|
@@ -674,6 +834,8 @@ Image and multimodal models require a native `modules.json` to run through Sente
|
|
|
674
834
|
|
|
675
835
|
As a result, image-only DINOv3 checkpoints can use only the Transformers backend and rely on the model-declared `pooler_output`.
|
|
676
836
|
Qwen3-VL-Embedding models with a native Sentence Transformers pipeline can use both backends.
|
|
837
|
+
EmbeddingGemma 2 declares text, image, audio, and video inputs.
|
|
838
|
+
Sentence Transformers embeds its text and image columns, while the tokenizer-based Transformers adapter is offered for text only.
|
|
677
839
|
|
|
678
840
|
Only backends for which an executable adapter can be confirmed are selectable.
|
|
679
841
|
`remote_code` is available only when `ATLAS_TRUST_REMOTE_CODE=true` explicitly permits execution of code from the model repository.
|
|
@@ -746,7 +908,7 @@ Resolve all errors before committing.
|
|
|
746
908
|
## Acknowledgements
|
|
747
909
|
|
|
748
910
|
* [Dataset Viewer by Hugging Face](https://github.com/huggingface/dataset-viewer): Used as a reference for the UI and feature design.
|
|
749
|
-
* [
|
|
911
|
+
* [fg-data-profiling](https://github.com/Data-Centric-AI-Community/fg-data-profiling) (formerly YData Profiling): Used to generate EDA reports.
|
|
750
912
|
* [Embedding Atlas](https://github.com/apple/embedding-atlas): Used for interactive embedding visualization.
|
|
751
913
|
|
|
752
914
|
## License
|