मीडिया और एसेट
एसेट अपलोड पूरा करें
अपलोड पूरा होने पर फ़ाइल पंजीकृत करें। upload/sign से लौटाया ऑब्जेक्ट विवरण इस्तेमाल करें और पुनः प्रयास में समान idempotency key रखें।
POST /assets-api/upload/completeकॉन्ट्रैक्ट की समीक्षा: · sha256:563d2d581da0ad29
परिचय
अपलोड पूरा होने पर फ़ाइल पंजीकृत करें। upload/sign से लौटाया ऑब्जेक्ट विवरण इस्तेमाल करें और पुनः प्रयास में समान idempotency key रखें।
सफल HTTP रिस्पॉन्स का अर्थ अनुरोध पूरा होने के बजाय स्वीकार होना हो सकता है। बैकग्राउंड काम में लौटाई ID सहेजें और समाप्ति तक वही ऑपरेशन जाँचें। निर्धारित या स्वीकृत पोस्ट प्लेटफ़ॉर्म की पुष्टि पर ही प्रकाशित है; क्लाइंट टाइमआउट परिणाम सिद्ध नहीं करता।
प्रमाणीकरण और अनुमतियाँ
टोकन केवल मालिक के अधिकार इस्तेमाल कर सकता है। हर अनुरोध वर्कस्पेस सदस्यता, संसाधन स्वामित्व, चुने वर्कस्पेस और दी क्षमताएँ जाँचता है। Core और full प्रोफ़ाइल दिखने वाले टूल बदलते हैं; एक्सेस नहीं देते।
अनुरोध के फ़ील्ड
Required का अर्थ पैरेंट ऑब्जेक्ट और चुनी शाखा के भीतर अनिवार्य है। अनिवार्य चाइल्ड से वैकल्पिक पैरेंट अनिवार्य नहीं होता। नीचे के नियम और फ़ील्ड नाम कॉन्ट्रैक्ट से लिए गए हैं।
| फ़ील्ड / शाखा | प्रकार / अनिवार्य | शर्तें |
|---|---|---|
$ | objectपैरेंट में अनिवार्य |
|
workspace_id | stringपैरेंट में अनिवार्य |
|
asset_type | stringपैरेंट में अनिवार्य |
|
object_key | stringपैरेंट में अनिवार्य |
|
content_sha256 | stringपैरेंट में अनिवार्य |
|
title | stringवैकल्पिक / आइटम |
|
description | stringवैकल्पिक / आइटम |
|
tags | arrayवैकल्पिक / आइटम |
|
tags[] | stringवैकल्पिक / आइटम |
|
metadata | objectवैकल्पिक / आइटम | मुक्त संरचना वाला JSON ऑब्जेक्ट; सीरियलाइज़ होने पर UTF-8 आकार 16384 बाइट से अधिक नहीं होना चाहिए।
|
metadata.* | any JSON valueवैकल्पिक / आइटम | — |
source | stringवैकल्पिक / आइटम |
|
source_metadata | objectवैकल्पिक / आइटम | मुक्त संरचना वाला JSON ऑब्जेक्ट; सीरियलाइज़ होने पर UTF-8 आकार 16384 बाइट से अधिक नहीं होना चाहिए।
|
source_metadata.* | any JSON valueवैकल्पिक / आइटम | — |
idempotency_key | stringवैकल्पिक / आइटम |
|
संपूर्ण JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"asset_type": {
"type": "string",
"enum": [
"image",
"video"
]
},
"object_key": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"content_sha256": {
"type": "string",
"pattern": "^[0-9a-f]{64}$"
},
"title": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
},
"tags": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 64
}
},
"metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "Free-form JSON object; its serialized UTF-8 size must not exceed 16384 bytes."
},
"source": {
"default": "mcp_upload",
"type": "string",
"maxLength": 64
},
"source_metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "Free-form JSON object; its serialized UTF-8 size must not exceed 16384 bytes."
},
"idempotency_key": {
"type": "string",
"minLength": 8,
"maxLength": 160
}
},
"required": [
"workspace_id",
"asset_type",
"object_key",
"content_sha256"
],
"additionalProperties": false
}रिस्पॉन्स और पूर्णता
सफल HTTP स्टेटस: 200. When the operation is complete: synchronous_http_response.
सफल HTTP रिस्पॉन्स का अर्थ अनुरोध पूरा होने के बजाय स्वीकार होना हो सकता है। बैकग्राउंड काम में लौटाई ID सहेजें और समाप्ति तक वही ऑपरेशन जाँचें। निर्धारित या स्वीकृत पोस्ट प्लेटफ़ॉर्म की पुष्टि पर ही प्रकाशित है; क्लाइंट टाइमआउट परिणाम सिद्ध नहीं करता।
Required का अर्थ पैरेंट ऑब्जेक्ट और चुनी शाखा के भीतर अनिवार्य है। अनिवार्य चाइल्ड से वैकल्पिक पैरेंट अनिवार्य नहीं होता। नीचे के नियम और फ़ील्ड नाम कॉन्ट्रैक्ट से लिए गए हैं।
| फ़ील्ड / शाखा | प्रकार / अनिवार्य | शर्तें |
|---|---|---|
$ | objectपैरेंट में अनिवार्य | — |
asset | objectपैरेंट में अनिवार्य | — |
asset.id | integer | stringपैरेंट में अनिवार्य | — |
asset.idanyOf 1 | integerपैरेंट में अनिवार्य |
|
asset.idanyOf 2 | stringपैरेंट में अनिवार्य | — |
asset.workspace_id | stringपैरेंट में अनिवार्य |
|
asset.user_id | stringपैरेंट में अनिवार्य |
|
asset.asset_type | stringपैरेंट में अनिवार्य |
|
asset.asset_url | string | nullपैरेंट में अनिवार्य | — |
asset.asset_urlanyOf 1 | stringपैरेंट में अनिवार्य | — |
asset.asset_urlanyOf 2 | nullपैरेंट में अनिवार्य | — |
asset.preview_url | string | nullवैकल्पिक / आइटम | Workspace-अधिकृत अस्थायी रीड URL। preview_expires_at के बाद Asset read/list से रिफ़्रेश करें; स्थायी मीडिया पहचान के रूप में asset_url रखें। — |
asset.preview_urlanyOf 1 | stringवैकल्पिक / आइटम |
|
asset.preview_urlanyOf 2 | nullवैकल्पिक / आइटम | — |
asset.preview_expires_at | string | nullवैकल्पिक / आइटम | — |
asset.preview_expires_atanyOf 1 | stringवैकल्पिक / आइटम |
|
asset.preview_expires_atanyOf 2 | nullवैकल्पिक / आइटम | — |
asset.title | string | nullपैरेंट में अनिवार्य | — |
asset.titleanyOf 1 | stringपैरेंट में अनिवार्य | — |
asset.titleanyOf 2 | nullपैरेंट में अनिवार्य | — |
asset.description | string | nullपैरेंट में अनिवार्य | — |
asset.descriptionanyOf 1 | stringपैरेंट में अनिवार्य | — |
asset.descriptionanyOf 2 | nullपैरेंट में अनिवार्य | — |
asset.tags | array | nullपैरेंट में अनिवार्य | — |
asset.tagsanyOf 1 | arrayपैरेंट में अनिवार्य | — |
asset.tags[]anyOf 1 | stringवैकल्पिक / आइटम | — |
asset.tagsanyOf 2 | nullपैरेंट में अनिवार्य | — |
asset.metadata | object | nullपैरेंट में अनिवार्य | — |
asset.metadataanyOf 1 | objectपैरेंट में अनिवार्य |
|
asset.metadata.*anyOf 1 | any JSON valueवैकल्पिक / आइटम | — |
asset.metadataanyOf 2 | nullपैरेंट में अनिवार्य | — |
asset.source | string | nullवैकल्पिक / आइटम | — |
asset.sourceanyOf 1 | stringवैकल्पिक / आइटम | — |
asset.sourceanyOf 2 | nullवैकल्पिक / आइटम | — |
asset.source_metadata | object | nullवैकल्पिक / आइटम | — |
asset.source_metadataanyOf 1 | objectवैकल्पिक / आइटम |
|
asset.source_metadata.*anyOf 1 | any JSON valueवैकल्पिक / आइटम | — |
asset.source_metadataanyOf 2 | nullवैकल्पिक / आइटम | — |
asset.created_at | stringपैरेंट में अनिवार्य | — |
asset.version | integerवैकल्पिक / आइटम |
|
deduped | booleanपैरेंट में अनिवार्य | — |
संपूर्ण JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"asset": {
"type": "object",
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "string"
}
]
},
"workspace_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"user_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"asset_type": {
"type": "string",
"enum": [
"text",
"image",
"video",
"audio"
]
},
"asset_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"preview_url": {
"description": "Workspace-authorized temporary read URL. Refresh through Asset read/list after preview_expires_at; keep asset_url as persisted media identity.",
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"preview_expires_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
]
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"tags": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"metadata": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
},
"source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"source_metadata": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string"
},
"version": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"workspace_id",
"user_id",
"asset_type",
"asset_url",
"title",
"description",
"tags",
"metadata",
"created_at"
]
},
"deduped": {
"type": "boolean"
}
},
"required": [
"asset",
"deduped"
]
}त्रुटियाँ और सुरक्षित पुनः प्रयास
HTTP स्टेटस और रिस्पॉन्स बॉडी जाँचें। 400 वैलिडेशन त्रुटि में ZodError हो सकता है; हैंडलर त्रुटियाँ error, message और code फ़ील्ड इस्तेमाल करती हैं। जाँच के लिए request_id या x-request-id रखें, क्रेडेंशियल के बिना। फिर प्रयास से पहले 401/403 एक्सेस त्रुटियाँ ठीक करें और 429 के लिए Retry-After का पालन करें। राइट अनिश्चित हो या 5xx लौटाए, तो पहले मौजूदा परिणाम पढ़ें। idempotency key केवल समर्थित स्थान पर दोबारा इस्तेमाल करें; पुनः प्रयास का व्यवहार ऑपरेशन के अनुसार बदलता है और ठीक एक बार डिलीवरी की गारंटी नहीं देता।
समस्या निवारण गाइडउदाहरण
उदाहरणों में स्कीमा से जाँचे काल्पनिक मान हैं। IDs को अधिकृत IDs, मीडिया को तैयार एसेट और तारीखों को पुष्ट प्रकाशन समय से बदलें। राइट सबमिट करने से पहले खाते की पात्रता जाँचें। यह पेज API अनुरोध नहीं भेजता।
सर्वर पर SOSOAPI_ACCESS_TOKEN को इस ऑपरेशन के स्वीकार्य क्रेडेंशियल से सेट करें और ब्राउज़र कोड से बाहर रखें। एजेंट के लिए sosoapi auth login से ब्राउज़र साइन-इन करें और CLI को क्रेडेंशियल रिफ़्रेश करने दें।
request.json
{
"workspace_id": "11111111-1111-4111-8111-111111111111",
"asset_type": "image",
"object_key": "workspaces/11111111-1111-4111-8111-111111111111/image/example.png",
"content_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"idempotency_key": "example-upload-0001"
}cURL
curl --request POST \
"https://gqeshlawtcexsapabaui.supabase.co/functions/v1/assets-api/upload/complete" \
-H "Authorization: Bearer $SOSOAPI_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
--data-binary @request.jsonJavaScript
// Server-side JavaScript. Do not print tokens or credential-bearing responses.
const token = process.env.SOSOAPI_ACCESS_TOKEN;
if (!token) throw new Error("Set an accepted credential for this operation");
const response = await fetch("https://gqeshlawtcexsapabaui.supabase.co/functions/v1/assets-api/upload/complete", {
method: "POST",
headers: { "Content-Type": "application/json", Authorization: "Bearer " + token },
body: JSON.stringify({
"workspace_id": "11111111-1111-4111-8111-111111111111",
"asset_type": "image",
"object_key": "workspaces/11111111-1111-4111-8111-111111111111/image/example.png",
"content_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"idempotency_key": "example-upload-0001"
})
});
const result = await response.json();
// Check response.ok, the operation-specific body and completion state before continuing.CLI
npx sosoapi api post /assets-api/upload/complete < request.jsonकृत्रिम रिस्पॉन्स का उदाहरण
{
"asset": {
"id": 0,
"workspace_id": "11111111-1111-4111-8111-111111111111",
"user_id": "11111111-1111-4111-8111-111111111111",
"asset_type": "text",
"asset_url": null,
"title": null,
"description": null,
"tags": null,
"metadata": null,
"created_at": "example"
},
"deduped": false
}संबंधित टूल और गाइड
MCP: sosoapi_upload_asset