Skip to content

Commit a56fc4f

Browse files
committed
Merge branch 'develop' into 'fb-bros-100/flip-rect'
Workflow run: https://github.com/HumanSignal/label-studio/actions/runs/15680751302
2 parents 9e6fd40 + fe790a7 commit a56fc4f

File tree

159 files changed

+11395
-2322
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

159 files changed

+11395
-2322
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
jira==3.4.1
22
PyGithub==1.57
3-
requests==2.32.2
3+
requests==2.32.4

.github/workflows/build_pypi.yml

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,26 +128,6 @@ jobs:
128128
- name: Collect static
129129
run: poetry run python label_studio/manage.py collectstatic
130130

131-
- name: Download feature flags
132-
env:
133-
LAUNCHDARKLY_COMMUNITY_SDK_KEY: ${{ secrets.LAUNCHDARKLY_COMMUNITY_SDK_KEY }}
134-
LAUNCHDARKLY_DOWNLOAD_PATH: "label_studio/feature_flags.json"
135-
run: |
136-
set -xeuo pipefail
137-
curl \
138-
--connect-timeout 30 \
139-
--retry 5 \
140-
--retry-delay 10 \
141-
-H "Authorization: $LAUNCHDARKLY_COMMUNITY_SDK_KEY" \
142-
"https://sdk.launchdarkly.com/sdk/latest-all" >"$LAUNCHDARKLY_DOWNLOAD_PATH"
143-
if [ "$(jq 'has("flags")' <<< cat $LAUNCHDARKLY_DOWNLOAD_PATH)" = "true" ]; then
144-
echo "feature_flags.json is valid"
145-
else
146-
echo "feature_flags.json is invalid"
147-
cat $LAUNCHDARKLY_DOWNLOAD_PATH
148-
exit 1
149-
fi
150-
151131
- name: Package
152132
env:
153133
VERSION_OVERRIDE: ${{ inputs.version }}

.github/workflows/cicd_pipeline.yml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,8 @@ jobs:
397397
jira_fix_version: "LS OpenSource/${{ steps.create-draft-release.outputs.tag_name }}"
398398

399399
- name: Generate release changelog
400-
id: changelog_md
401-
uses: ./.github/actions-hub/actions/github-generate-changelog
400+
id: changelog
401+
uses: ./.github/actions-hub/actions/github-changelog
402402
with:
403403
release_version: "${{ steps.create-draft-release.outputs.tag_name }}"
404404
previous_ref: "${{ steps.previous-tag.outputs.previous_tag_name }}"
@@ -408,19 +408,20 @@ jobs:
408408
jira_username: "${{ secrets.JIRA_USERNAME }}"
409409
jira_token: "${{ secrets.JIRA_TOKEN }}"
410410
jira_release_prefix: "LS OpenSource"
411-
launchdarkly_sdk_key: "${{ secrets.LAUNCHDARKLY_COMMUNITY_SDK_KEY }}"
412-
launchdarkly_environment: "community"
411+
launchdarkly_path: "label_studio/feature_flags.json"
413412
helm_chart_repo: "HumanSignal/charts"
414413
helm_chart_path: "heartex/label-studio/Chart.yaml"
415414

416415
- name: Update Draft Release
417416
uses: actions/github-script@v7
418417
id: update-draft-release
418+
env:
419+
CHANGELOG: "${{ steps.changelog.outputs.changelog }}"
419420
with:
420421
github-token: ${{ secrets.GIT_PAT }}
421422
script: |
422423
const { repo, owner } = context.repo;
423-
424+
const changelog = process.env.CHANGELOG;
424425
const { data: release } = await github.rest.repos.updateRelease({
425426
owner,
426427
repo,
@@ -430,7 +431,7 @@ jobs:
430431
name: '${{ steps.create-draft-release.outputs.tag_name }}',
431432
tag_name: '${{ steps.create-draft-release.outputs.tag_name }}',
432433
target_commitish: '${{ github.ref_name }}',
433-
body: atob(`${{ steps.changelog_md.outputs.changelog_msg_b64 }}`)
434+
body: changelog
434435
});
435436
console.log(`Draft release is updated: ${release.html_url}`)
436437
core.setOutput("id", release.id);

