Loading...
Loading...
Use when another skill needs to resolve an image source into a Sivi media ID (mId) or media URL. Handles 4 input sources — local file upload, direct image URL, product/webpage URL auto-pick, and AI generation — and returns a unified result (mId + mediaUrl). This is a utility skill referenced by composite skills (generate-design, create-a-plus-content, etc.) to avoid duplicating media handling scripts. For brand-scoped asset management with folder saving, see brand-assets. For standalone AI image generation/enhancement, see enhance-media.
npx skill4agent add sivi/skills handle-mediamIdmediaUrlcreate-mediamIdmediaUrlcreate-mediaurlmIdmediaUrlcreate-mediaurlmIdmediaUrlgeneratemediaUrlmIdmIdsiviAssets[]mediaUrlassets.images[]mediaUrlassets.images[]assets.images[]mIdhead -n -1jqpython3curl -o <file> -w '%{http_code}'/tmp//Users/user/photo.jpg./images/logo.png.jpg.jpeg.png.gif.webp.svghttps://shop.example.com/producthttps://example.com/collectiontype: "logo"subType: "logo"type: "photo"subType: "photograph"type: "photo"subType: "photograph".jpg.jpegextension: "jpeg"contentType: "image/jpeg".pngextension: "png"contentType: "image/png".webpextension: "webp"contentType: "image/webp".svgextension: "svg"contentType: "image/svg+xml".gifextension: "gif"contentType: "image/gif"#!/bin/bash
set -e
source <SKILL_REPO>/.env
# ✅ Replace placeholders below with actual values
LOCAL_FILE="<LOCAL_FILE_PATH>"
FILE_TYPE="<photo_OR_logo>"
FILE_SUBTYPE="<photograph_OR_logo>"
FILE_EXTENSION="<jpeg_OR_png_OR_webp_OR_svg_OR_gif>"
CONTENT_TYPE="<image/jpeg_OR_image/png_OR_etc>"
BRAND_ID="<BRAND_ID>"
# Step 1: Get presigned URL
PAYLOAD=$(python3 -c "
import json
data = {
'type': '$FILE_TYPE',
'extension': '$FILE_EXTENSION',
'contentType': '$CONTENT_TYPE'
}
if '$BRAND_ID':
data['bId'] = '$BRAND_ID'
print(json.dumps(data))
")
HTTP_CODE=$(curl -s -o /tmp/sivi_presigned_response.json -w '%{http_code}' \
-X POST "https://connect.sivi.ai/api/prod/v2/general/files/get-presigned-url" \
-H "Content-Type: application/json" \
-H "sivi-api-key: $SIVI_API_KEY" \
-d "$PAYLOAD")
BODY=$(cat /tmp/sivi_presigned_response.json)
if [ "$HTTP_CODE" != "200" ]; then
echo "ERROR: Presigned URL request failed with HTTP $HTTP_CODE"
echo "$BODY"
exit 1
fi
UPLOAD_URL=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['uploadUrl'])" <<< "$BODY")
UPLOAD_CONTENT_TYPE=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['headers']['Content-Type'])" <<< "$BODY")
echo "Got presigned URL"
# Step 2: Upload file to presigned URL
HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' \
-X PUT \
-H "Content-Type: $UPLOAD_CONTENT_TYPE" \
--data-binary "@$LOCAL_FILE" \
"$UPLOAD_URL")
if [ "$HTTP_CODE" != "200" ] && [ "$HTTP_CODE" != "204" ]; then
echo "ERROR: Upload to presigned URL failed with HTTP $HTTP_CODE"
exit 1
fi
echo "File uploaded to presigned URL"
# Step 3: Create media — register the uploaded file
PAYLOAD=$(python3 -c "
import json
data = {
'type': '$FILE_TYPE',
'subType': '$FILE_SUBTYPE',
'uploadUrl': '''$UPLOAD_URL'''
}
if '$BRAND_ID':
data['bId'] = '$BRAND_ID'
print(json.dumps(data))
")
HTTP_CODE=$(curl -s -o /tmp/sivi_create_media_response.json -w '%{http_code}' \
-X POST "https://connect.sivi.ai/api/prod/v2/general/media/create" \
-H "Content-Type: application/json" \
-H "sivi-api-key: $SIVI_API_KEY" \
-d "$PAYLOAD")
BODY=$(cat /tmp/sivi_create_media_response.json)
if [ "$HTTP_CODE" != "200" ]; then
echo "ERROR: Create media failed with HTTP $HTTP_CODE"
echo "$BODY"
exit 1
fi
M_ID=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['media']['mId'])" <<< "$BODY")
MEDIA_URL=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['media']['url'])" <<< "$BODY")
echo "M_ID=$M_ID"
echo "MEDIA_URL=$MEDIA_URL"create-mediaurl#!/bin/bash
set -e
source <SKILL_REPO>/.env
IMAGE_URL="<DIRECT_IMAGE_URL>"
FILE_TYPE="<photo_OR_logo>"
FILE_SUBTYPE="<photograph_OR_logo>"
BRAND_ID="<BRAND_ID>"
PAYLOAD=$(python3 -c "
import json
data = {
'type': '$FILE_TYPE',
'subType': '$FILE_SUBTYPE',
'url': '''$IMAGE_URL'''
}
if '$BRAND_ID':
data['bId'] = '$BRAND_ID'
print(json.dumps(data))
")
HTTP_CODE=$(curl -s -o /tmp/sivi_create_media_response.json -w '%{http_code}' \
-X POST "https://connect.sivi.ai/api/prod/v2/general/media/create" \
-H "Content-Type: application/json" \
-H "sivi-api-key: $SIVI_API_KEY" \
-d "$PAYLOAD")
BODY=$(cat /tmp/sivi_create_media_response.json)
if [ "$HTTP_CODE" != "200" ]; then
echo "ERROR: Create media failed with HTTP $HTTP_CODE"
echo "$BODY"
exit 1
fi
M_ID=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['media']['mId'])" <<< "$BODY")
MEDIA_URL=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['media']['url'])" <<< "$BODY")
echo "M_ID=$M_ID"
echo "MEDIA_URL=$MEDIA_URL"assets.images[]mIdmIdsiviAssets[]create-mediaurl#!/bin/bash
set -e
source <SKILL_REPO>/.env
WEBPAGE_URL="<PRODUCT_OR_WEBPAGE_URL>"
FILE_TYPE="<photo_OR_logo>"
FILE_SUBTYPE="<photograph_OR_logo>"
BRAND_ID="<BRAND_ID>"
PAYLOAD=$(python3 -c "
import json
data = {
'type': '$FILE_TYPE',
'subType': '$FILE_SUBTYPE',
'url': '''$WEBPAGE_URL'''
}
if '$BRAND_ID':
data['bId'] = '$BRAND_ID'
print(json.dumps(data))
")
HTTP_CODE=$(curl -s -o /tmp/sivi_create_media_response.json -w '%{http_code}' \
-X POST "https://connect.sivi.ai/api/prod/v2/general/media/create" \
-H "Content-Type: application/json" \
-H "sivi-api-key: $SIVI_API_KEY" \
-d "$PAYLOAD")
BODY=$(cat /tmp/sivi_create_media_response.json)
if [ "$HTTP_CODE" != "200" ]; then
echo "ERROR: Create media failed with HTTP $HTTP_CODE"
echo "$BODY"
exit 1
fi
M_ID=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['media']['mId'])" <<< "$BODY")
MEDIA_URL=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['media']['url'])" <<< "$BODY")
echo "M_ID=$M_ID"
echo "MEDIA_URL=$MEDIA_URL"generate| Width | Height | Aspect Ratio |
|---|---|---|
| 1264 | 848 | ~3:2 |
| 848 | 1264 | ~2:3 |
| 1200 | 896 | ~4:3 |
| 896 | 1200 | ~3:4 |
| 1152 | 928 | ~5:4 |
| 928 | 1152 | ~4:5 |
| 1376 | 768 | ~16:9 |
| 768 | 1376 | ~9:16 |
| 1548 | 672 | ~23:10 |
| Width | Height | Aspect Ratio |
|---|---|---|
| 1024 | 1024 | 1:1 |
| 1344 | 768 | 7:4 |
| 1280 | 960 | 4:3 |
| 960 | 1280 | 3:4 |
| 768 | 1344 | 4:7 |
#!/bin/bash
set -e
source <SKILL_REPO>/.env
PROMPT_TEXT="<IMAGE_GENERATION_PROMPT>"
WIDTH="<WIDTH>"
HEIGHT="<HEIGHT>"
BRAND_ID="<BRAND_ID>"
PAYLOAD=$(python3 -c "
import json
data = {
'prompt': '''$PROMPT_TEXT''',
'dimensions': {'width': $WIDTH, 'height': $HEIGHT},
'model': 'nano-banana-3-lite:1k',
'negativePrompt': 'no text, no letters, no words, no handwriting, no calligraphy, no labels, no titles, no signs, no logos, no watermarks.'
}
if '$BRAND_ID':
data['bId'] = '$BRAND_ID'
print(json.dumps(data))
")
HTTP_CODE=$(curl -s -o /tmp/sivi_genmedia_response.json -w '%{http_code}' \
-X POST "https://connect.sivi.ai/api/prod/v2/general/media/generate" \
-H "Content-Type: application/json" \
-H "sivi-api-key: $SIVI_API_KEY" \
-d "$PAYLOAD")
BODY=$(cat /tmp/sivi_genmedia_response.json)
if [ "$HTTP_CODE" != "200" ]; then
echo "ERROR: HTTP $HTTP_CODE"
echo "$BODY"
exit 1
fi
REQUEST_ID=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['requestId'])" <<< "$BODY")
echo "REQUEST_ID=$REQUEST_ID"#!/bin/bash
set -e
source <SKILL_REPO>/.env
REQUEST_ID="<REQUEST_ID_FROM_ABOVE>"
MAX_ATTEMPTS=30
ATTEMPT=0
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
ATTEMPT=$((ATTEMPT + 1))
echo "Poll attempt $ATTEMPT/$MAX_ATTEMPTS..."
QUERY_PARAMS=$(python3 -c "
import json, urllib.parse
params = json.dumps({'requestId': '''$REQUEST_ID'''})
print(urllib.parse.quote(params, safe=''))
")
HTTP_CODE=$(curl -s -o /tmp/sivi_media_status.json -w '%{http_code}' \
-X GET "https://connect.sivi.ai/api/prod/v2/general/get-request-status?queryParams=$QUERY_PARAMS" \
-H "sivi-api-key: $SIVI_API_KEY")
BODY=$(cat /tmp/sivi_media_status.json)
if [ "$HTTP_CODE" != "200" ]; then
echo "ERROR: HTTP $HTTP_CODE"
echo "$BODY"
exit 1
fi
STATUS=$(python3 -c "import json,sys; d=json.load(sys.stdin); print(d['body']['status'])" <<< "$BODY")
if [ "$STATUS" = "completed" ]; then
echo "MEDIA GENERATION COMPLETE"
python3 -c "
import json, sys
d = json.load(sys.stdin)
result = d['body'].get('result', {})
media = result.get('media', {})
if media:
print(f\"MEDIA_URL={media.get('url', '')}\")
print(f\"MEDIA_ID={media.get('mId', '')}\")
else:
print(f\"RESULT={json.dumps(result)}\")
" <<< "$BODY"
exit 0
elif [ "$STATUS" = "failed" ] || [ "$STATUS" = "suspended" ]; then
echo "MEDIA GENERATION FAILED ($STATUS)"
echo "$BODY"
exit 1
fi
sleep 10
done
echo "TIMEOUT"
exit 1M_IDsiviAssets[]MEDIA_URLassets.images[]MEDIA_URLmIdbIdbIdbrands/brand-assetssiviAssetsassetsenhance-mediamodel: "nano-banana:1k"assets.images[]create-mediamIdsiviAssets[]create-media