.github/workflows/docker-release-promote.yml

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -134,25 +134,6 @@ jobs:
134134
python3 $(pwd)/label_studio/core/version.py
135135
cat $(pwd)/label_studio/core/version_.py
136136
137-
- name: Download feature flags
138-
env:
139-
LAUNCHDARKLY_COMMUNITY_SDK_KEY: ${{ secrets.LAUNCHDARKLY_COMMUNITY_SDK_KEY }}
140-
run: |
141-
set -xeuo pipefail
142-
curl \
143-
--connect-timeout 30 \
144-
--retry 5 \
145-
--retry-delay 10 \
146-
-H "Authorization: $LAUNCHDARKLY_COMMUNITY_SDK_KEY" \
147-
"https://sdk.launchdarkly.com/sdk/latest-all" >"${{ env.LAUNCHDARKLY_DOWNLOAD_PATH }}"
148-
if [ "$(jq 'has("flags")' <<< cat ${{ env.LAUNCHDARKLY_DOWNLOAD_PATH }})" = "true" ]; then
149-
echo "feature_flags.json is valid"
150-
else
151-
echo "feature_flags.json is invalid"
152-
cat ${{ env.LAUNCHDARKLY_DOWNLOAD_PATH }}
153-
exit 1
154-
fi
155-
156137
- name: Set up Docker Buildx
157138
uses: docker/[email protected]
158139

@@ -173,15 +154,15 @@ jobs:
173154
174155
release_dir=release_${{ inputs.release_tag }}
175156
echo "release_dir=$release_dir" >> $GITHUB_OUTPUT
157+
176158
mkdir -p $release_dir
177159
cp label_studio/core/version_.py $release_dir/
178-
cp ${{ env.LAUNCHDARKLY_DOWNLOAD_PATH }} $release_dir/
160+
179161
cd $release_dir
180162
181163
cat <<EOF > "${{ env.RELEASE_DOCKERFILE }}"
182164
FROM ${{ env.IMAGE_NAME }}:${{ steps.get_info.outputs.image_version }}
183165
COPY --chown=54546:0 version_.py /label-studio/label_studio/core/version_.py
184-
COPY --chown=54546:0 ${{ env.LAUNCHDARKLY_DOWNLOAD_PATH }} /label-studio/label_studio/feature_flags.json
185166
EOF
186167
187168
- name: Extract Docker metadata

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,5 @@ docker-compose.override.yml
8080

8181
# Local Netlify folder
8282
.netlify
83+
84+
CLAUDE.local.md

docs/source/guide/access_tokens.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ Personal access tokens can be used with the Python SDK the same way in which leg
5252
# Define the URL where Label Studio is accessible and the API key for your user account
5353
LABEL_STUDIO_URL = 'http://localhost:8080'
5454
# API key is available at the Account & Settings > Access Tokens page in Label Studio UI
55-
API_KEY = 'd6f8a2622d39e9d89ff0dfef1a80ad877f4ee9e3'
55+
API_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....'
5656

5757
# Import the SDK and the client module
5858
from label_studio_sdk.client import LabelStudio

docs/source/guide/storage.md

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,33 @@ When enabled, Label Studio automatically lists files from the storage bucket and
197197
<img src="/images/source-storages-treat-on.png" class="make-intense-zoom">
198198

199199

200-
#### Pre-signed URLs vs. storage proxies
200+
#### Pre-signed URLs vs. Storage proxies
201201

202-
There are two secure mechanisms in which Label Studio fetches media data from cloud storage: via proxy and via pre-signed URLS.
202+
There are two secure mechanisms in which Label Studio fetches media data from cloud storage: via pre-signed URLS and via proxy. Which one you use depends on whether you have **Use pre-signed URLs** toggled on or off when setting up your source storage. **Use pre-signed URLs** is used by default. Proxy storage is enabled when **Use pre-signed URLs** is OFF.
203203

204-
Which one you use depends on whether you have **Use pre-signed URLs** toggled on or off when setting up your source storage. Proxy storage is enabled when **Use pre-signed URLs** is OFF:
204+
<div class="enterprise-only">
205+
206+
!!! note
207+
You can control whether your organization allows the use of storage proxy at the organization level: navigate to your organization's Billing page and look for the "Enable Storage Proxy" toggle.
208+
209+
When "Enable Storage Proxy" is disabled, users in your organization will not be able to create or modify source storage connections that have "Presigned URLs" turned OFF. This restriction ensures that all storage connections must use presigned URLs when the "Enable Storage Proxy" at the organization level is OFF.
210+
211+
</div>
212+
213+
<br/>
214+
215+
{% details <b>See more details</b> %}
216+
217+
##### Pre-signed URLs
218+
219+
In this scenario, your browser receives an HTTP 303 redirect to a time-limited S3/GCS/Azure presigned URL. This is the default behavior.
220+
221+
The main benefit to using pre-signed URLs is if you want to ensure that your media files are isolated **from** the Label Studio network as much as possible.
222+
223+
<img src="/images/storages/storage-proxy-presigned.png" style="max-width:600px; margin: 0 auto" alt="Diagram of presigned URL flow">
224+
225+
The permissions required for this are already included in the cloud storage configuration documentation below.
205226

206-
<img src="/images/storages/use-presigned-off.png" style="max-width:600px; margin: 0 auto" alt="Screenshot of storage page with use pre-signed off">
207227

208228
##### Proxy storage
209229

@@ -276,17 +296,7 @@ Add the **Storage Blob Data Reader** role, which includes:
276296
* `RESOLVER_PROXY_MAX_RANGE_SIZE` - Defaults to 8 MB, and defines the largest chunk size returned per request.
277297
* `RESOLVER_PROXY_TIMEOUT` - Defaults to 20 seconds, and defines the maximum time uWSGI workers spend on a single request.
278298

279-
280-
##### Pre-signed URLs
281-
282-
In this scenario, your browser receives an HTTP 303 redirect to a time-limited S3/GCS/Azure presigned URL. This is the default behavior.
283-
284-
The main benefit to using pre-signed URLs is if you want to ensure that your media files are isolated **from** the Label Studio network as much as possible.
285-
286-
<img src="/images/storages/storage-proxy-presigned.png" style="max-width:600px; margin: 0 auto" alt="Diagram of presigned URL flow">
287-
288-
The permissions required for this are already included in the cloud storage configuration documentation below.
289-
299+
{% enddetails %}
290300

291301
### Target storage
292302

docs/source/includes/tags/channel.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
| [legend] | <code>string</code> | | display name of the channel |
77
| [units] | <code>string</code> | | display units name |
88
| [displayFormat] | <code>string</code> | | format string for the values, uses d3-format:<br/> `[,][.precision][f\|%]`<br/> `,` - group thousands with separator (from locale): `,` (12345.6 -> 12,345.6) `,.2f` (12345.6 -> 12,345.60)<br/> `.precision` - precision for `f\|%` type, significant digits for empty type:<br/> `.3f` (12.3456 -> 12.345, 1000 -> 1000.000)<br/> `.3` (12.3456 -> 12.3, 1.2345 -> 1.23, 12345 -> 1.23e+4)<br/> `f` - treat as float, default precision is .6: `f` (12 -> 12.000000) `.2f` (12 -> 12.00) `.0f` (12.34 -> 12)<br/> `%` - treat as percents and format accordingly: `%.0` (0.128 -> 13%) `%.1` (1.2345 -> 123.4%) |
9-
| [height] | <code>number</code> | | height of the plot |
9+
| [height] | <code>number</code> | <code>200</code> | height of the plot |
1010
| [strokeColor] | <code>string</code> | <code>&quot;#f48a42&quot;</code> | plot stroke color, expects hex value |
1111
| [strokeWidth] | <code>number</code> | <code>1</code> | plot stroke width |
1212
| [markerColor] | <code>string</code> | <code>&quot;#f48a42&quot;</code> | plot stroke color, expects hex value |
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
### Parameters
2+
3+
| Param | Type | Default | Description |
4+
| --- | --- | --- | --- |
5+
| [height] | <code>number</code> | <code>200</code> | height of the plot |
6+
| [showAxis] | <code>boolean</code> | <code>true</code> | whether to show both axes |
7+
| [showYAxis] | <code>boolean</code> | <code>true</code> | whether to show the y-axis |
8+
| [fixedScale] | <code>boolean</code> | | whether to use a fixed scale for all channels. If not set, inherits from parent TimeSeries tag |
9+

docs/source/includes/tags/rating.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
| [maxRating] | <code>number</code> | <code>5</code> | Maximum rating value |
88
| [defaultValue] | <code>number</code> | <code>0</code> | Default rating value |
99
| [size] | <code>small</code> \| <code>medium</code> \| <code>large</code> | <code>medium</code> | Rating icon size |
10-
| [icon] | <code>star</code> \| <code>heart</code> \| <code>fire</code> \| <code>smile</code> | <code>star</code> | Rating icon |
1110
| hotkey | <code>string</code> | | HotKey for changing rating value |
1211
| [required] | <code>boolean</code> | <code>false</code> | Whether rating validation is required |
1312
| [requiredMessage] | <code>string</code> | | Message to show if validation fails |

0 commit comments

Comments
 (0)