From f15d4e5f84d35c7701770d6c3eeb5d4c7a6ea22a Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Thu, 13 Nov 2025 10:09:17 -0300 Subject: [PATCH 01/13] cli: add confidential fine-tune guide, hide collab guide --- docs/cli/Guides/collaboration.md | 51 +-- docs/cli/Guides/confidential-fine-tuning.md | 413 ++++++++++++++++++++ src/css/custom.css | 5 + 3 files changed, 446 insertions(+), 23 deletions(-) create mode 100644 docs/cli/Guides/confidential-fine-tuning.md diff --git a/docs/cli/Guides/collaboration.md b/docs/cli/Guides/collaboration.md index 6d1bdc2f..044651ad 100644 --- a/docs/cli/Guides/collaboration.md +++ b/docs/cli/Guides/collaboration.md @@ -2,16 +2,19 @@ id: "collaboration" title: "Confidential Collaboration" slug: "/guides/collaboration" -sidebar_position: 2 +displayed_sidebar: null +unlisted: true --- -Super Protocol enables independent parties to jointly compute over their private inputs without revealing those inputs to one other. +Super Protocol enables independent parties to jointly compute over their private inputs without revealing those inputs to one another. -This guide describes a simple example of confidential collaboration between two parties, **Alice** and **Bob**. Alice owns a script she wants to use to process Bob's dataset. However, the dataset contains sensitive information and cannot be shared. +This guide describes a simple example of confidential collaboration between two parties, **Alice** and **Bob**. Alice owns a script she wants to use to process Bob's dataset. -The computation runs on Super Protocol within a Trusted Execution Environment that is is isolated from all external access, including by Alice, Bob, the hardware owner, and the Super Protocol team. Additionally, Super Protocol's Certification System ensures verifiability, eliminating the need for trust. +The dataset contains sensitive information and cannot be shared. At the same time, Bob must review the script to ensure it is safe to run on his data. If Alice's script is proprietary and she cannot share it with Bob, a possible alternative is to involve independent security experts who can audit the script without exposing it publicly. -Note that this is just one example; Super Protocol's architecture enables a range of more complex multiparty scenarios. +The computation runs on Super Protocol within a Trusted Execution Environment that is isolated from all external access, including that of Alice, Bob, the hardware owner, and the Super Protocol team. Additionally, Super Protocol's Certification System ensures verifiability, eliminating the need for trust. + +The following is just one example of confidential collaboration. Super Protocol's architecture enables a range of more complex scenarios involving multiple parties and assets. ## General workflow @@ -43,7 +46,7 @@ sequenceDiagram Bob ->> Super Protocol / TEE: 9. Complete the data suborder Super Protocol / TEE ->> Storage: Download the dataset Super Protocol / TEE ->> Blockchain: Publish the order report - Super Protocol / TEE ->> Super Protocol / TEE: Execute the order + Super Protocol / TEE ->> Super Protocol / TEE: Process the order Super Protocol / TEE ->>- Storage: Upload the order results Alice ->> Storage: 10. Download the order results Alice ->> Blockchain: 11. Get the order report @@ -52,43 +55,43 @@ sequenceDiagram ```
-**Preparation**: +**Preparation** Alice builds a solution—a Docker image containing her script (1). She uploads the solution using SPCTL (2) and grants Bob access for verification (3). -Bob downloads the solution (4) and verifies it is safe to process his data (5). +Bob (or an independent auditor) downloads the solution (4) and verifies that it is safe to process his data (5). Bob uploads his dataset to remote storage using SPCTL (6). The dataset is automatically encrypted during upload, and only Bob holds the key. -Bob creates an offer on the Marketplace (7). The offer require Bob's manual approval for use. He shares the offer's IDs with Alice. +Bob creates an offer on the Marketplace (7). The offer requires Bob's manual approval for use. He shares the offer's IDs with Alice. -**Execution**: +**Execution** Alice places an order on Super Protocol using her solution and Bob's offer ID (8). The order remains **Blocked** by the data suborder. Bob manually completes the data suborder (9). The command includes the verified solution hash. Completion succeeds only if this hash matches the actual solution hash, meaning the solution was not altered. -Once the computation finishes, Alice can download the result (10). +Once the computation finishes, Alice can download the result (10). All the data within the TEE (solution, dataset, order results, etc.) is automatically deleted. -Both Alice and Bob can retrieve the order report (11) that confirms the authenticity of the entire process. +Both Alice and Bob can retrieve the order report (11) that confirms the authenticity of the entire trusted setup. ## Prerequisites -### Alice +**Alice**: - [SPCTL](/cli) - Docker -### Bob +**Bob**: - [SPCTL](/cli) - Provider Tools ## Preparation -### Alice: 1. Build the solution +### Alice: 1. Build a solution -1.1. Prepare the solution: write a Dockerfile that creates an image with your software. Keep in mind the special file structure inside the TEE: +1.1. Write a Dockerfile that creates an image with the training engine. Keep in mind the special file structure inside the TEE: | **Location** | **Purpose** | **Access** | | :- | :- | :- | @@ -131,7 +134,7 @@ docker save :latest | gzip > .tar.gz ### Alice: 3. Send the solution to Bob -Send Bob the output `solution.resource.json` file from the previous step. +Send the output `solution.resource.json` file from the previous step to Bob. ### Bob: 4. Download the solution @@ -232,16 +235,16 @@ If you are registering an offer for the first time, you will be prompted to comp Follow the dialog: -Q: `Have you already created a DATA offer?` +Q: `Have you already created a DATA offer?`
A: `n` (No) -Q: `Please specify a path to the offer info json file` +Q: `Please specify a path to the offer info json file`
A: `./offer-info.json` -Q: `Please specify a path to the slot info json file` +Q: `Please specify a path to the slot info json file`
A: `./slot-info.json` -Q: `Do you want to add another slot?` +Q: `Do you want to add another slot?`
A: `n` (No) Wait for the offer to be created and find a line in the output with the IDs of the offer and slot, for example: @@ -250,7 +253,7 @@ Wait for the offer to be created and find a line in the output with the IDs of t Slot 119654 for offer 18291 has been created successfully ``` -Provide Bob with these IDs. Ignore other instructions you see in the output. +Provide Alice with these IDs. Ignore other instructions you see in the output. ## Execution @@ -323,6 +326,8 @@ If the order ended up with an error, the results will contain execution logs tha ### Alice and Bob: 11. Get the order report +You can get the order report as soon as the order status becomes `Processing` without waiting for the order to complete: + ```shell ./spctl orders get-report --save-to report.json ``` @@ -345,4 +350,4 @@ Additionally, find entries in the `runtimeInfo` array that start with `"type": " }, ``` -These are hashes of the actual solution and data that were executed within a TEE. Compare them with the solution and dataset hashes from the respective resource files. +These hashes are of the actual solution and data that were executed within a TEE. Compare them with the solution and dataset hashes from the respective resource files. diff --git a/docs/cli/Guides/confidential-fine-tuning.md b/docs/cli/Guides/confidential-fine-tuning.md new file mode 100644 index 00000000..5f90826d --- /dev/null +++ b/docs/cli/Guides/confidential-fine-tuning.md @@ -0,0 +1,413 @@ +--- +id: "fine-tune" +title: "Confidential Fine-Tuning" +slug: "/guides/fine-tune" +sidebar_position: 2 +--- + +Super Protocol enables independent parties to jointly compute over their private inputs without revealing those inputs to one another. + +This guide describes an example of confidential collaboration on Super Protocol: a fine-tuning of a pre-trained AI model. The scenario involves three parties: + +- **Alice** owns the AI model. +- **Bob** owns the dataset. +- **Carol** provides the training engine and scripts. + +Neither Alice nor Bob is willing to share their intellectual property with other parties. At the same time, Carol must share her training engine and scripts with both parties so they can verify that the code is safe to run on their data. + +If Carol's training engine or scripts are proprietary and she cannot share them with Alice and Bob, a possible alternative is to involve independent security experts who can audit the code without exposing it publicly. + +The computation runs on Super Protocol within a Trusted Execution Environment that is isolated from all external access, including that of Alice, Bob, Carol, the hardware owner, and the Super Protocol team. Additionally, Super Protocol's Certification System provides verifiability, eliminating the need for trust. + +The following is just one example of confidential collaboration. Super Protocol's architecture enables a range of scenarios involving multiple parties and assets. + +## General workflow + +**Prepare the solution** + +```mermaid +sequenceDiagram + actor Alice and Bob + actor Carol + participant Storage + + note over Alice and Bob,Storage: Prepare the solution + + Carol ->> Carol: 1. Build a solution + Carol ->> Storage: 2. Upload the solution + Carol ->> Alice and Bob: 3. Send solution.resource.json + Alice and Bob ->> Storage: 4. Download the solution + Alice and Bob ->> Alice and Bob: 5. Verify the solution +``` +
+ +Carol builds a solution—a Docker image containing her training engine and script ([1](/cli/guides/fine-tune#carol-1-build-a-solution)). She uploads the solution using SPCTL ([2](/cli/guides/fine-tune#carol-2-upload-the-solution)) and grants Alice and Bob access for verification ([3](/cli/guides/fine-tune#carol-3-send-the-solution-to-alice-and-bob)). + +Alice and Bob download the solution ([4](/cli/guides/fine-tune#alice-and-bob-4-download-the-solution)) and verify that it is safe to process their data ([5](/cli/guides/fine-tune#alice-and-bob-5-verify-the-solution)). + +If Carol cannot share the code with Alice and Bob, and a third-party auditor is involved, the workflow will differ slightly. After uploading, Carol must also create a solution offer on Super Protocol Marketplace (similar to Bob's [Step 8](/cli/guides/fine-tune#bob-8-create-an-offer)). + +**Prepare the data** + +```mermaid +sequenceDiagram + actor Alice + actor Bob + participant Storage + participant Super Protocol / TEE + + note over Alice,Super Protocol / TEE: Prepare the data + + Alice ->> Storage: 6. Upload the model + Bob ->> Storage: 7. Upload the dataset + Bob ->> Super Protocol / TEE: 8. Create an offer +``` +
+ +Alice uploads her model ([6](/cli/guides/fine-tune#alice-6-upload-the-model)) and Bob uploads his dataset ([7](/cli/guides/fine-tune#bob-7-upload-the-dataset)) to remote storage using SPCTL. The dataset is automatically encrypted during upload, and only Bob holds the key. + +Bob creates an offer on the Marketplace ([8](/cli/guides/fine-tune#bob-8-create-an-offer)). The offer requires Bob's manual approval for use. He shares the offer's IDs with Alice. + +**Execute** + +```mermaid +sequenceDiagram + actor Alice + actor Bob + participant Storage + participant Super Protocol / TEE + participant Blockchain + + note over Alice,Blockchain: Execute + + Alice ->>+ Super Protocol / TEE: 9. Place an order + Super Protocol / TEE ->> Storage: Download the solution + Super Protocol / TEE ->> Storage: Download the model + Bob ->> Super Protocol / TEE: 10. Complete the suborder + Super Protocol / TEE ->> Storage: Download the dataset + Super Protocol / TEE ->> Blockchain: Publish the order report + Super Protocol / TEE ->> Super Protocol / TEE: Process the order + Super Protocol / TEE ->>- Storage: Upload the order results + Alice ->> Storage: 11. Download the order results + Alice ->> Blockchain: 12. Get the order report + Bob ->> Blockchain: 12. Get the order report +``` +
+ +Alice places an order on Super Protocol ([9](/cli/guides/fine-tune#alice-9-place-an-order)), adding the solution, her model, and Bob's offer. The order does not proceed automatically and remains `Blocked` by the data suborder with Bob's dataset. + +Bob manually completes the respective data suborder ([10](/cli/guides/fine-tune#bob-10-complete-the-data-suborder)). The command he uses includes the solution hash. The completion will be successful only if this hash matches the actual solution hash. + +If the suborder is completed successfully, the execution of the main order proceeds. + +When the main order is complete, Alice downloads the result ([11](/cli/guides/fine-tune#alice-11-download-the-order-results)). All the data within the TEE (solution, AI model, dataset, order results, etc.) is automatically deleted. + +Both Alice and Bob can retrieve the order report ([12](/cli/guides/fine-tune#alice-and-bob-12-get-the-order-report)) that confirms the authenticity of the entire trusted setup. + +## Prerequisites + +**Alice**: + +- [SPCTL](/cli) + +**Bob**: + +- [SPCTL](/cli) +- Provider Tools + +**Carol**: + +- [SPCTL](/cli) +- Docker + +## Prepare the solution + +### Carol: 1. Build a solution + +1.1. Write a Dockerfile that creates an image with the training engine. + +Keep in mind the special file structure inside the TEE: + +| **Location** | **Purpose** | **Access** | +| :- | :- | :- | +| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
etc. | Possible data locations
(AI model, dataset, training scripts, etc.) | Read-only | +| `/sp/output` | Output directory for results | Write; read own files | +| `/sp/certs` | Contains the order certificate | Read-only | + +Your solution must find the data in `/sp/inputs` and write the results to `/sp/output`. + +:::important + +Always use absolute paths, such as `/sp/...`. + +::: + +You may either include the training scripts in the image or upload them separately using SPCTL. In this case, Alice will need to attach the uploaded scripts to the order as `--data` at [Step 9](/cli/guides/fine-tune#alice-9-place-an-order). + +You can find several Dockerfile examples in the [Super-Protocol/solutions](https://github.com/Super-Protocol/solutions) GitHub repository. + +1.2. Build an image: + +```shell +docker build -t . +``` + +Replace `` with the name of your solution. + +1.3. Save and archive the image: + +```shell +docker save :latest | gzip > .tar.gz +``` + +### Carol: 2. Upload the solution + +```shell +./spctl files upload .tar.gz \ + --output solution.resource.json \ + --filename .tar.gz \ + --use-addon +``` + +If you did not include training scripts in the image, upload them separately: + +```shell +./spctl files upload \ + --output scripts.resource.json \ + --use-addon +``` + +Replace `` with the path to the directory containing your training scripts. + +### Carol: 3. Send the solution to Alice and Bob + +Send the output resource files from the previous step to Alice and Bob (or independent auditors). + +:::warning + +Although SPCTL encrypts data during upload, the output resource files contain information on how to access and decrypt it. + +::: + +### Alice and Bob: 4. Download the solution + +```shell +./spctl files download solution.resource.json . --use-addon +``` + +### Alice and Bob: 5. Verify the solution + +Review the image to ensure it is safe to process your data. + +## Prepare the data + +### Alice: 6. Upload the model + +```shell +./spctl files upload \ + --output model.resource.json \ + --use-addon +``` + +Replace `` with the path to the dataset directory. + +### Bob: 7. Upload the dataset + +```shell +./spctl files upload \ + --output dataset.resource.json \ + --use-addon +``` + +Replace `` with the path to the dataset directory. + +### Bob: 8. Create an offer + +8.1. In the Provider Tools directory, create a file named `offer-info.json`. Paste the following: + +```json title="offer-info.json" +{ + "name":"Offer name", + "group":"0", + "offerType":"3", + "cancelable":false, + "description":"Offer description", + "restrictions":{ + "offers":[ + ], + "types":[ + ] + }, + "input":"", + "output":"", + "allowedArgs":"", + "allowedAccounts":[ + ], + "argsPublicKey":"", + "resultResource":"", + "subType":"0", + "version":{ + "version":1, + "status":"0", + "info":{ + "metadata":{ + "groupingOffers":true + } + } + } +} +``` + +Modify the offer name and description; leave the rest intact. Save and close the file. + +8.2. In the same directory, create a file named `slot-info.json`. Paste the following: + +```json title="slot-info.json" +{ + "info": { "cpuCores": 0, "gpuCores": 0, "diskUsage": 10485760, "ram": 0, "vram": 0 }, + "usage": { + "maxTimeMinutes": 0, + "minTimeMinutes": 15000, + "price": "0", + "priceType": "1" + }, + "option": { "bandwidth": 0, "externalPort": 0, "traffic": 0 } +} +``` + +Adjust the value set to `diskUsage` so that it is larger than the size of your dataset in bytes. Save and close the file. + +8.3. Register an offer: + +```shell +./provider-tools register data --result +``` + +Replace `` with the path to the `dataset.resource.json` file. + +:::note + +If you are registering an offer for the first time, you will be prompted to complete the provider setup. Enter a provider name and then a brief description. Save the provider information to a file when prompted. + +::: + +Follow the dialog: + +Q: `Have you already created a DATA offer?`
+A: `n` (No) + +Q: `Please specify a path to the offer info json file`
+A: `./offer-info.json` + +Q: `Please specify a path to the slot info json file`
+A: `./slot-info.json` + +Q: `Do you want to add another slot?`
+A: `n` (No) + +Wait for the offer to be created and find a line in the output with the IDs of the offer and slot, for example: + +```text +Slot 119654 for offer 18291 has been created successfully +``` + +Provide Alice with these IDs. Ignore other instructions you see in the output. + +## Execute + +### Alice: 9. Place an order + +9.1. Place an order with the solution, your model, and Bob's data offer. If the training scripts were uploaded separately, add them as data: + +```shell +./spctl workflows create \ + --solution ./solution.resource.json \ + --data ./model.resource.json \ + --data , \ + --tee + [--data ./scripts.resource.json] +``` + +Replace: + +- `` with the offer ID provided by Bob +- `` with the slot ID provided by Bob +- `` with the desired compute offer ID. + +Find the order ID in the output, for example: + +```shell +Workflow was created, TEE order id: ["260402"] +``` + +9.2. Get the suborder ID: + +```shell +./spctl orders get --suborders --suborders_fields id,type,status +``` + +Replace `` with the order ID. + +In the output, find the ID of a `Data` suborder with the `New` status. Provide Bob with the order ID and this suborder ID. + +### Bob: 10. Complete the data suborder + +Manually complete the data suborder: + +```shell +./spctl orders complete \ + --result ./dataset.resource.json \ + --status done \ + --solution-hash +``` + +Replace: + +- `` with the data suborder ID +- `` with the hash from the `solution.resource.json` file. If the solution was modified, its hash will not match the hash you enter. In this case, the suborder will not be completed, and the order will not proceed. + +### Alice: 11. Download the order results + +11.1. Check the order status: + +```shell +./spctl orders get +``` + +Replace `` with the order ID. + +11.2. When the status is `Done` or `Error`, download the result: + +```shell +./spctl orders download-result +``` + +If the order ended up with an error, the results will contain execution logs that may be useful for troubleshooting. + +### Alice and Bob: 12. Get the order report + +You can get the order report as soon as the order status becomes `Processing` without waiting for the order to complete: + +```shell +./spctl orders get-report --save-to report.json +``` + +The report contains the full certificate chain, from the Root CA to the order certificate, and workload metadata. + +Ensure you see `Order report validation successful!` in the output. + +Additionally, find entries in the `runtimeInfo` array that start with `"type": "Image"` and `"type": "Data"`. For example: + +```json +{ + "type": "Data", + "size": 12901, + "hash": { + "algo": "sha256", + "hash": "8598805cd2136a4beff17559a7228854f6a8cc0b027856ea5c196fb8d0602501", + "encoding": "hex" + } +}, +``` + +These hashes are of the actual solution and data that were executed within a TEE. Compare them with the solution and dataset hashes from the respective resource files. diff --git a/src/css/custom.css b/src/css/custom.css index 56cd9594..20183983 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -34,6 +34,11 @@ ol > li::marker { font-weight: 500; } +/* hide the warning on unlisted pages */ +.theme-unlisted-banner { + display: none !important; +} + /* navbar */ .navbar__logo { height: 1.12em; From 4a74b13adfac40e5186f65316189e25aa56fe8fc Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Fri, 14 Nov 2025 07:07:07 -0300 Subject: [PATCH 02/13] cli: add provider-tools guide --- docs/cli/Guides/collaboration.md | 8 +- docs/cli/Guides/confidential-fine-tuning.md | 14 +- docs/cli/Guides/provider-tools.md | 147 ++++++++++++++++++ docs/cli/Guides/quick-guide.md | 2 +- docs/cli/commands/offers/add-slot.md | 2 +- docs/cli/commands/offers/delete-slot.md | 2 +- docs/cli/commands/offers/disable.md | 2 +- docs/cli/commands/offers/enable.md | 2 +- docs/cli/commands/offers/update-slot.md | 2 +- docs/cli/commands/offers/update.md | 2 +- docs/cli/commands/providers/update.md | 2 +- docs/cli/commands/syntax.md | 6 +- docs/cli/index.md | 85 +--------- .../developers/cli_guides/providers_offers.md | 2 +- docs/developers/index.md | 2 +- .../developers/marketplace_gui/first-steps.md | 2 +- 16 files changed, 181 insertions(+), 101 deletions(-) create mode 100644 docs/cli/Guides/provider-tools.md diff --git a/docs/cli/Guides/collaboration.md b/docs/cli/Guides/collaboration.md index 044651ad..101a0842 100644 --- a/docs/cli/Guides/collaboration.md +++ b/docs/cli/Guides/collaboration.md @@ -85,13 +85,13 @@ Both Alice and Bob can retrieve the order report (11) that confirms the authenti **Bob**: - [SPCTL](/cli) -- Provider Tools +- [Provider Tools](/cli/guides/provider-tools) ## Preparation ### Alice: 1. Build a solution -1.1. Write a Dockerfile that creates an image with the training engine. Keep in mind the special file structure inside the TEE: +1.1. Write a Dockerfile that creates an image with your code. Keep in mind the special file structure inside the TEE: | **Location** | **Purpose** | **Access** | | :- | :- | :- | @@ -351,3 +351,7 @@ Additionally, find entries in the `runtimeInfo` array that start with `"type": " ``` These hashes are of the actual solution and data that were executed within a TEE. Compare them with the solution and dataset hashes from the respective resource files. + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/Guides/confidential-fine-tuning.md b/docs/cli/Guides/confidential-fine-tuning.md index 5f90826d..5b7d9ac7 100644 --- a/docs/cli/Guides/confidential-fine-tuning.md +++ b/docs/cli/Guides/confidential-fine-tuning.md @@ -2,7 +2,7 @@ id: "fine-tune" title: "Confidential Fine-Tuning" slug: "/guides/fine-tune" -sidebar_position: 2 +sidebar_position: 3 --- Super Protocol enables independent parties to jointly compute over their private inputs without revealing those inputs to one another. @@ -23,7 +23,7 @@ The following is just one example of confidential collaboration. Super Protocol' ## General workflow -**Prepare the solution** +**Prepare the solution**: ```mermaid sequenceDiagram @@ -47,7 +47,7 @@ Alice and Bob download the solution ([4](/cli/guides/fine-tune#alice-and-bob-4-d If Carol cannot share the code with Alice and Bob, and a third-party auditor is involved, the workflow will differ slightly. After uploading, Carol must also create a solution offer on Super Protocol Marketplace (similar to Bob's [Step 8](/cli/guides/fine-tune#bob-8-create-an-offer)). -**Prepare the data** +**Prepare the data**: ```mermaid sequenceDiagram @@ -68,7 +68,7 @@ Alice uploads her model ([6](/cli/guides/fine-tune#alice-6-upload-the-model)) an Bob creates an offer on the Marketplace ([8](/cli/guides/fine-tune#bob-8-create-an-offer)). The offer requires Bob's manual approval for use. He shares the offer's IDs with Alice. -**Execute** +**Execute**: ```mermaid sequenceDiagram @@ -113,7 +113,7 @@ Both Alice and Bob can retrieve the order report ([12](/cli/guides/fine-tune#ali **Bob**: - [SPCTL](/cli) -- Provider Tools +- [Provider Tools](/cli/guides/provider-tools) **Carol**: @@ -411,3 +411,7 @@ Additionally, find entries in the `runtimeInfo` array that start with `"type": " ``` These hashes are of the actual solution and data that were executed within a TEE. Compare them with the solution and dataset hashes from the respective resource files. + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/Guides/provider-tools.md b/docs/cli/Guides/provider-tools.md new file mode 100644 index 00000000..d041a00e --- /dev/null +++ b/docs/cli/Guides/provider-tools.md @@ -0,0 +1,147 @@ +--- +id: "provider-tools" +title: "Set Up Provider Tools" +slug: "/guides/provider-tools" +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Provider Tools is a Super Protocol CLI utility for registering providers and creating offers. + +## Download + + + +Create a separate directory, open a terminal there, and run the following command: +``` +curl -L https://github.com/Super-Protocol/provider-tools/releases/latest/download/provider-tools-linux-x64 -o provider-tools +chmod +x ./provider-tools +``` + + +Create a separate directory, open Terminal there, and run the following command: +``` +curl -L https://github.com/Super-Protocol/provider-tools/releases/latest/download/provider-tools-macos-x64 -o provider-tools +chmod +x ./provider-tools +``` + + +Install and launch [WSL](https://learn.microsoft.com/en-us/windows/wsl). Create a separate directory, and install Provider Tools for Linux: +``` +curl -L https://github.com/Super-Protocol/provider-tools/releases/latest/download/provider-tools-linux-x64 -o provider-tools +chmod +x ./provider-tools +``` + + + +## Set Up + +```shell +./provider-tools setup +``` + +Enter the Access token: + +```text +eyJhbGciOiJFUzI1NiJ9.eyJhZGRyZXNzIjoiMHhBN0E5NjQ4ZGE2QTg5QjBhNzFhNGMwRDQ2Y2FENDAwMDU3ODI3NGEyIiwiaWF0IjoxNjc5OTk4OTQyLCJleHAiOjE3NDMxMTQxNDJ9.x2lx90D733mToYYdOWhh4hhXn3YowFW4JxFjDFtI7helgp2uqekDHFgekT5yjbBWeHTzRap7SHbDC3VvMIDe0g +``` + +Follow the dialog: + +Q: `Do you need to generate a new authority account?`
+A: `y` (Yes) + +Q: `Do you need to generate a new action account?`
+A: `y` (Yes) + +Q: `Do you need to generate a new tokenReceiver account?`
+A: `y` (Yes) + +## Provider's SPCTL + +Providers need another copy of SPCTL configured to manage their offers. + + + + If you registered a provider using Provider Tools, you should have a configuration file created automatically in the Provider Tools directory. Its name should be similar to `spctl-config-0xB9f0b77BDbAe9fBe3E60BdC567E453f503605BAb.json`, where `0xB9f0b77BDbAe9fBe3E60BdC567E453f503605BAb` is your Authority Account wallet address. + + Copy or download the SPCTL binary to the Provider Tools directory; rename this file to `config.json` so SPCTL can recognize it as its configuration file. + + Alternatively, add the `--config` option to SPCTL commands to use the same SPCTL binary with another account. For example: + + ```shell + ./spctl orders list --my-account --type tee --config ../provider-tools/spctl-config-0xB9f0b77BDbAe9fBe3E60BdC567E453f503605BAb.json + ``` + + + As with your User Account's configuration file, you can manually create the provider's SPCTL configuration file. + + 1. In the Provider Tools directory, create a file named `config.json`. Use the following template: + + ```json title="config.json" + { + "backend": { + "url": "https://bff.superprotocol.com/graphql", + "accessToken": "eyJhbGciOiJFUzI1NiJ9.eyJhZGRyZXNzIjoiMHhBN0E5NjQ4ZGE2QTg5QjBhNzFhNGMwRDQ2Y2FENDAwMDU3ODI3NGEyIiwiaWF0IjoxNjc5OTk4OTQyLCJleHAiOjE3NDMxMTQxNDJ9.x2lx90D733mToYYdOWhh4hhXn3YowFW4JxFjDFtI7helgp2uqekDHFgekT5yjbBWeHTzRap7SHbDC3VvMIDe0g" + }, + "blockchain": { + "rpcUrl": "https://opbnb.superprotocol.com", + "smartContractAddress": "0x3C69ea105Fc716C1Dcb41859281Aa817D0A0B279", + "accountPrivateKey": "", + "authorityAccountPrivateKey": "" + }, + "storage": { + "type": "STORJ", + "bucket": "", + "prefix": "", + "writeAccessToken": "", + "readAccessToken": "" + }, + "workflow": { + "resultEncryption": { + "algo": "ECIES", + "key": "", + "encoding": "base64" + } + } + } + ``` + + 2. Do not change the preconfigured values and provide values to the following keys: + + | **Key** | **Description** | + | :- | :- | + | `"accountPrivateKey"` | Action Account private key. | + | `"authorityAccountPrivateKey"` | Authority Account private key. | + | `"bucket"` | (optional) Name of a Storj bucket. | + | `"prefix"` | (optional) Path to a directory inside the bucket. It can be empty. | + | `"writeAccessToken"` | (optional) Storj access grant with **Full** permission (**Read**, **List**, **Write**, **Delete**) for this bucket. | + | `"readAccessToken"` | (optional) Storj access grant with **Read** permission for this bucket. | + + You can find the section with your Authority and Action Accounts private keys in `provider-tools-config.json` in the Provider Tools directory. For example: + + ```json title="provider-tools-config.json" + "account": { + "authority": "0x50612a8bf52cb263825e58c72361ea58c04efa7af7e5b549ea9c2ed02059c668d", + "action": "0x0512ad96fzc01900d3ecf0987m81c7bc1fd2daf455ebb49kjce5b410c7dc6f05", + "tokenReceiver": "0x167d93786ghbf00d19b7d58065a5a59276e55ca1e621e47330f2b64d9fcb6a38" + }, + ``` + + Save and close the file. + + 3. Generate a key for order result encryption using the [`workflows generate-key`](/cli/commands/workflows/generate-key) command. Open `config.json` again and set the generated key to `workflow.resultEncryption.key`. Save and close the file. + + + +### Set up Storj access (optional) + +If you already [set up Storj access](/cli/#set-up-storj-access-optional) for your regular SPCTL, you may reuse the same credentials for your provider's SPCTL. + +If you skip this step, Super Protocol will automatically provide you with 20 GB of storage. + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/Guides/quick-guide.md b/docs/cli/Guides/quick-guide.md index b10548e1..801e8523 100644 --- a/docs/cli/Guides/quick-guide.md +++ b/docs/cli/Guides/quick-guide.md @@ -2,7 +2,7 @@ id: "quick-guide" title: "Quick Deployment Guide" slug: "/guides/quick-guide" -sidebar_position: 1 +sidebar_position: 2 --- This quick guide provides instructions on deploying a solution and data on Super Protocol. Its purpose is to introduce you to the logic and sequence of the CLI commands. diff --git a/docs/cli/commands/offers/add-slot.md b/docs/cli/commands/offers/add-slot.md index c00ce34b..dd4ce284 100644 --- a/docs/cli/commands/offers/add-slot.md +++ b/docs/cli/commands/offers/add-slot.md @@ -8,7 +8,7 @@ sidebar_position: 9 Adds a slot to an offer. -**Important:** This command requires SPCTL with a [provider configuration file](/cli/#for-providers). +**Important:** This command requires SPCTL with a [provider configuration file](/cli/guides/provider-tools#providers-spctl). ## Syntax diff --git a/docs/cli/commands/offers/delete-slot.md b/docs/cli/commands/offers/delete-slot.md index 63e30dda..efb0d9e4 100644 --- a/docs/cli/commands/offers/delete-slot.md +++ b/docs/cli/commands/offers/delete-slot.md @@ -8,7 +8,7 @@ sidebar_position: 11 Deletes a slot in an offer. -**Important:** This command requires SPCTL with a [provider configuration file](/cli/#for-providers). +**Important:** This command requires SPCTL with a [provider configuration file](/cli/guides/provider-tools#providers-spctl). Use the [`offers get`](/cli/commands/offers/get) command to get the IDs of all slots in an offer. Use the [`offers get-slot`](/cli/commands/offers/get-slot) command to get additional information on a slot. diff --git a/docs/cli/commands/offers/disable.md b/docs/cli/commands/offers/disable.md index 055cb1be..274311a6 100644 --- a/docs/cli/commands/offers/disable.md +++ b/docs/cli/commands/offers/disable.md @@ -8,7 +8,7 @@ sidebar_position: 6 Disables an existing enabled offer. -**Important:** This command requires SPCTL with a [provider configuration file](/cli/#for-providers). +**Important:** This command requires SPCTL with a [provider configuration file](/cli/guides/provider-tools#providers-spctl). ## Syntax diff --git a/docs/cli/commands/offers/enable.md b/docs/cli/commands/offers/enable.md index c8d8edb0..88586e91 100644 --- a/docs/cli/commands/offers/enable.md +++ b/docs/cli/commands/offers/enable.md @@ -8,7 +8,7 @@ sidebar_position: 7 Enables an existing disabled offer. -**Important:** This command requires SPCTL with a [provider configuration file](/cli/#for-providers). +**Important:** This command requires SPCTL with a [provider configuration file](/cli/guides/provider-tools#providers-spctl). ## Syntax diff --git a/docs/cli/commands/offers/update-slot.md b/docs/cli/commands/offers/update-slot.md index 1ddf8482..b9959301 100644 --- a/docs/cli/commands/offers/update-slot.md +++ b/docs/cli/commands/offers/update-slot.md @@ -8,7 +8,7 @@ sidebar_position: 10 Updates a slot in an offer. -**Important:** This command requires SPCTL with a [provider configuration file](/cli/#for-providers). +**Important:** This command requires SPCTL with a [provider configuration file](/cli/guides/provider-tools#providers-spctl). Use the [`offers get`](/cli/commands/offers/get) command to get the IDs of all slots in an offer. Use the [`offers get-slot`](/cli/commands/offers/get-slot) command to get additional information on a slot. diff --git a/docs/cli/commands/offers/update.md b/docs/cli/commands/offers/update.md index 11a20313..501a7acc 100644 --- a/docs/cli/commands/offers/update.md +++ b/docs/cli/commands/offers/update.md @@ -8,7 +8,7 @@ sidebar_position: 5 Updates information about an offer. -**Important:** This command requires SPCTL with a [provider configuration file](/cli/#for-providers). +**Important:** This command requires SPCTL with a [provider configuration file](/cli/guides/provider-tools#providers-spctl). ## Syntax diff --git a/docs/cli/commands/providers/update.md b/docs/cli/commands/providers/update.md index bc5d3f92..8b57c044 100644 --- a/docs/cli/commands/providers/update.md +++ b/docs/cli/commands/providers/update.md @@ -8,7 +8,7 @@ sidebar_position: 3 Updates information about a provider. -**Important:** This command requires SPCTL with a [provider configuration file](/cli/#for-providers). +**Important:** This command requires SPCTL with a [provider configuration file](/cli/guides/provider-tools#providers-spctl). ## Syntax diff --git a/docs/cli/commands/syntax.md b/docs/cli/commands/syntax.md index 6d71110d..877a52d7 100644 --- a/docs/cli/commands/syntax.md +++ b/docs/cli/commands/syntax.md @@ -54,4 +54,8 @@ So, the final format of this option should be one of the following: - `--solution ,`. For example, `--solution 26,25`. - `--solution `. For example, `--solution ./solution.resource.json`. -Read the descriptions of arguments and options and refer to the examples for more information. If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file +Read the descriptions of arguments and options and refer to the examples for more information. If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/index.md b/docs/cli/index.md index eba0c16f..39e44e41 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -10,7 +10,7 @@ import TabItem from '@theme/TabItem'; **SPCTL**—Super Protocol Control—is a versatile tool to access the Super Protocol CLI. With this tool, you can create and manage orders, offers, providers, keys, files, and more. -## Download SPCTL +## Download @@ -41,7 +41,7 @@ import TabItem from '@theme/TabItem'; You can also download and install SPCTL manually from the Super Protocol [GitHub repository](https://github.com/Super-Protocol/ctl). -## For users +## Set Up You can set up SPCTL using the `./spctl setup` command or by manually creating a configuration file. @@ -146,85 +146,6 @@ If you use a free Storj account, your files will become unavailable after the en | `"writeAccessToken"` | Storj access grant with **Full** permission (**Read**, **List**, **Write**, **Delete**) for this bucket. | | `"readAccessToken"` | Storj access grant with **Read** permission for this bucket. | -## For providers - -This section is for providers only. Skip it if you are a regular user. - -Providers need another copy of SPCTL configured to manage their offers. - - - - If you registered a provider using Provider Tools, you should have a configuration file created automatically in the Provider Tools directory. Its name should be similar to `spctl-config-0xB9f0b77BDbAe9fBe3E60BdC567E453f503605BAb.json`, where `0xB9f0b77BDbAe9fBe3E60BdC567E453f503605BAb` is your Authority Account wallet address. - - Rename this file to `config.json` so SPCTL can recognize it as its configuration file. Copy or download the SPCTL binary to the Provider Tools directory. - - Alternatively, use the `--config` option with SPCTL commands to use the same SPCTL binary with a different account. For example: - - ```shell - ./spctl orders list --my-account --type tee --config ./spctl-config-0xB9f0b77BDbAe9fBe3E60BdC567E453f503605BAb.json - ``` - - - As with your User Account's configuration file, you can manually create the provider's SPCTL configuration file. - - 1. In the Provider Tools directory, create a file named `config.json`. Use the following template: - - ```json title="config.json" - { - "backend": { - "url": "https://bff.superprotocol.com/graphql", - "accessToken": "eyJhbGciOiJFUzI1NiJ9.eyJhZGRyZXNzIjoiMHhBN0E5NjQ4ZGE2QTg5QjBhNzFhNGMwRDQ2Y2FENDAwMDU3ODI3NGEyIiwiaWF0IjoxNjc5OTk4OTQyLCJleHAiOjE3NDMxMTQxNDJ9.x2lx90D733mToYYdOWhh4hhXn3YowFW4JxFjDFtI7helgp2uqekDHFgekT5yjbBWeHTzRap7SHbDC3VvMIDe0g" - }, - "blockchain": { - "rpcUrl": "https://opbnb.superprotocol.com", - "smartContractAddress": "0x3C69ea105Fc716C1Dcb41859281Aa817D0A0B279", - "accountPrivateKey": "", - "authorityAccountPrivateKey": "" - }, - "storage": { - "type": "STORJ", - "bucket": "", - "prefix": "", - "writeAccessToken": "", - "readAccessToken": "" - }, - "workflow": { - "resultEncryption": { - "algo": "ECIES", - "key": "", - "encoding": "base64" - } - } - } - ``` - - 2. Do not change the preconfigured values and provide values to the following keys: - - | **Key** | **Description** | - | :- | :- | - | `"accountPrivateKey"` | The provider's Action Account private key. | - | `"authorityAccountPrivateKey"` | The provider's Authority Account private key. | - | `"bucket"` | (optional) Name of a Storj bucket. | - | `"prefix"` | (optional) Path to a directory inside the bucket. It can be empty. | - | `"writeAccessToken"` | (optional) Storj access grant with **Full** permission (**Read**, **List**, **Write**, **Delete**) for this bucket. | - | `"readAccessToken"` | (optional) Storj access grant with **Read** permission for this bucket. | - - You can find the section with your Authority and Action Accounts private keys in `provider-tools-config.json` in the Provider Tools directory. For example: - - ```json title="provider-tools-config.json" - "account": { - "authority": "0x50612a8bf52cb263825e58c72361ea58c04efa7af7e5b549ea9c2ed02059c668d", - "action": "0x0512ad96fzc01900d3ecf0987m81c7bc1fd2daf455ebb49kjce5b410c7dc6f05", - "tokenReceiver": "0x167d93786ghbf00d19b7d58065a5a59276e55ca1e621e47330f2b64d9fcb6a38" - }, - ``` - - Save and close the file. - - 3. Generate a key for order result encryption using the [`workflows generate-key`](/cli/commands/workflows/generate-key) command. Open `config.json` again and set the generated key to `workflow.resultEncryption.key`. Save and close the file. - - - ## Support -If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol). The Community Managers will be happy to help you. \ No newline at end of file +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/developers/cli_guides/providers_offers.md b/docs/developers/cli_guides/providers_offers.md index 9e1941c3..4fd12887 100644 --- a/docs/developers/cli_guides/providers_offers.md +++ b/docs/developers/cli_guides/providers_offers.md @@ -600,4 +600,4 @@ If there is an error, check `error.log` in the Provider Tools directory and `err ## Support -If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol). The Community Managers will be happy to help you. \ No newline at end of file +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/developers/index.md b/docs/developers/index.md index c8d5c39b..d8bcab43 100644 --- a/docs/developers/index.md +++ b/docs/developers/index.md @@ -30,7 +30,7 @@ When you know the basics, try SPCTL—the Super Protocol CLI tool: ## Create your provider and offers with CLI 1. Follow the [Providers and Offers](/developers/cli_guides/providers_offers) guide to create your provider and a first offer. 2. Follow the [Moderation Guidelines](/developers/marketplace/moderation/) to approve your offer for Marketplace GUI. -3. [Update SPCTL configuration](/cli/#for-providers) as a provider to enable management of your provider and offers. +3. [Update SPCTL configuration](/cli/guides/provider-tools#providers-spctl) as a provider to enable management of your provider and offers. 4. Use [SPCTL commands](/developers/cli_guides/providers_offers#faq) to manage your provider and offers. Join us on [Discord](https://discord.gg/superprotocol). The Super Protocol team welcomes any feedback and questions! \ No newline at end of file diff --git a/docs/developers/marketplace_gui/first-steps.md b/docs/developers/marketplace_gui/first-steps.md index 1d7a5aff..60611168 100644 --- a/docs/developers/marketplace_gui/first-steps.md +++ b/docs/developers/marketplace_gui/first-steps.md @@ -214,4 +214,4 @@ Then, click the **Connect Wallet** button in the Marketplace GUI again and sel ## Support -If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol). Community Managers will be happy to help. \ No newline at end of file +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file From 66e6960559dbf746df6ce5c68bfda1903a8213f1 Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Mon, 24 Nov 2025 09:29:58 -0300 Subject: [PATCH 03/13] Minor changes --- docs/cli/Guides/collaboration.md | 4 ++-- docs/cli/Guides/confidential-fine-tuning.md | 20 +++++++++---------- docs/cli/Guides/provider-tools.md | 2 +- docs/data-for-ai/Overview/about.md | 16 +++++++-------- docs/data-for-ai/Overview/dates.md | 2 +- docs/data-for-ai/Overview/support.md | 4 ++-- docs/data-for-ai/Rules/referrals.md | 8 ++++---- docs/data-for-ai/Rules/rewards.md | 8 ++++---- .../deployment_guides/tunnels/repo.md | 2 +- .../developers/marketplace_gui/walkthrough.md | 6 +++--- docs/hackathon/about.md | 6 +++--- docs/hackathon/liquity.md | 2 +- docs/hackathon/rules.md | 4 ++-- docs/hackathon/venus-protocol.md | 2 +- docs/whitepaper/abstract.md | 2 +- docs/whitepaper/blockchain-solution.md | 6 +++--- docs/whitepaper/high-level-description.md | 2 +- docs/whitepaper/target-audience.md | 2 +- 18 files changed, 49 insertions(+), 49 deletions(-) diff --git a/docs/cli/Guides/collaboration.md b/docs/cli/Guides/collaboration.md index 101a0842..100835d3 100644 --- a/docs/cli/Guides/collaboration.md +++ b/docs/cli/Guides/collaboration.md @@ -8,13 +8,13 @@ unlisted: true Super Protocol enables independent parties to jointly compute over their private inputs without revealing those inputs to one another. -This guide describes a simple example of confidential collaboration between two parties, **Alice** and **Bob**. Alice owns a script she wants to use to process Bob's dataset. +This guide describes an example of confidential collaboration between two parties, **Alice** and **Bob**. Alice owns a script she wants to use to process Bob's dataset. The dataset contains sensitive information and cannot be shared. At the same time, Bob must review the script to ensure it is safe to run on his data. If Alice's script is proprietary and she cannot share it with Bob, a possible alternative is to involve independent security experts who can audit the script without exposing it publicly. The computation runs on Super Protocol within a Trusted Execution Environment that is isolated from all external access, including that of Alice, Bob, the hardware owner, and the Super Protocol team. Additionally, Super Protocol's Certification System ensures verifiability, eliminating the need for trust. -The following is just one example of confidential collaboration. Super Protocol's architecture enables a range of more complex scenarios involving multiple parties and assets. +The following is just one relatively simple example of confidential collaboration. Super Protocol's architecture enables a range of more complex scenarios involving multiple parties and assets. ## General workflow diff --git a/docs/cli/Guides/confidential-fine-tuning.md b/docs/cli/Guides/confidential-fine-tuning.md index 5b7d9ac7..b67708ed 100644 --- a/docs/cli/Guides/confidential-fine-tuning.md +++ b/docs/cli/Guides/confidential-fine-tuning.md @@ -64,7 +64,7 @@ sequenceDiagram ```
-Alice uploads her model ([6](/cli/guides/fine-tune#alice-6-upload-the-model)) and Bob uploads his dataset ([7](/cli/guides/fine-tune#bob-7-upload-the-dataset)) to remote storage using SPCTL. The dataset is automatically encrypted during upload, and only Bob holds the key. +Alice uploads her model ([6](/cli/guides/fine-tune#alice-6-upload-the-model)) and Bob uploads his dataset ([7](/cli/guides/fine-tune#bob-7-upload-the-dataset)) to remote storage using SPCTL. Files are automatically encrypted during upload, and only the uploader holds the key. Bob creates an offer on the Marketplace ([8](/cli/guides/fine-tune#bob-8-create-an-offer)). The offer requires Bob's manual approval for use. He shares the offer's IDs with Alice. @@ -179,15 +179,15 @@ If you did not include training scripts in the image, upload them separately: Replace `` with the path to the directory containing your training scripts. -### Carol: 3. Send the solution to Alice and Bob +:::important -Send the output resource files from the previous step to Alice and Bob (or independent auditors). +The output resource files contain information needed to access and decrypt the uploaded files. Be careful with sharing resource files if the uploaded content is sensitive. -:::warning +::: -Although SPCTL encrypts data during upload, the output resource files contain information on how to access and decrypt it. +### Carol: 3. Send the solution to Alice and Bob -::: +Send the output resource files from the previous step to Alice and Bob (or independent auditors). ### Alice and Bob: 4. Download the solution @@ -324,7 +324,7 @@ Provide Alice with these IDs. Ignore other instructions you see in the output. --solution ./solution.resource.json \ --data ./model.resource.json \ --data , \ - --tee + --tee \ [--data ./scripts.resource.json] ``` @@ -403,9 +403,9 @@ Additionally, find entries in the `runtimeInfo` array that start with `"type": " "type": "Data", "size": 12901, "hash": { - "algo": "sha256", - "hash": "8598805cd2136a4beff17559a7228854f6a8cc0b027856ea5c196fb8d0602501", - "encoding": "hex" + "algo": "sha256", + "hash": "8598805cd2136a4beff17559a7228854f6a8cc0b027856ea5c196fb8d0602501", + "encoding": "hex" } }, ``` diff --git a/docs/cli/Guides/provider-tools.md b/docs/cli/Guides/provider-tools.md index d041a00e..b6cd6b72 100644 --- a/docs/cli/Guides/provider-tools.md +++ b/docs/cli/Guides/provider-tools.md @@ -1,6 +1,6 @@ --- id: "provider-tools" -title: "Set Up Provider Tools" +title: "Configure Provider Tools" slug: "/guides/provider-tools" sidebar_position: 1 --- diff --git a/docs/data-for-ai/Overview/about.md b/docs/data-for-ai/Overview/about.md index 2ee25347..0471cf17 100644 --- a/docs/data-for-ai/Overview/about.md +++ b/docs/data-for-ai/Overview/about.md @@ -5,7 +5,7 @@ slug: "/overview/about" sidebar_position: 1 --- -The Super Protocol Data-for-AI Campaign is more than a contest—it’s a collaborative initiative to rethink how AI systems are trained in high-stakes, regulated domains. By sourcing high-quality, publicly available regulatory and clinical data, we aim to make AI development transparent, decentralized, and verifiable from the ground up. +The Super Protocol Data-for-AI Campaign is more than a contest—it's a collaborative initiative to rethink how AI systems are trained in high-stakes, regulated domains. By sourcing high-quality, publicly available regulatory and clinical data, we aim to make AI development transparent, decentralized, and verifiable from the ground up. This campaign is powered by Super Protocol, a decentralized cloud platform designed for privacy-preserving AI computing. It combines confidential execution, on-chain traceability, and cryptographic proof of origin, creating a secure foundation for open collaboration between AI systems and data contributors. @@ -13,13 +13,13 @@ This campaign is powered by Super Protocol, a decentralized cloud platform desig AI companies in regulated industries like healthcare face a difficult trade-off: build costly internal systems to collect and validate data, or rely on opaque, third-party pipelines with unknown provenance. Both come with serious limitations—compliance overhead, audit risks, and a lack of trust in the data itself. -This campaign explores a third path: a verifiable, decentralized pipeline for AI training. Every submitted data link is publicly auditable, cryptographically signed by the contributor, and logged to a smart contract on the opBNB network. It’s not just about finding data—it’s about proving where it came from and how it was used. +This campaign explores a third path: a verifiable, decentralized pipeline for AI training. Every submitted data link is publicly auditable, cryptographically signed by the contributor, and logged to a smart contract on the opBNB network. It's not just about finding data—it's about proving where it came from and how it was used. -We’re working with Tytonix, whose medical AI systems will be trained directly on this dataset. Their tools help medical device companies navigate regulatory approvals faster and at lower cost. Your contributions fuel a real-world application with immediate value. +We're working with Tytonix, whose medical AI systems will be trained directly on this dataset. Their tools help medical device companies navigate regulatory approvals faster and at lower cost. Your contributions fuel a real-world application with immediate value. ## Why verifiability is crucial -In healthcare AI, data integrity isn’t optional. It must be provable—both to regulators and the companies relying on it. +In healthcare AI, data integrity isn't optional. It must be provable—both to regulators and the companies relying on it. Super Protocol ensures every submission has a traceable origin, a clear audit trail, and immutable on-chain attribution. This builds a usable bridge between community-sourced input and production-grade AI. @@ -27,18 +27,18 @@ Super Protocol ensures every submission has a traceable origin, a clear audit tr - On-chain record → compliance-ready data - Decentralized sourcing → scalable, cost-effective pipelines -What’s submitted here isn’t just checked off—it’s accounted for. +What's submitted here isn't just checked off—it's accounted for. ## Just the beginning Super Protocol already supports confidential AI training: models run in secure environments where data remains private, even from developers. Deployments are signed, logged, and verifiable. That infrastructure is live. -What’s missing—until now—is granular, user-attributed input. The ability to train AI on individual contributions, where each data point is trackable, auditable, and tied to its source without sacrificing privacy. +What's missing—until now—is granular, user-attributed input. The ability to train AI on individual contributions, where each data point is trackable, auditable, and tied to its source without sacrificing privacy. -This campaign is the first step. In future phases, contributors will be able to control how their data is used, know when it contributes to training, and opt in or out of specific models. It’s the beginning of a long-term shift: from closed, anonymous datasets to a transparent, accountable, and privacy-respecting AI ecosystem. +This campaign is the first step. In future phases, contributors will be able to control how their data is used, know when it contributes to training, and opt in or out of specific models. It's the beginning of a long-term shift: from closed, anonymous datasets to a transparent, accountable, and privacy-respecting AI ecosystem. ## Where you come in Contribute real-world data. Climb the leaderboard. Earn your share of $30,000 in USDT and Super Stakes (convertible into Super Tokens at the token generation event). -This isn’t just a data campaign. It’s the foundation for an AI system that doesn’t require trust, because everything is verifiable, transparent, and owned. \ No newline at end of file +This isn't just a data campaign. It's the foundation for an AI system that doesn't require trust, because everything is verifiable, transparent, and owned. \ No newline at end of file diff --git a/docs/data-for-ai/Overview/dates.md b/docs/data-for-ai/Overview/dates.md index 3c7567b5..2f4c1d45 100644 --- a/docs/data-for-ai/Overview/dates.md +++ b/docs/data-for-ai/Overview/dates.md @@ -14,4 +14,4 @@ June 9 – June 23, 12:00 PM UTC
→ All activity counts toward leaderboard ranking and final rewards. **Daily Reset:**
-Every day at 12:00 PM UTC, submission limits are reset, and the points’ value increases by 4%. \ No newline at end of file +Every day at 12:00 PM UTC, submission limits are reset, and the points' value increases by 4%. \ No newline at end of file diff --git a/docs/data-for-ai/Overview/support.md b/docs/data-for-ai/Overview/support.md index dcd74251..13dab134 100644 --- a/docs/data-for-ai/Overview/support.md +++ b/docs/data-for-ai/Overview/support.md @@ -5,7 +5,7 @@ slug: "/overview/support" sidebar_position: 6 --- -If you have questions, encounter issues, or need assistance during the campaign, we’re here to help. +If you have questions, encounter issues, or need assistance during the campaign, we're here to help. ## Support ticket @@ -15,4 +15,4 @@ For official support via email, please [submit a request](https://superprotocol. If you prefer real-time communication, you can also get help through our [Discord server](https://discord.com/invite/superprotocol). The channel is **#data-for-ai**. -We’re committed to supporting you throughout the campaign. \ No newline at end of file +We're committed to supporting you throughout the campaign. \ No newline at end of file diff --git a/docs/data-for-ai/Rules/referrals.md b/docs/data-for-ai/Rules/referrals.md index a2187631..07958729 100644 --- a/docs/data-for-ai/Rules/referrals.md +++ b/docs/data-for-ai/Rules/referrals.md @@ -9,9 +9,9 @@ The referral system allows you to earn additional points by inviting others to j ## How it works -- After registration, you’ll receive a unique referral link. +- After registration, you'll receive a unique referral link. - When someone signs up using your link—a *referee*—and starts submitting valid data links, you earn referral points. -- There’s no limit to how many people you can refer. +- There's no limit to how many people you can refer. - Each participant can only be referred once. - If someone signs up without your link or uses another link first, they cannot be reassigned to you. @@ -27,13 +27,13 @@ Day 3: ~37.9 points
...
Day 14 (Final Day): ~58.8 points per link -The longer the campaign runs, the more valuable each referee’s activity becomes. +The longer the campaign runs, the more valuable each referee's activity becomes. Note: While later submissions earn more per link, inviting people early gives them time to contribute more overall, resulting in higher total rewards for you. ## Referral penalty -If your referee submits an invalid data link, you’ll lose the referral reward for one previously earned link from that referee. This only affects the bonus points earned from that specific referee and does not impact your own points or rewards from other referees. +If your referee submits an invalid data link, you'll lose the referral reward for one previously earned link from that referee. This only affects the bonus points earned from that specific referee and does not impact your own points or rewards from other referees. Referral points cannot go negative, and the same rule applies individually to each referee and each invalid link. diff --git a/docs/data-for-ai/Rules/rewards.md b/docs/data-for-ai/Rules/rewards.md index 7864d0a6..7bb9f9c4 100644 --- a/docs/data-for-ai/Rules/rewards.md +++ b/docs/data-for-ai/Rules/rewards.md @@ -7,7 +7,7 @@ sidebar_position: 3 ## Reward recipients -Only the top 1,000 participants will get prizes, and the rewards will depend on the rank. The rank is determined by the user’s total points: own points plus referral points. +Only the top 1,000 participants will get prizes, and the rewards will depend on the rank. The rank is determined by the user's total points: own points plus referral points. | **Rank** | **USDT** | **Super Stakes** | | :- | :- | :- | @@ -41,7 +41,7 @@ The top 50 participants might be subject to KYC checks to verify identity and pr ## Leaderboard -To check winners, participants, referrals, rewards, and more, [read the campaign’s smart contract](https://opbnb.bscscan.com/address/0x8c77ef6ed2ee514d1754fbfc2710d70e9d6ba871#readContract) on the opBNB network. +To check winners, participants, referrals, rewards, and more, [read the campaign's smart contract](https://opbnb.bscscan.com/address/0x8c77ef6ed2ee514d1754fbfc2710d70e9d6ba871#readContract) on the opBNB network. ### Check a participant @@ -65,7 +65,7 @@ Fields in the example in order of appearance: | `0` | Number of links validated today. Always `0` because the campaign has ended. | | `true` | Flag indicating if the address is registered as a campaign participant. | | `false` | Flag indicating if the address has claimed the reward. | -| `0x8da2c62C23aEBeb1Aa8b5eE96d341d26a2edec6eB` | The referrer’s address. | +| `0x8da2c62C23aEBeb1Aa8b5eE96d341d26a2edec6eB` | The referrer's address. | | `68` | Number of referees. | | `2640` | Points the participant earned for their referrer. | | `67738` | Points the participant earned from their referees. | @@ -73,7 +73,7 @@ Fields in the example in order of appearance: | `0` | Total number of duplicate links submitted. | | `237` | Total number of valid links submitted. | | `152` | Total number of invalid links submitted. | -| `0xbF4aC1b6efd5C21e5Ce93f34c8F43C8a9bCACA3F3` | The participant’s address. | +| `0xbF4aC1b6efd5C21e5Ce93f34c8F43C8a9bCACA3F3` | The participant's address. | | `813` | Current rank in the leaderboard. | | `97280` | Total points earned. | | `10000000000000000000` | USDT reward, in denominations. 1018 = 1 USDT. | diff --git a/docs/developers/deployment_guides/tunnels/repo.md b/docs/developers/deployment_guides/tunnels/repo.md index 101b3f1b..0f63e806 100644 --- a/docs/developers/deployment_guides/tunnels/repo.md +++ b/docs/developers/deployment_guides/tunnels/repo.md @@ -15,7 +15,7 @@ These Github Actions are automating the commands outlined in the [previous step] 1. Go to [GitHub](https://github.com) and log in to your account. -2. Click the [New Repository](https://github.com/new) button in the top-right. Enter `superprotocol-test-app` as repository name. You’ll have an option there to initialize the repository with a README file. Add `Node` as `.gitignore` template. +2. Click the [New Repository](https://github.com/new) button in the top-right. Enter `superprotocol-test-app` as repository name. You'll have an option there to initialize the repository with a README file. Add `Node` as `.gitignore` template. 3. Click the “Create repository” button. diff --git a/docs/developers/marketplace_gui/walkthrough.md b/docs/developers/marketplace_gui/walkthrough.md index 60febcd1..4a25bcd8 100644 --- a/docs/developers/marketplace_gui/walkthrough.md +++ b/docs/developers/marketplace_gui/walkthrough.md @@ -7,9 +7,9 @@ sidebar_position: 2 ## 1. Introduction -To better understand how Super Protocol works, let’s take a step-by-step walkthrough through the Marketplace GUI. +To better understand how Super Protocol works, let's take a step-by-step walkthrough through the Marketplace GUI. -As an example we’ll deploy the [Super Chat](/developers/offers/superchat) app with the tunnels. Please note that for this walkthrough we'll be using [Tunnels Launcher](/developers/offers/launcher), which cuts a few corners in order to streamline the experience. For the full tunnels deployment capabilities please refer to [this guide](/developers/deployment_guides/tunnels). +As an example we'll deploy the [Super Chat](/developers/offers/superchat) app with the tunnels. Please note that for this walkthrough we'll be using [Tunnels Launcher](/developers/offers/launcher), which cuts a few corners in order to streamline the experience. For the full tunnels deployment capabilities please refer to [this guide](/developers/deployment_guides/tunnels). You might want to read up on the fundamental Super Protocol concepts - such as [offers](/fundamentals/offers), [orders](/fundamentals/orders), [requirements and configurations](/fundamentals/slots), and [tunnels](/fundamentals/tunnels) - in advance, or - just dive into it and figure it out as you go. Your choice. @@ -142,7 +142,7 @@ To create this order via CLI, click the **Copy CLI workflow** button. It will ge :::info Step 6. Set up a passphrase. -Either input your own passphrase or generate a new one. Then press the `Place Order` button. Save your passphrase! You won’t be able to access your order results without it. For testing it's easier to have a single passphrase for all orders. +Either input your own passphrase or generate a new one. Then press the `Place Order` button. Save your passphrase! You won't be able to access your order results without it. For testing it's easier to have a single passphrase for all orders. ::: diff --git a/docs/hackathon/about.md b/docs/hackathon/about.md index 181ad43e..c1acdb32 100644 --- a/docs/hackathon/about.md +++ b/docs/hackathon/about.md @@ -7,7 +7,7 @@ sidebar_position: 1 ## Hackathon -The [Super Hackathon](https://hackathon.superprotocol.com/) is a global Web3 event designed to demonstrate the scalability and security of Super Protocol’s cloud under real on-chain load. Participants will migrate existing open-source dApps to opBNB, integrate confidential oracle data feeds, and generate verifiable transactions to stress-test performance. The goal is to showcase how real-world decentralized services can operate efficiently, privately, and transparently at scale. +The [Super Hackathon](https://hackathon.superprotocol.com/) is a global Web3 event designed to demonstrate the scalability and security of Super Protocol's cloud under real on-chain load. Participants will migrate existing open-source dApps to opBNB, integrate confidential oracle data feeds, and generate verifiable transactions to stress-test performance. The goal is to showcase how real-world decentralized services can operate efficiently, privately, and transparently at scale. ## Super Protocol @@ -15,7 +15,7 @@ The [Super Hackathon](https://hackathon.superprotocol.com/) is a global Web3 eve ## Confidential oracles -Confidential oracles are a key showcase of Super Protocol’s architecture and the advantages of confidential execution. Built on Chainlink Data Feeds and executed inside TEEs, they keep all data and computations private while remaining verifiable on-chain. +Confidential oracles are a key showcase of Super Protocol's architecture and the advantages of confidential execution. Built on Chainlink Data Feeds and executed inside TEEs, they keep all data and computations private while remaining verifiable on-chain. Traditional oracles rely on thousands of untrusted nodes to reach consensus, making the whole process quite expensive. Super Protocol achieves the same trust with far fewer nodes, as each operates inside a TEE that cryptographically guarantees honest execution. A single node with 3 CPUs and 4 GB RAM can handle the workload of about 1,000 Chainlink nodes, delivering major improvements in speed and cost efficiency. @@ -54,7 +54,7 @@ Prizes are awarded to the team as a whole, not to individual participants or pro ## Community & support -Official discussions and support take place in Super Protocol’s [Discord server](https://discord.gg/superprotocol), channel #hackathons. +Official discussions and support take place in Super Protocol's [Discord server](https://discord.gg/superprotocol), channel #hackathons. Sign up for our newsletter and social media on the [Super Hackathon webpage](https://hackathon.superprotocol.com/) to keep up to date. diff --git a/docs/hackathon/liquity.md b/docs/hackathon/liquity.md index d51815a9..f80debef 100644 --- a/docs/hackathon/liquity.md +++ b/docs/hackathon/liquity.md @@ -94,7 +94,7 @@ Below is an example of partial console output: ## 6. Configure for opBNB Deployment -Now that local deployment works, let’s prepare the project for deployment to the opBNB mainnet. +Now that local deployment works, let's prepare the project for deployment to the opBNB mainnet. ### 6.1. Create the environment file diff --git a/docs/hackathon/rules.md b/docs/hackathon/rules.md index 53a72db5..6930d7c8 100644 --- a/docs/hackathon/rules.md +++ b/docs/hackathon/rules.md @@ -17,7 +17,7 @@ The interface methods (`latestAnswer`, `getAnswer`, `latestRound`, `getRoundData The dApp must be open-source and have been publicly deployed before September 1, 2025, on Ethereum, Polygon, or BNB Chain. -The chosen dApp’s original smart contracts must be verified on a public block explorer (e.g., Etherscan, BscScan, etc.). +The chosen dApp's original smart contracts must be verified on a public block explorer (e.g., Etherscan, BscScan, etc.). The migration should require minimal code changes—no more than 5% of the original codebase. @@ -25,7 +25,7 @@ Teams may submit multiple unique dApps, but each must have a different original Frontends are welcome but optional—evaluation is based solely on the deployed smart contracts and their on-chain activity. -The project’s license must allow forking and reuse (acceptable licenses include MIT, Apache 2.0, GPL-family, or equivalent). +The project's license must allow forking and reuse (acceptable licenses include MIT, Apache 2.0, GPL-family, or equivalent). ## Deploying to opBNB diff --git a/docs/hackathon/venus-protocol.md b/docs/hackathon/venus-protocol.md index d4f828a7..c0924b9c 100644 --- a/docs/hackathon/venus-protocol.md +++ b/docs/hackathon/venus-protocol.md @@ -141,7 +141,7 @@ For example, [opbnb.bscscan.com/address/0x6DA2Fe3A44dc2837e1ffc450339Ae107AE1AC2 ## 12. Submit the migration -To complete the migration, you’ll need both the original and new contract addresses. +To complete the migration, you'll need both the original and new contract addresses. ### 12.1. Locate the original deployment diff --git a/docs/whitepaper/abstract.md b/docs/whitepaper/abstract.md index 31c74761..6e25470f 100644 --- a/docs/whitepaper/abstract.md +++ b/docs/whitepaper/abstract.md @@ -13,7 +13,7 @@ The key Web3 concept is to create open, decentralized alternatives for all the p

-But decentralization is not the only defining feature of the Web3 concept. It is expected that the following technologies will play a key role in the future: Big Data, AI, IoT, and VR/AR. These technologies require a lot of computational capacity and access to data, know-how and specific tools for creating cutting edge products. The lion’s share of the cloud services market at the moment is [controlled by only three corporations](https://www.canalys.com/newsroom/global-cloud-market-Q121). The same corporations and a number of other similar entities also control most of the data and technologies that will be fundamental for the Internet of the future. +But decentralization is not the only defining feature of the Web3 concept. It is expected that the following technologies will play a key role in the future: Big Data, AI, IoT, and VR/AR. These technologies require a lot of computational capacity and access to data, know-how and specific tools for creating cutting edge products. The lion's share of the cloud services market at the moment is [controlled by only three corporations](https://www.canalys.com/newsroom/global-cloud-market-Q121). The same corporations and a number of other similar entities also control most of the data and technologies that will be fundamental for the Internet of the future. In addition to massive centralization of computational capacity, [the year 2020 also saw a serious shortage thereof](https://en.wikipedia.org/wiki/2020%E2%80%932021_global_chip_shortage). This is happening at the time when millions of GPUs are used worldwide [to mine cryptocurrencies](https://en.wikipedia.org/wiki/Proof_of_work) even though they could be deployed to help develop and promote AI solutions in such key areas as healthcare, logistics, education, etc. diff --git a/docs/whitepaper/blockchain-solution.md b/docs/whitepaper/blockchain-solution.md index 262c8724..0ea16595 100644 --- a/docs/whitepaper/blockchain-solution.md +++ b/docs/whitepaper/blockchain-solution.md @@ -21,7 +21,7 @@ To ensure order processing, the blockchain environment provides an infrastructur * **TEE Offers** * **Orders** -Now let’s take a look at each smart contract in detail. +Now let's take a look at each smart contract in detail. ### Basic smart contract for the Super Protocol Config system @@ -257,7 +257,7 @@ The offer describes the cost of using it and the minimum order deposit. To maint | name | string | offer name | | description | string | offer description | | linkage | string | linkage spec, for example, for docker | -| restrictions | string | possible restrictions and requirements for various provider offers. Used when creating an order. E.g.: ‘{“TEE”: [GUID1, GUID2], “Storage”, “Solution”: [GUID3, GUID4]}’ | +| restrictions | string | possible restrictions and requirements for various provider offers. Used when creating an order. E.g.: ‘{“TEE”: [GUID1, GUID2], “Storage”, “Solution”: [GUID3, GUID4]}' | | slots | [{SlotInfo; OptionInfo; SlotUsage}] | array of provided configurations and conditions for their use | | input | string | input data format | | output | string | output data format | @@ -399,7 +399,7 @@ The results of the execution or encountered errors are later added up to the ord | **cancelOrder(guid orderId) public returns(bool)** | order.consumer | blockchain | |

Request to stop execution of the order on the consumer's side. The order status is changed to "canceling", the provider saves the end result of the order and moves the order to "canceled" status. If the offer is of cancelable type, smart contract immediately refunds the remaining deposit based on the proportion of time running or depositSpent. If the offer is of non-cancellable type, the provider sets a fee for their work after the order is complete.

This method works only when all sub-orders are stopped.

| | | | **refillOrder(guid orderId, uint256 orderAmount)** | order.consumer | blockchain | -| Replenishment of the deposit by the customer. Normally required when renewing a rental. It can also be used to obtain additional results if that is supported by the provider’s offer. | | | +| Replenishment of the deposit by the customer. Normally required when renewing a rental. It can also be used to obtain additional results if that is supported by the provider's offer. | | | | **withdrawProfit(guid orderId) public** | order.provider.tokenReceiver | SDK + blockchain | | Order profit withdrawal by the provider. Available after the order is executed. In this case, the profit is transferred to deferred payments for the number of days specified in the protocol settings (_profitWithdrawDelayDays_). | | | | **withdrawChange(guid orderId) public** | order.consumer | SDK + blockchain | diff --git a/docs/whitepaper/high-level-description.md b/docs/whitepaper/high-level-description.md index 5a660198..6f7a05fe 100644 --- a/docs/whitepaper/high-level-description.md +++ b/docs/whitepaper/high-level-description.md @@ -9,7 +9,7 @@ sidebar_position: 5

-From a bird’s eye view, Super Protocol involves the interactions shown in the above diagram. The interactions include the following entities: +From a bird's eye view, Super Protocol involves the interactions shown in the above diagram. The interactions include the following entities: - **Provider Offers.** In a form of a provider offer, the provider offers their resources or values in exchange for a certain reward. The offer can fall into one of three categories: - **Input.** Offers of this type are used for cooperative processing within a trusted execution environment (TEE). These can be data offers or solution offers. diff --git a/docs/whitepaper/target-audience.md b/docs/whitepaper/target-audience.md index 3be24d01..9e2b8787 100644 --- a/docs/whitepaper/target-audience.md +++ b/docs/whitepaper/target-audience.md @@ -24,7 +24,7 @@ Super Protocol is very unique in a way that it allows equipment owners to engage Data in the modern world is being created everywhere, while new, more advanced processing algorithms allow for an ever larger number of ways to use this data. However, there are quite a few challenges here. Obviously, large volumes of data are not originally meant to be public, which means it requires anonymization or confidential computing. -High-quality anonymization is not always possible without losing data utility. Additionally, many of today’s analytical tools enable successful [data de-anonymization](https://www.cs.utexas.edu/~shmat/shmat_oak09.pdf) under many different circumstances: “To demonstrate its effectiveness on real-world networks, we show that a third of the users who can be verified to have accounts on both Twitter, a popular microblogging service, and Flickr, an online photo-sharing site, can be re-identified in the anonymous Twitter graph with only a 12% error rate.” +High-quality anonymization is not always possible without losing data utility. Additionally, many of today's analytical tools enable successful [data de-anonymization](https://www.cs.utexas.edu/~shmat/shmat_oak09.pdf) under many different circumstances: “To demonstrate its effectiveness on real-world networks, we show that a third of the users who can be verified to have accounts on both Twitter, a popular microblogging service, and Flickr, an online photo-sharing site, can be re-identified in the anonymous Twitter graph with only a 12% error rate.” Almost any data owner would benefit from monetizing it—as long as it does not harm their business as a whole. This is borne out by the widespread development of technologies for analyzing big data. From 8c8f617de8623f586c2d1eba81e37679c89c6f04 Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Thu, 4 Dec 2025 12:57:52 -0300 Subject: [PATCH 04/13] cli: corrections to fine-tune and collaboration (Vlad's) --- docs/cli/Guides/collaboration.md | 25 ++++++++++----------- docs/cli/Guides/confidential-fine-tuning.md | 24 +++++++++----------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/docs/cli/Guides/collaboration.md b/docs/cli/Guides/collaboration.md index 100835d3..c0fecb6f 100644 --- a/docs/cli/Guides/collaboration.md +++ b/docs/cli/Guides/collaboration.md @@ -42,9 +42,8 @@ sequenceDiagram note over Alice,Blockchain: Execution Alice ->>+ Super Protocol / TEE: 8. Place an order - Super Protocol / TEE ->> Storage: Download the solution - Bob ->> Super Protocol / TEE: 9. Complete the data suborder - Super Protocol / TEE ->> Storage: Download the dataset + Bob ->> Super Protocol / TEE: 9. Approve the usage of the dataset + Super Protocol / TEE ->> Storage: Download the solution and dataset Super Protocol / TEE ->> Blockchain: Publish the order report Super Protocol / TEE ->> Super Protocol / TEE: Process the order Super Protocol / TEE ->>- Storage: Upload the order results @@ -57,23 +56,23 @@ sequenceDiagram **Preparation** -Alice builds a solution—a Docker image containing her script (1). She uploads the solution using SPCTL (2) and grants Bob access for verification (3). +Alice builds a solution—a Docker image containing her script ([1](/cli/guides/collaboration#alice-1-build-a-solution)). She uploads the solution using SPCTL ([2](/cli/guides/collaboration#alice-2-upload-the-solution)) and grants Bob access for verification ([3](/cli/guides/collaboration#alice-3-send-the-solution-to-bob)). -Bob (or an independent auditor) downloads the solution (4) and verifies that it is safe to process his data (5). +Bob (or an independent auditor) downloads the solution ([4](/cli/guides/collaboration#bob-4-download-the-solution)) and verifies that it is safe to process his data ([5](/cli/guides/collaboration#bob-5-verify-the-solution)). -Bob uploads his dataset to remote storage using SPCTL (6). The dataset is automatically encrypted during upload, and only Bob holds the key. +Bob uploads his dataset to remote storage using SPCTL ([6](/cli/guides/collaboration#bob-6-upload-the-dataset)). The dataset is automatically encrypted during upload, and only Bob holds the key. -Bob creates an offer on the Marketplace (7). The offer requires Bob's manual approval for use. He shares the offer's IDs with Alice. +Bob creates an offer on the Marketplace ([7](/cli/guides/collaboration#bob-7-create-an-offer)). The offer requires Bob's manual approval for use. He shares the offer's IDs with Alice. **Execution** -Alice places an order on Super Protocol using her solution and Bob's offer ID (8). The order remains **Blocked** by the data suborder. +Alice places an order on Super Protocol using her solution and Bob's offer ID ([8](/cli/guides/collaboration#alice-8-place-an-order)). The order remains **Blocked** by the data suborder. -Bob manually completes the data suborder (9). The command includes the verified solution hash. Completion succeeds only if this hash matches the actual solution hash, meaning the solution was not altered. +Bob manually approves the usage of his dataset for the image with a specific hash ([9](/cli/guides/collaboration#bob-9-complete-the-data-suborder)). If this hash matches the actual solution hash, the CVM begins to process the order. If the hashes do not match, the order will be terminated with an error. -Once the computation finishes, Alice can download the result (10). All the data within the TEE (solution, dataset, order results, etc.) is automatically deleted. +Once the computation finishes, Alice can download the result ([10](/cli/guides/collaboration#alice-10-download-the-order-results)). All the data within the TEE (solution, dataset, order results, etc.) is automatically deleted. -Both Alice and Bob can retrieve the order report (11) that confirms the authenticity of the entire trusted setup. +Both Alice and Bob can retrieve the order report ([11](/cli/guides/collaboration#alice-and-bob-11-get-the-order-report)) that confirms the authenticity of the entire trusted setup. ## Prerequisites @@ -112,7 +111,7 @@ You can find several Dockerfile examples in the [Super-Protocol/solutions](https 1.2. Build an image: ```shell -docker build -t . +docker build --platform linux/amd64 -t . ``` Replace `` with the name of your solution. @@ -326,7 +325,7 @@ If the order ended up with an error, the results will contain execution logs tha ### Alice and Bob: 11. Get the order report -You can get the order report as soon as the order status becomes `Processing` without waiting for the order to complete: +You can get the order report as soon as the CVM downloads the order components and starts the execution, without waiting for the order to complete: ```shell ./spctl orders get-report --save-to report.json diff --git a/docs/cli/Guides/confidential-fine-tuning.md b/docs/cli/Guides/confidential-fine-tuning.md index b67708ed..c3832876 100644 --- a/docs/cli/Guides/confidential-fine-tuning.md +++ b/docs/cli/Guides/confidential-fine-tuning.md @@ -54,13 +54,13 @@ sequenceDiagram actor Alice actor Bob participant Storage - participant Super Protocol / TEE + participant Super Protocol - note over Alice,Super Protocol / TEE: Prepare the data + note over Alice,Super Protocol: Prepare the data Alice ->> Storage: 6. Upload the model Bob ->> Storage: 7. Upload the dataset - Bob ->> Super Protocol / TEE: 8. Create an offer + Bob ->> Super Protocol: 8. Create an offer ```
@@ -81,10 +81,8 @@ sequenceDiagram note over Alice,Blockchain: Execute Alice ->>+ Super Protocol / TEE: 9. Place an order - Super Protocol / TEE ->> Storage: Download the solution - Super Protocol / TEE ->> Storage: Download the model - Bob ->> Super Protocol / TEE: 10. Complete the suborder - Super Protocol / TEE ->> Storage: Download the dataset + Bob ->> Super Protocol / TEE: 10. Approve the usage of the dataset + Super Protocol / TEE ->> Storage: Download the solution, model, and dataset Super Protocol / TEE ->> Blockchain: Publish the order report Super Protocol / TEE ->> Super Protocol / TEE: Process the order Super Protocol / TEE ->>- Storage: Upload the order results @@ -94,13 +92,11 @@ sequenceDiagram ```
-Alice places an order on Super Protocol ([9](/cli/guides/fine-tune#alice-9-place-an-order)), adding the solution, her model, and Bob's offer. The order does not proceed automatically and remains `Blocked` by the data suborder with Bob's dataset. - -Bob manually completes the respective data suborder ([10](/cli/guides/fine-tune#bob-10-complete-the-data-suborder)). The command he uses includes the solution hash. The completion will be successful only if this hash matches the actual solution hash. +Alice places an order on Super Protocol ([9](/cli/guides/fine-tune#alice-9-place-an-order)), adding the solution, her model, and Bob's offer. The order does not proceed automatically and remains `Blocked`. -If the suborder is completed successfully, the execution of the main order proceeds. +Bob manually approves the usage of his dataset for the image with a specific hash ([10](/cli/guides/fine-tune#bob-10-complete-the-data-suborder)). If this hash matches the actual solution hash, the CVM begins to process the order. If the hashes do not match, the order will be terminated with an error. -When the main order is complete, Alice downloads the result ([11](/cli/guides/fine-tune#alice-11-download-the-order-results)). All the data within the TEE (solution, AI model, dataset, order results, etc.) is automatically deleted. +When the order is complete, Alice downloads the result ([11](/cli/guides/fine-tune#alice-11-download-the-order-results)). All the data within the TEE (solution, AI model, dataset, order results, etc.) is automatically deleted. Both Alice and Bob can retrieve the order report ([12](/cli/guides/fine-tune#alice-and-bob-12-get-the-order-report)) that confirms the authenticity of the entire trusted setup. @@ -149,7 +145,7 @@ You can find several Dockerfile examples in the [Super-Protocol/solutions](https 1.2. Build an image: ```shell -docker build -t . +docker build --platform linux/amd64 -t . ``` Replace `` with the name of your solution. @@ -386,7 +382,7 @@ If the order ended up with an error, the results will contain execution logs tha ### Alice and Bob: 12. Get the order report -You can get the order report as soon as the order status becomes `Processing` without waiting for the order to complete: +You can get the order report as soon as the CVM downloads the order components and starts the execution, without waiting for the order to complete: ```shell ./spctl orders get-report --save-to report.json From 8a30a927583a9996371984560926c372fa77e1ca Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Thu, 11 Dec 2025 13:41:20 -0300 Subject: [PATCH 05/13] cli: add solutions guides --- .../Guides/Solutions/comfyui.md} | 26 +-- docs/cli/Guides/Solutions/tgwui.md | 6 + docs/cli/Guides/Solutions/unsloth.md | 189 ++++++++++++++++++ docs/cli/Guides/Solutions/vllm.md | 101 ++++++++++ docs/cli/Guides/collaboration.md | 10 +- docs/cli/Guides/confidential-fine-tuning.md | 20 +- docs/cli/Guides/provider-tools.md | 2 +- docs/cli/Guides/quick-guide.md | 16 +- docs/cli/index.md | 3 +- docs/guides/index.md | 19 +- docs/marketplace/Guides/deploy-model.md | 2 +- 11 files changed, 352 insertions(+), 42 deletions(-) rename docs/{marketplace/Guides/prepare-comfyui.md => cli/Guides/Solutions/comfyui.md} (91%) create mode 100644 docs/cli/Guides/Solutions/tgwui.md create mode 100644 docs/cli/Guides/Solutions/unsloth.md create mode 100644 docs/cli/Guides/Solutions/vllm.md diff --git a/docs/marketplace/Guides/prepare-comfyui.md b/docs/cli/Guides/Solutions/comfyui.md similarity index 91% rename from docs/marketplace/Guides/prepare-comfyui.md rename to docs/cli/Guides/Solutions/comfyui.md index 5b8dc8eb..aa1cab11 100644 --- a/docs/marketplace/Guides/prepare-comfyui.md +++ b/docs/cli/Guides/Solutions/comfyui.md @@ -1,14 +1,14 @@ --- -id: "prepare-comfyui" -title: "Prepare a ComfyUI Workflow" -slug: "/guides/prepare-comfyui" -sidebar_position: 5 +id: "comfyui" +title: "ComfyUI" +slug: "/guides/solutions/comfyui" +sidebar_position: 2 --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -This guide provides step-by-step instructions for preparing a **ComfyUI** workflow with custom nodes before uploading it. For security reasons, you cannot upload custom nodes directly to a deployed ComfyUI. +This guide provides step-by-step instructions for preparing a **ComfyUI** workflow with custom nodes to run on Super Protocol. For security reasons, you cannot upload custom nodes directly to a deployed ComfyUI. :::note @@ -28,7 +28,7 @@ You can prepare your model, workflow, and custom node files manually or using Do 1. Clone the [Super-Protocol/solutions](https://github.com/Super-Protocol/solutions/) GitHub repository to the location of your choosing: - ``` + ```shell git clone https://github.com/Super-Protocol/solutions.git --depth 1 ``` @@ -54,13 +54,13 @@ You can prepare your model, workflow, and custom node files manually or using Do Access the running container with the following command: - ``` + ```shell docker exec -it comfyui bash ``` Go to the `models` directory inside the container and download the model files to the corresponding subdirectories using the `wget` command. For example: - ``` + ```shell wget https://huggingface.co/prompthero/openjourney/resolve/main/mdjrny-v4.safetensors ``` @@ -68,7 +68,7 @@ You can prepare your model, workflow, and custom node files manually or using Do If you have the model on your computer, copy its files to the container using the following command: - ``` + ```shell docker cp comfyui: ``` @@ -77,7 +77,7 @@ You can prepare your model, workflow, and custom node files manually or using Do For example: - ``` + ```shell docker cp ~/Downloads/openjourney/mdjrny-v4.safetensors comfyui:/opt/ComfyUI/models/checkpoints/mdjrny-v4.safetensors ``` @@ -87,7 +87,7 @@ You can prepare your model, workflow, and custom node files manually or using Do 8. Unpack the archive using the following command: - ``` + ```shell tar -xvzf snapshot.tar.gz -C ``` @@ -159,6 +159,6 @@ You can prepare your model, workflow, and custom node files manually or using Do
-## Contact Super Protocol +## Support -If you face any issues, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/Guides/Solutions/tgwui.md b/docs/cli/Guides/Solutions/tgwui.md new file mode 100644 index 00000000..d6ce3bb0 --- /dev/null +++ b/docs/cli/Guides/Solutions/tgwui.md @@ -0,0 +1,6 @@ +--- +id: "tgwui" +title: "Text Generation WebUI" +slug: "/guides/solutions/tgwui" +sidebar_position: 1 +--- \ No newline at end of file diff --git a/docs/cli/Guides/Solutions/unsloth.md b/docs/cli/Guides/Solutions/unsloth.md new file mode 100644 index 00000000..02d0b996 --- /dev/null +++ b/docs/cli/Guides/Solutions/unsloth.md @@ -0,0 +1,189 @@ +--- +id: "unsloth" +title: "Unsloth" +slug: "/guides/solutions/unsloth" +sidebar_position: 3 +--- + +This guide provides step-by-step instructions for fine-tuning an AI model using the Super Protocol packaging of [Unsloth](https://unsloth.ai/), an open-source framework for LLM fine-tuning and reinforcement learning. + +The solution allows you to run fine-tuning within Super Protocol's Trusted Execution Environment (TEE). This provides enhanced security and privacy and enables a range of [confidential collaboration](https://docs.develop.superprotocol.com/cli/guides/fine-tune) scenarios. + +## Prerequisites + +- [SPCTL](https://docs.develop.superprotocol.com/cli/) +- Git +- BNB and SPPI tokens (opBNB) to pay for transactions and orders + +## Repository + +Clone the repository with Super Protocol solutions: + +```shell +git clone https://github.com/Super-Protocol/solutions.git +``` + +The Unsloth solution includes a Dockerfile and a helper script `run-unsloth.sh` that facilitates workflow creation. Note that `run-unsloth.sh` does not build an image and instead uses a pre-existing solution offer. + +## run-unsloth.sh + +Copy SPCTL’s binary and its `config.json` to the `unsloth/scripts` directory inside the cloned Super-Protocol/solutions repository. + +### 1. Prepare training scripts + +When preparing your training scripts, keep in mind the special file structure within the TEE: + +| **Location** | **Purpose** | **Access** | +| :- | :- | :- | +| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
etc. | Possible data locations
(AI model, dataset, training scripts, etc.) | Read-only | +| `/sp/output` | Output directory for results | Read and write | +| `/sp/certs` | Contains the order certificate, private key, and `workloadInfo` | Read-only | + +Your scripts must find the data in `/sp/inputs` and write the results to `/sp/output`. + +### 2. Place an order + +2.1. Initiate a dialog to construct and place an order: + +```shell +./run-unsloth.sh +``` + +2.2. `Enter TEE offer id (number)`: Enter a compute offer ID. This determines the available compute resources and cost of your order. You can find the full list of available compute offers on the [Marketplace](https://marketplace.superprotocol.com/). + +2.3. `Choose run mode`: `1) file`. + +2.4. `Select the model option`: + +- `1) Medgemma 27b (offer 15900)`: Select this option if you need an untuned MedGemma 27B. +- `2) your model`: Select this option to use another model. Further, when prompted about `Model input`, enter one of the following: + - a path to the model's resource JSON file, if it was already uploaded with SPCTL + - model offer ID, if the model exists on the Marketplace + - a path to the local directory with the model to upload it using SPCTL. +- `3) no model`: No model will be used. + +2.5. `Enter path to a .py/.ipynb file OR a directory`: Enter the path to your training script (file or directory). For a directory, select the file to run (entrypoint) when prompted. Note that you cannot reuse resource files in this step; scripts should be uploaded every time. + +2.6. `Provide your dataset as a resource JSON path, numeric offer id, or folder path`: As with the model, enter one of the following: + +- a path to the dataset's resource JSON file, if it was already uploaded with SPCTL +- dataset offer ID, if the dataset exists on the Marketplace +- a path to the local directory with the dataset to upload it using SPCTL. + +2.7. `Upload SPCTL config file as a resource?`: Answer `N` unless you need to use SPCTL from within the TEE during the order execution. In this case, your script should run a `curl` command to download SPCTL and find the uploaded `config.json` in the `/sp/inputs/` subdirectories. + +2.8. Wait for the order to be created and find the order ID in the output, for example: + +```shell +Unsloth order id: 259126 +Done. +``` + +### 3. Check the order result + +3.1. The order will take some time to complete. Check the order status: + +```shell +./spctl orders get +``` + +Replace `` with your order ID. + +If you lost the order ID, check all your orders to find it: + +```shell +./spctl orders list --my-account --type tee +``` + +3.2. When the order status is `Done` or `Error`, download the result: + +```shell +./spctl orders download-result +``` + +The downloaded TAR.GZ archive contains the results in the `output` directory and execution logs. + +## Dry run + +```shell +./run-unsloth.sh --suggest-only +``` + +The option `--suggest-only` allows you to perform a dry run without actually uploading files and creating orders. + +Complete the dialog, as usual; only use absolute paths. + +In the output, you will see a prepared command for running the script non-interactively, allowing you to easily modify the variables and avoid re-entering the dialog. For example: + +```shell +RUN_MODE=file \ +RUN_DIR=/home/user/Downloads/yma-run \ +RUN_FILE=sft_example.py \ +DATA_RESOURCE=/home/user/unsloth/scripts/yma_data_example-data.json \ +MODEL_RESOURCE=/home/user/unsloth/scripts/medgemma-27b-ft-merged.resource.json \ +/home/user/unsloth/scripts/run-unsloth.sh \ +--tee 8 \ +--config ./config.json +``` + +## Jupyter Notebook + +You can launch and use Jupyter Notebook instead of uploading training scripts directly. + +Initiate a dialog: + +```shell +./run-unsloth.sh +``` + +When prompted: + +1. `Enter TEE offer id`: Enter a compute offer ID. This determines the available compute resources and cost of your order. You can find the full list of available compute offers on the [Marketplace](https://marketplace.superprotocol.com/). + +2. `Choose run mode`: `2) jupyter-server`. + +3. `Select the model option`: + +- `1) Medgemma 27b (offer 15900)`: Select this option if you need an untuned MedGemma 27B. +- `2) your model`: Select this option to use another model. Further, when prompted about `Model input`, enter one of the following: + - a path to the model's resource JSON file, if it was already uploaded with SPCTL + - model offer ID, if the model exists on the Marketplace + - a path to the local directory with the model to upload it using SPCTL. +- `3) no model`: No model will be used. + +4. `Enter Jupyter password` or press Enter to proceed without a password. + +5. `Select domain option`: + +- `1) Temporary Domain (*.superprotocol.io)` is suitable for testing and quick deployments. +- `2) Own domain` will require you to provide a domain name, TLS certificate, private key, and a tunnel server auth token. + +Wait for the Tunnels Launcher order to be created. + +6. `Provide your dataset as a resource JSON path, numeric offer id, or folder path`: As with the model, enter one of the following: +- a path to the dataset's resource JSON file, if it was already uploaded with SPCTL +- dataset offer ID, if the dataset exists on the Marketplace +- a path to the local directory with the dataset to upload it using SPCTL. + +7. `Upload SPCTL config file as a resource?`: Answer `N` unless you need to use SPCTL from within the TEE during the order execution. In this case, your script should run a `curl` command to download SPCTL and find the uploaded `config.json` in the `/sp/inputs/` subdirectories. + +8. Wait for the Jupyter order to be ready and find a link in the output; for example: + +```shell +=================================================== +Jupyter instance is available at: https://beja-bine-envy.superprotocol.io +=================================================== +``` + +8. Open the link in your browser to access Jupyter’s UI. + +**Note**: + +The data in `/sp/output` will not be published as the order result when running the Jupyter server. To save your fine-tuning results, upload them either: +- via Python code +- using the integrated terminal in the Jupyter server +- using SPCTL with the config uploaded at Step 7. + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/Guides/Solutions/vllm.md b/docs/cli/Guides/Solutions/vllm.md new file mode 100644 index 00000000..cda0ab5d --- /dev/null +++ b/docs/cli/Guides/Solutions/vllm.md @@ -0,0 +1,101 @@ +--- +id: "vllm" +title: "vLLM" +slug: "/guides/solutions/vllm" +sidebar_position: 4 +--- + +This guide provides step-by-step instructions for running an AI model inference using the Super Protocol packaging of [vLLM](https://www.vllm.ai/), an inference and serving engine for LLMs. + +The solution allows you to run LLM inference within Super Protocol's Trusted Execution Environment (TEE). + +## Prerequisites + +- [SPCTL](https://docs.develop.superprotocol.com/cli/) +- Git +- BNB and SPPI tokens (opBNB) to pay for transactions and orders + +## Repository + +Clone the repository with Super Protocol solutions: + +```shell +git clone https://github.com/Super-Protocol/solutions.git +``` + +The vLLM solution includes a Dockerfile and a helper script `run-vllm.sh` that facilitates workflow creation. Note that `run-vllm.sh` does not build an image and instead uses a pre-existing solution offer. + +## run-vllm.sh + +Copy SPCTL’s binary and its `config.json` to the `vllm/scripts` directory inside the cloned Super-Protocol/solutions repository. + +### Place an order + +1. Initiate a dialog to construct and place an order: + +```shell +./run-vllm.sh +``` + +2. `Select domain option`: + +- `1) Temporary Domain (*.superprotocol.io)` is suitable for testing and quick deployments. +- `2) Own domain` will require you to provide a domain name, TLS certificate, private key, and a tunnel server auth token. + +3. `Enter TEE offer id`: Enter a compute offer ID. This determines the available compute resources and cost of your order. You can find the full list of available compute offers on the [Marketplace](https://marketplace.superprotocol.com/). + +4. `Provide model as resource JSON path, numeric offer id, or folder path`: Enter one of the following: + +- a path to the model's resource JSON file, if it was already uploaded with SPCTL +- model offer ID, if the model exists on the Marketplace +- a path to the local directory with the model to upload it using SPCTL. + +5. `Enter API key` or press `Enter` to generate one automatically. + +Wait for the deployment to be ready and find the information about it in the output, for example: + +```shell +=================================================== +VLLM server is available at: https://whau-trug-nail.superprotocol.io +API key: d75c577d-e538-4d09-8f59-a0f00ae961a3 +Order IDs: Launcher=269042, VLLM=269044 +=================================================== +``` + +### API + +Once deployed on Super Protocol, your model runs inside a TEE and exposes an OpenAI-compatible API. You can interact with it as you would with a local vLLM instance. + +Depending on the type of request you want to make, use the following API endpoints: + +- Chat Completions (`/v1/chat/completions`) +- Text Completions (`/v1/completions`) +- Embeddings (`/v1/embeddings`) +- Audio Transcriptions & Translations (`/v1/audio/transcriptions`, `/v1/audio/translations`) + +See the [full list of API endpoints](https://docs.vllm.ai/en/latest/serving/openai_compatible_server/). + +## Dry run + +```shell +./run-vllm.sh --suggest-only +``` + +The option `--suggest-only` allows you to perform a dry run without actually uploading files and creating orders. + +Complete the dialog, as usual; only use absolute paths. + +In the output, you will see a prepared command for running the script non-interactively, allowing you to easily modify the variables and avoid re-entering the dialog. For example: + +```shell +RUN_MODE=temporary \ +MODEL_RESOURCE=55 \ +VLLM_API_KEY=9c6dbf44-cef7-43a4-b362-43295b244446 \ +/home/user/vllm/scripts/run-vllm.sh \ +--config ./config.json \ +--tee 8 +``` + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/Guides/collaboration.md b/docs/cli/Guides/collaboration.md index c0fecb6f..b6540bab 100644 --- a/docs/cli/Guides/collaboration.md +++ b/docs/cli/Guides/collaboration.md @@ -92,11 +92,11 @@ Both Alice and Bob can retrieve the order report ([11](/cli/guides/collaboration 1.1. Write a Dockerfile that creates an image with your code. Keep in mind the special file structure inside the TEE: -| **Location** | **Purpose** | **Access** | -| :- | :- | :- | -| `/sp/inputs/input-0001/`
`/sp/inputs/input-0002/`
etc. | Possible data locations | Read-only | -| `/sp/output/` | Output directory for results | Write; read own files | -| `/sp/certs/` | Contains the order certificate | Read-only | +| **Location** | **Purpose** | **Access** | +| :- | :- | :- | +| `/sp/inputs/input-0001/`
`/sp/inputs/input-0002/`
etc. | Possible data locations | Read-only | +| `/sp/output/` | Output directory for results | Write; read own files | +| `/sp/certs/` | Contains the order certificate, private key, and workloadInfo | Read-only | Your scripts must find the data in `/sp/inputs/` and write the results to `/sp/output/`. diff --git a/docs/cli/Guides/confidential-fine-tuning.md b/docs/cli/Guides/confidential-fine-tuning.md index c3832876..f68d7f63 100644 --- a/docs/cli/Guides/confidential-fine-tuning.md +++ b/docs/cli/Guides/confidential-fine-tuning.md @@ -1,21 +1,21 @@ --- id: "fine-tune" -title: "Confidential Fine-Tuning" +title: "Confidential Collaboration" slug: "/guides/fine-tune" sidebar_position: 3 --- Super Protocol enables independent parties to jointly compute over their private inputs without revealing those inputs to one another. -This guide describes an example of confidential collaboration on Super Protocol: a fine-tuning of a pre-trained AI model. The scenario involves three parties: +This guide describes a scenario of confidential collaboration on Super Protocol. It uses fine-tuning of a pre-trained AI model as an example, but the general principle presented here may be applied to other cases. + +The scenario involves three parties: - **Alice** owns the AI model. - **Bob** owns the dataset. - **Carol** provides the training engine and scripts. -Neither Alice nor Bob is willing to share their intellectual property with other parties. At the same time, Carol must share her training engine and scripts with both parties so they can verify that the code is safe to run on their data. - -If Carol's training engine or scripts are proprietary and she cannot share them with Alice and Bob, a possible alternative is to involve independent security experts who can audit the code without exposing it publicly. +Neither Alice nor Bob is willing to share their intellectual property with other parties. At the same time, Carol must share her training engine and scripts with both parties so they can verify that the code is safe to run on their data. If Carol's training engine or scripts are proprietary and she cannot share them with Alice and Bob, a possible alternative is to involve independent security experts who can audit the code without exposing it publicly. The computation runs on Super Protocol within a Trusted Execution Environment that is isolated from all external access, including that of Alice, Bob, Carol, the hardware owner, and the Super Protocol team. Additionally, Super Protocol's Certification System provides verifiability, eliminating the need for trust. @@ -124,11 +124,11 @@ Both Alice and Bob can retrieve the order report ([12](/cli/guides/fine-tune#ali Keep in mind the special file structure inside the TEE: -| **Location** | **Purpose** | **Access** | -| :- | :- | :- | -| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
etc. | Possible data locations
(AI model, dataset, training scripts, etc.) | Read-only | -| `/sp/output` | Output directory for results | Write; read own files | -| `/sp/certs` | Contains the order certificate | Read-only | +| **Location** | **Purpose** | **Access** | +| :- | :- | :- | +| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
etc. | Possible data locations
(AI model, dataset, training scripts, etc.) | Read-only | +| `/sp/output` | Output directory for results | Read and write | +| `/sp/certs` | Contains the order certificate, private key, and workloadInfo | Read-only | Your solution must find the data in `/sp/inputs` and write the results to `/sp/output`. diff --git a/docs/cli/Guides/provider-tools.md b/docs/cli/Guides/provider-tools.md index b6cd6b72..3b18dd60 100644 --- a/docs/cli/Guides/provider-tools.md +++ b/docs/cli/Guides/provider-tools.md @@ -36,7 +36,7 @@ chmod +x ./provider-tools -## Set Up +## Set up ```shell ./provider-tools setup diff --git a/docs/cli/Guides/quick-guide.md b/docs/cli/Guides/quick-guide.md index 801e8523..0092c4a8 100644 --- a/docs/cli/Guides/quick-guide.md +++ b/docs/cli/Guides/quick-guide.md @@ -18,11 +18,11 @@ This quick guide provides instructions on deploying a TEE: -| **Location** | **Purpose** | **Access** | -| :- | :- | :- | -| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
etc. | Possible data locations | Read-only | -| `/sp/output` | Output directory for results | Write; read own files | -| `/sp/certs` | Contains the order certificate | Read-only | +| **Location** | **Purpose** | **Access** | +| :- | :- | :- | +| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
etc. | Possible data locations | Read-only | +| `/sp/output` | Output directory for results | Write; read own files | +| `/sp/certs` | Contains the order certificate, private key, and workloadInfo | Read-only | So, your solution must find the data in `/sp/inputs` and write the results to `/sp/output`. @@ -156,4 +156,8 @@ For example: ```shell ./spctl orders download-result 256587 -``` \ No newline at end of file +``` + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/index.md b/docs/cli/index.md index 39e44e41..c2d013d9 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -41,7 +41,7 @@ import TabItem from '@theme/TabItem'; You can also download and install SPCTL manually from the Super Protocol [GitHub repository](https://github.com/Super-Protocol/ctl). -## Set Up +## Set up You can set up SPCTL using the `./spctl setup` command or by manually creating a configuration file. @@ -103,7 +103,6 @@ You can set up SPCTL using the `./spctl setup` command or by manually creating a } } } - ``` 3. Do not change the preconfigured values and set values to the following keys: diff --git a/docs/guides/index.md b/docs/guides/index.md index 69d2473a..dd581766 100644 --- a/docs/guides/index.md +++ b/docs/guides/index.md @@ -7,18 +7,29 @@ sidebar_position: 0 ## Marketplace GUI -|
**Guide**
|
**Description**
| +|
**Guide**
|
**Description**
| | :- | :- | | [Log In with MetaMask](/marketplace/guides/log-in) | How to log in to the [Marketplace](https://marketplace.superprotocol.com/) using MetaMask. | | [Log In with Trust Wallet](/marketplace/guides/log-in-trustwallet) | How to log in to the Marketplace using Trust Wallet. | | [Deploy Your Model](/marketplace/guides/deploy-model) | How to upload and deploy an AI model on Super Protocol. | | [Publish an Offer](/marketplace/guides/publish-offer) | How to upload an AI model and publish it on the Marketplace. | -| [Prepare a ComfyUI Workflow](/marketplace/guides/prepare-comfyui) | How to prepare a ComfyUI workflow with custom nodes. | | [Set Up Personal Storage](/marketplace/guides/storage) | How to set up your personal Storj account. | | [Troubleshooting](/marketplace/guides/troubleshooting) | Most common issues and ways to fix them. | ## CLI -|
**Guide**
|
**Description**
| +|
**Guide**
|
**Description**
| +| :- | :- | +| [Configure SPCTL](/cli) | How to set up SPCTL—a Super Protocol CLI tool. | +| [Configure Provider Tools](/cli/guides/provider-tools) | How to set up Provider Tools—a Super Protocol CLI utility for registering providers and creating offers. | +| [Quick Deployment Guide](/cli/guides/quick-guide) | Quick instructions on deploying a solution and data on Super Protocol. | +| [Confidential Collaboration](/cli/guides/fine-tune) | A scenario of confidential collaboration on Super Protocol. | + +### Solutions + +|
**Guide**
|
**Description**
| | :- | :- | -| [Quick Deployment Guide](/cli/guides/quick-guide) | Quick instructions on deploying a solution and data on Super Protocol. | \ No newline at end of file +| [Text Generation WebUI](/cli/guides/solutions/tgwui) | How to deploy a model using Text Generation WebUI. | +| [ComfyUI](/cli/guides/solutions/comfyui) | How to prepare a ComfyUI workflow with custom nodes. | +| [Unsloth](/cli/guides/solutions/unsloth) | How to fine-tune an AI model using the Super Protocol packaging of Unsloth. | +| [vLLM](/cli/guides/solutions/vllm) | How to run a model inference using the Super Protocol packaging of vLLM. | \ No newline at end of file diff --git a/docs/marketplace/Guides/deploy-model.md b/docs/marketplace/Guides/deploy-model.md index f5b6a77e..d3b0b389 100644 --- a/docs/marketplace/Guides/deploy-model.md +++ b/docs/marketplace/Guides/deploy-model.md @@ -33,7 +33,7 @@ Ensure your model meets the Super Protocol requirements: - Text-to-Video - Mask Generation -If you plan to deploy a ComfyUI workflow with custom nodes, [prepare the files](/marketplace/guides/prepare-comfyui) before uploading. For security reasons, you cannot upload custom nodes directly to a deployed ComfyUI. +If you plan to deploy a ComfyUI workflow with custom nodes, [prepare the files](/cli/guides/solutions/comfyui) before uploading. For security reasons, you cannot upload custom nodes directly to a deployed ComfyUI. 1.2. Due to [testnet limitations](/marketplace/limitations), the total size of model files should not exceed 13 GB. Support for bigger models will be available in the future. From a44a4007005cdf9cc3f633fe2b546b95c712dfff Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Thu, 11 Dec 2025 13:41:20 -0300 Subject: [PATCH 06/13] cli: add solutions guides --- docs/cli/Guides/collaboration.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/cli/Guides/collaboration.md b/docs/cli/Guides/collaboration.md index b6540bab..5c593118 100644 --- a/docs/cli/Guides/collaboration.md +++ b/docs/cli/Guides/collaboration.md @@ -48,9 +48,10 @@ sequenceDiagram Super Protocol / TEE ->> Super Protocol / TEE: Process the order Super Protocol / TEE ->>- Storage: Upload the order results Alice ->> Storage: 10. Download the order results + end + Alice ->> Blockchain: 11. Get the order report Bob ->> Blockchain: 11. Get the order report - end ```
From a5020f560ffd32c2b7b374e88b16f53e0451dba6 Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Mon, 5 Jan 2026 11:21:59 -0300 Subject: [PATCH 07/13] whitepaper and cli-tgwui guide hidden --- docs/cli/Guides/Solutions/tgwui.md | 2 ++ docs/fundamentals/certification.md | 2 +- docusaurus.config.js | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/cli/Guides/Solutions/tgwui.md b/docs/cli/Guides/Solutions/tgwui.md index d6ce3bb0..ca7c461b 100644 --- a/docs/cli/Guides/Solutions/tgwui.md +++ b/docs/cli/Guides/Solutions/tgwui.md @@ -3,4 +3,6 @@ id: "tgwui" title: "Text Generation WebUI" slug: "/guides/solutions/tgwui" sidebar_position: 1 +displayed_sidebar: null +unlisted: true --- \ No newline at end of file diff --git a/docs/fundamentals/certification.md b/docs/fundamentals/certification.md index 611d5375..a943c6b5 100644 --- a/docs/fundamentals/certification.md +++ b/docs/fundamentals/certification.md @@ -25,7 +25,7 @@ The SubRoot CAs, in turn, issue and sign certificates for Date: Tue, 13 Jan 2026 11:27:50 -0300 Subject: [PATCH 08/13] Update cli guides structure --- docs/cli/Guides/Solutions/tgwui.md | 8 - docs/cli/Guides/collaboration.md | 2 +- docs/cli/Guides/{Solutions => }/comfyui.md | 4 +- ...l-fine-tuning.md => multi-party-collab.md} | 28 +-- docs/cli/Guides/provider-tools.md | 2 +- docs/cli/Guides/quick-guide.md | 4 +- docs/cli/Guides/tgwui.md | 234 ++++++++++++++++++ docs/cli/Guides/{Solutions => }/unsloth.md | 6 +- docs/cli/Guides/{Solutions => }/vllm.md | 8 +- docs/fundamentals/orders.md | 3 +- docs/guides/index.md | 2 +- src/.DS_Store | Bin 6148 -> 0 bytes src/pages/.DS_Store | Bin 6148 -> 0 bytes static/.DS_Store | Bin 6148 -> 0 bytes 14 files changed, 263 insertions(+), 38 deletions(-) delete mode 100644 docs/cli/Guides/Solutions/tgwui.md rename docs/cli/Guides/{Solutions => }/comfyui.md (99%) rename docs/cli/Guides/{confidential-fine-tuning.md => multi-party-collab.md} (83%) create mode 100644 docs/cli/Guides/tgwui.md rename docs/cli/Guides/{Solutions => }/unsloth.md (98%) rename docs/cli/Guides/{Solutions => }/vllm.md (92%) delete mode 100644 src/.DS_Store delete mode 100644 src/pages/.DS_Store delete mode 100644 static/.DS_Store diff --git a/docs/cli/Guides/Solutions/tgwui.md b/docs/cli/Guides/Solutions/tgwui.md deleted file mode 100644 index ca7c461b..00000000 --- a/docs/cli/Guides/Solutions/tgwui.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -id: "tgwui" -title: "Text Generation WebUI" -slug: "/guides/solutions/tgwui" -sidebar_position: 1 -displayed_sidebar: null -unlisted: true ---- \ No newline at end of file diff --git a/docs/cli/Guides/collaboration.md b/docs/cli/Guides/collaboration.md index 5c593118..47e5a7d8 100644 --- a/docs/cli/Guides/collaboration.md +++ b/docs/cli/Guides/collaboration.md @@ -1,6 +1,6 @@ --- id: "collaboration" -title: "Confidential Collaboration" +title: "Two-party Collaboration" slug: "/guides/collaboration" displayed_sidebar: null unlisted: true diff --git a/docs/cli/Guides/Solutions/comfyui.md b/docs/cli/Guides/comfyui.md similarity index 99% rename from docs/cli/Guides/Solutions/comfyui.md rename to docs/cli/Guides/comfyui.md index aa1cab11..ddc23efb 100644 --- a/docs/cli/Guides/Solutions/comfyui.md +++ b/docs/cli/Guides/comfyui.md @@ -1,8 +1,8 @@ --- id: "comfyui" -title: "ComfyUI" +title: "Custom ComfyUI Workflow" slug: "/guides/solutions/comfyui" -sidebar_position: 2 +sidebar_position: 4 --- import Tabs from '@theme/Tabs'; diff --git a/docs/cli/Guides/confidential-fine-tuning.md b/docs/cli/Guides/multi-party-collab.md similarity index 83% rename from docs/cli/Guides/confidential-fine-tuning.md rename to docs/cli/Guides/multi-party-collab.md index f68d7f63..b9176b09 100644 --- a/docs/cli/Guides/confidential-fine-tuning.md +++ b/docs/cli/Guides/multi-party-collab.md @@ -1,13 +1,13 @@ --- id: "fine-tune" -title: "Confidential Collaboration" -slug: "/guides/fine-tune" -sidebar_position: 3 +title: "Multi-Party Collaboration" +slug: "/guides/multi-party-collab" +sidebar_position: 7 --- Super Protocol enables independent parties to jointly compute over their private inputs without revealing those inputs to one another. -This guide describes a scenario of confidential collaboration on Super Protocol. It uses fine-tuning of a pre-trained AI model as an example, but the general principle presented here may be applied to other cases. +This guide describes a scenario of a multi-party confidential collaboration on Super Protocol. It uses fine-tuning of a pre-trained AI model as an example, but the general principle presented here may be applied to other cases. The scenario involves three parties: @@ -41,11 +41,11 @@ sequenceDiagram ```
-Carol builds a
solution—a Docker image containing her training engine and script ([1](/cli/guides/fine-tune#carol-1-build-a-solution)). She uploads the solution using SPCTL ([2](/cli/guides/fine-tune#carol-2-upload-the-solution)) and grants Alice and Bob access for verification ([3](/cli/guides/fine-tune#carol-3-send-the-solution-to-alice-and-bob)). +Carol builds a solution—a Docker image containing her training engine and script ([1](/cli/guides/multi-party-collab#carol-1-build-a-solution)). She uploads the solution using SPCTL ([2](/cli/guides/multi-party-collab#carol-2-upload-the-solution)) and grants Alice and Bob access for verification ([3](/cli/guides/multi-party-collab#carol-3-send-the-solution-to-alice-and-bob)). -Alice and Bob download the solution ([4](/cli/guides/fine-tune#alice-and-bob-4-download-the-solution)) and verify that it is safe to process their data ([5](/cli/guides/fine-tune#alice-and-bob-5-verify-the-solution)). +Alice and Bob download the solution ([4](/cli/guides/multi-party-collab#alice-and-bob-4-download-the-solution)) and verify that it is safe to process their data ([5](/cli/guides/multi-party-collab#alice-and-bob-5-verify-the-solution)). -If Carol cannot share the code with Alice and Bob, and a third-party auditor is involved, the workflow will differ slightly. After uploading, Carol must also create a solution offer on Super Protocol Marketplace (similar to Bob's [Step 8](/cli/guides/fine-tune#bob-8-create-an-offer)). +If Carol cannot share the code with Alice and Bob, and a third-party auditor is involved, the workflow will differ slightly. After uploading, Carol must also create a solution offer on Super Protocol Marketplace (similar to Bob's [Step 8](/cli/guides/multi-party-collab#bob-8-create-an-offer)). **Prepare the data**: @@ -64,9 +64,9 @@ sequenceDiagram ```
-Alice uploads her model ([6](/cli/guides/fine-tune#alice-6-upload-the-model)) and Bob uploads his dataset ([7](/cli/guides/fine-tune#bob-7-upload-the-dataset)) to remote storage using SPCTL. Files are automatically encrypted during upload, and only the uploader holds the key. +Alice uploads her model ([6](/cli/guides/multi-party-collab#alice-6-upload-the-model)) and Bob uploads his dataset ([7](/cli/guides/multi-party-collab#bob-7-upload-the-dataset)) to remote storage using SPCTL. Files are automatically encrypted during upload, and only the uploader holds the key. -Bob creates an offer on the Marketplace ([8](/cli/guides/fine-tune#bob-8-create-an-offer)). The offer requires Bob's manual approval for use. He shares the offer's IDs with Alice. +Bob creates an offer on the Marketplace ([8](/cli/guides/multi-party-collab#bob-8-create-an-offer)). The offer requires Bob's manual approval for use. He shares the offer's IDs with Alice. **Execute**: @@ -92,13 +92,13 @@ sequenceDiagram ```
-Alice places an order on Super Protocol ([9](/cli/guides/fine-tune#alice-9-place-an-order)), adding the solution, her model, and Bob's offer. The order does not proceed automatically and remains `Blocked`. +Alice places an order on Super Protocol ([9](/cli/guides/multi-party-collab#alice-9-place-an-order)), adding the solution, her model, and Bob's offer. The order does not proceed automatically and remains `Blocked`. -Bob manually approves the usage of his dataset for the image with a specific hash ([10](/cli/guides/fine-tune#bob-10-complete-the-data-suborder)). If this hash matches the actual solution hash, the CVM begins to process the order. If the hashes do not match, the order will be terminated with an error. +Bob manually approves the usage of his dataset for the image with a specific hash ([10](/cli/guides/multi-party-collab#bob-10-complete-the-data-suborder)). If this hash matches the actual solution hash, the CVM begins to process the order. If the hashes do not match, the order will be terminated with an error. -When the order is complete, Alice downloads the result ([11](/cli/guides/fine-tune#alice-11-download-the-order-results)). All the data within the TEE (solution, AI model, dataset, order results, etc.) is automatically deleted. +When the order is complete, Alice downloads the result ([11](/cli/guides/multi-party-collab#alice-11-download-the-order-results)). All the data within the TEE (solution, AI model, dataset, order results, etc.) is automatically deleted. -Both Alice and Bob can retrieve the order report ([12](/cli/guides/fine-tune#alice-and-bob-12-get-the-order-report)) that confirms the authenticity of the entire trusted setup. +Both Alice and Bob can retrieve the order report ([12](/cli/guides/multi-party-collab#alice-and-bob-12-get-the-order-report)) that confirms the authenticity of the entire trusted setup. ## Prerequisites @@ -138,7 +138,7 @@ Always use absolute paths, such as `/sp/...`. ::: -You may either include the training scripts in the image or upload them separately using SPCTL. In this case, Alice will need to attach the uploaded scripts to the order as `--data` at [Step 9](/cli/guides/fine-tune#alice-9-place-an-order). +You may either include the training scripts in the image or upload them separately using SPCTL. In this case, Alice will need to attach the uploaded scripts to the order as `--data` at [Step 9](/cli/guides/multi-party-collab#alice-9-place-an-order). You can find several Dockerfile examples in the [Super-Protocol/solutions](https://github.com/Super-Protocol/solutions) GitHub repository. diff --git a/docs/cli/Guides/provider-tools.md b/docs/cli/Guides/provider-tools.md index 3b18dd60..8c6c7f79 100644 --- a/docs/cli/Guides/provider-tools.md +++ b/docs/cli/Guides/provider-tools.md @@ -1,6 +1,6 @@ --- id: "provider-tools" -title: "Configure Provider Tools" +title: "Provider Tools" slug: "/guides/provider-tools" sidebar_position: 1 --- diff --git a/docs/cli/Guides/quick-guide.md b/docs/cli/Guides/quick-guide.md index 0092c4a8..89d14492 100644 --- a/docs/cli/Guides/quick-guide.md +++ b/docs/cli/Guides/quick-guide.md @@ -1,11 +1,11 @@ --- id: "quick-guide" -title: "Quick Deployment Guide" +title: "Deploy Your App" slug: "/guides/quick-guide" sidebar_position: 2 --- -This quick guide provides instructions on deploying a solution and data on Super Protocol. Its purpose is to introduce you to the logic and sequence of the CLI commands. +This quick guide provides instructions on deploying your own solution and data on Super Protocol. Its purpose is to introduce you to the logic and sequence of the CLI commands. ## Prerequisites diff --git a/docs/cli/Guides/tgwui.md b/docs/cli/Guides/tgwui.md new file mode 100644 index 00000000..e12f58ef --- /dev/null +++ b/docs/cli/Guides/tgwui.md @@ -0,0 +1,234 @@ +--- +id: "tgwui" +title: "TGWUI and ComfyUI With Tunnels" +slug: "/guides/solutions/tgwui" +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This guide provides step-by-step instructions for uploading and deploying an AI model on Super Protocol using Text Generation Web UI and ComfyUI, both already available in the Marketplace. However, the general workflow described here can be applied to any solution, whether new or existing. + +## Prerequisites + +- [SPCTL](https://docs.develop.superprotocol.com/cli/) +- BNB and SPPI tokens (opBNB) to pay for transactions and orders + +## 1. Prepare + +Ensure your model meets the Super Protocol requirements: + +1.1. Your model must belong to a category supported by one of the engines. + +**Text Generation Web UI**: + +- Text Generation +- Text Classification +- Translation +- Text2Text Generation + +**ComfyUI**: + +- Image Classification +- Object Detection +- Image Segmentation +- Text-to-Image +- Image-to-Text +- Image-to-Image +- Image-to-Video +- Video Classification +- Text-to-Video +- Mask Generation + +If you plan to deploy a ComfyUI workflow with custom nodes, [prepare the files](/cli/guides/solutions/comfyui) before proceeding to the next step. For security reasons, you cannot upload custom nodes directly to a deployed ComfyUI. + +1.2. Due to [testnet limitations](/marketplace/limitations), the total size of model files should not exceed 13 GB. Support for bigger models will be available in the future. + +## 2. Upload the model + +Upload the model: + +```shell +./spctl files upload \ + --output model.resource.json \ + --use-addon +``` + +Replace `` with the path to the dataset directory, for example: + +```shell +./spctl files upload ~/Downloads/models/SmolLM2-1.7B \ + --output model.resource.json \ + --use-addon +``` + +## 3. Deploy tunnels + +3.1. Place an order to deploy a [confidential tunnel](/fundamentals/tunnels): + +```shell +./spctl workflows create --tee 7 --solution 19 +``` + +3.2. Wait for the order to be created, and find the tunnel order ID in the output, for example: + +```text +Workflow was created, TEE order id: ["273899"] +``` + +3.3. Check the order status: + +```shell +./spctl orders get +``` + +Replace `` with the tunnel order ID from the previous step. + +3.4. When the status is `Done`, download the result: + +```shell +./spctl orders download-result +``` + +3.5. Extract the downloaded `result.tar.gz`, open `output/result.json`, and find the domain address. For example: + +```json title="result.json" +"domain":"pret-tons-wade.superprotocol.io" +``` + +Your model's web UI will be available at this address. + +## 4. Prepare engine configuration files + +4.1. Open the SPCTL's `config.json` and find the `workflow.resultEncryption.key` property that contains the key used for decrypting workflow results; for example: `NapSrwQRz2tL9ZftJbi6DATpCDn0BRImpSStU9xZT/s=`. + +4.2. + + + Create a file named `engine-configuration-tgwui.json` and paste the following: + + ```json title="engine-configuration-tgwui.json" + { + "engine": { + "main_settings": { + "character": { + "name": "Superprotocol AI", + "context": "The following is a conversation with an AI Large Language Model. The AI has been trained to answer questions, provide recommendations, and help with decision making. The AI follows user requests. The AI thinks outside the box.", + "greeting": "How can I help you today?" + }, + "api": {}, + "mode": {} + }, + "model": { + "parameters": { + "temperature": 1, + "top_p": 1, + "top_k": 0, + "typical_p": 1 + }, + "parameters2": { + "min_p": 0.05, + "repetition_penalty": 1, + "frequency_penalty": 0, + "presence_penalty": 0 + } + }, + "model_loader": { + "loader_name": "Autodetect" + } + }, + "tunnels": { + "domain_settings": { + "provision_type": "Temporary Domain (on *.superprotocol.io)", + "tunnel_provisioner_order": { + "order_id": "", + "order_key": "" + } + } + } + } + ``` + + + Create a file named `engine-configuration-comfyui.json` and paste the following: + + ```json title="engine-configuration-comfyui.json" + { + "engine": { + "main_settings": { + "preview_method": "none", + "preview_size": 512 + } + }, + "tunnels": { + "domain_settings": { + "provision_type": "Temporary Domain (on *.superprotocol.io)", + "tunnel_provisioner_order": { + "order_id": "", + "order_key": "" + } + } + } + } + ``` + + + +In `tunnels.domain_settings.tunnel_provisioner_order`, set: + +- `order_id` to your tunnel order ID from Step 3.2 +- `order_key` to your encryption key from Step 4.1 + +Save and close the file. + +## 5. Deploy the model + +5.1. + + + Create the main order to deploy your uploaded model: + + ```shell + ./spctl workflows create --tee --solution 25 --solution-configuration ./engine-configuration-tgwui.json --data ./model.resource.json + ``` + + Replace `` with a selected compute offer. See available compute offer IDs on the [Marketplace](https://marketplace.superprotocol.com/). + + Note that `--solution 25` refers to [Text Generation Web UI with GPU support](https://marketplace.superprotocol.com/marketplace/models?offer=offerId%3D25). If you need the CPU version, use `--solution 26` instead. + + + Create the main order to deploy your uploaded model: + + ```shell + ./spctl workflows create --tee --solution 27 --solution-configuration ./engine-configuration-comfyui.json --data ./model.resource.json + ``` + + Replace `` with a selected compute offer. See available compute offer IDs on the [Marketplace](https://marketplace.superprotocol.com/). + + Note that `--solution 27` refers to [ComfyUI UI with GPU support](https://marketplace.superprotocol.com/marketplace/models?offer=offerId%3D27). If you need the CPU version, use `--solution 28` instead. + + + +5.2. Wait for the order to be created, and find the main order ID in the output, for example: + +```text +Workflow was created, TEE order id: ["273900"] +``` + +5.3. Deployment may take 15-20 minutes or more, depending on the model size and other parameters. Check the domain from Step 3.5 every few minutes until the UI is available. + +If you suspect something went wrong, check the order status: + +```shell +./spctl orders get +``` + +Replace `` with the main order ID from the previous step. + +The most important statuses (see the [full list](/fundamentals/orders#compute-order)): + +- **Processing**: The compute is executing the order inside a TEE. Your model is either already available or will be available soon. +- **In Queue**: The order is waiting for the compute to become available. This status appears only if the compute is overloaded with orders. If this status persists for a few minutes, place a new main order the same tunnel order and engine configuration but another compute offer. +- **Done**: The order is completed successfully and the model's UI is no longer available. +- **Error**: The order completed with an error. [Download the order results](/cli/commands/orders/download-result) to get more information about the error. \ No newline at end of file diff --git a/docs/cli/Guides/Solutions/unsloth.md b/docs/cli/Guides/unsloth.md similarity index 98% rename from docs/cli/Guides/Solutions/unsloth.md rename to docs/cli/Guides/unsloth.md index 02d0b996..24b46110 100644 --- a/docs/cli/Guides/Solutions/unsloth.md +++ b/docs/cli/Guides/unsloth.md @@ -1,13 +1,13 @@ --- id: "unsloth" -title: "Unsloth" +title: "Fine-Tuning With Unsloth" slug: "/guides/solutions/unsloth" -sidebar_position: 3 +sidebar_position: 5 --- This guide provides step-by-step instructions for fine-tuning an AI model using the Super Protocol packaging of [Unsloth](https://unsloth.ai/), an open-source framework for LLM fine-tuning and reinforcement learning. -The solution allows you to run fine-tuning within Super Protocol's Trusted Execution Environment (TEE). This provides enhanced security and privacy and enables a range of [confidential collaboration](https://docs.develop.superprotocol.com/cli/guides/fine-tune) scenarios. +The solution allows you to run fine-tuning within Super Protocol's Trusted Execution Environment (TEE). This provides enhanced security and privacy and enables a range of [confidential collaboration](https://docs.develop.superprotocol.com/cli/guides/multi-party-collab) scenarios. ## Prerequisites diff --git a/docs/cli/Guides/Solutions/vllm.md b/docs/cli/Guides/vllm.md similarity index 92% rename from docs/cli/Guides/Solutions/vllm.md rename to docs/cli/Guides/vllm.md index cda0ab5d..a833a22d 100644 --- a/docs/cli/Guides/Solutions/vllm.md +++ b/docs/cli/Guides/vllm.md @@ -1,13 +1,11 @@ --- id: "vllm" -title: "vLLM" +title: "Inference With vLLM" slug: "/guides/solutions/vllm" -sidebar_position: 4 +sidebar_position: 6 --- -This guide provides step-by-step instructions for running an AI model inference using the Super Protocol packaging of [vLLM](https://www.vllm.ai/), an inference and serving engine for LLMs. - -The solution allows you to run LLM inference within Super Protocol's Trusted Execution Environment (TEE). +This guide provides step-by-step instructions for running an AI model inference using the Super Protocol packaging of [vLLM](https://www.vllm.ai/), an inference and serving engine for LLMs. This solution allows you to run LLM inference within Super Protocol's Trusted Execution Environment (TEE). ## Prerequisites diff --git a/docs/fundamentals/orders.md b/docs/fundamentals/orders.md index 5bd30508..8532ed07 100644 --- a/docs/fundamentals/orders.md +++ b/docs/fundamentals/orders.md @@ -75,7 +75,8 @@ Statuses: - **New**: The order is waiting for the response from the compute provider. - **In Queue**: The order is waiting in the queue for the compute to become available. This status appears only if the compute is overloaded with orders. - **Processing**: The compute is executing the order inside a TEE. -- **Done**: The order is completed. +- **Done**: The order is completed successfully. +- **Error**: The order completed with an error. Note that the **Processing** and **Done** statuses may have different meanings depending on the usage scenario. For one-time orders, such as executing a Python script, **Processing** means that the machine is working with the solution and data. When this is over, the main order becomes **Done**. diff --git a/docs/guides/index.md b/docs/guides/index.md index dd581766..31dab108 100644 --- a/docs/guides/index.md +++ b/docs/guides/index.md @@ -23,7 +23,7 @@ sidebar_position: 0 | [Configure SPCTL](/cli) | How to set up SPCTL—a Super Protocol CLI tool. | | [Configure Provider Tools](/cli/guides/provider-tools) | How to set up Provider Tools—a Super Protocol CLI utility for registering providers and creating offers. | | [Quick Deployment Guide](/cli/guides/quick-guide) | Quick instructions on deploying a solution and data on Super Protocol. | -| [Confidential Collaboration](/cli/guides/fine-tune) | A scenario of confidential collaboration on Super Protocol. | +| [Confidential Collaboration](/cli/guides/multi-party-collab) | A scenario of confidential collaboration on Super Protocol. | ### Solutions diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index bdf7d604625b5287c57a9340a24ee44bae7b29c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z<+|O({YS3Oz1(Em*Y{#Y>3w1&ruHr6wfQV9b`LHHT8jSzpK}@p+ut z-9U@Mqlle>-EVe&b~7Jje;8xjori~v*^Ds@8X`xfLeO04+A_h2T+NXMc{T|W8B|R3 zH%<8M4K`su8?%V5e*Z@>N#bnQ>wWUATD`H|w3=4idhniP?#=w!Jahf&9geQ0OoCGP zgPSwU$&SGi-a%QZ=+&F1iA={}Ei=kULSldzAO?tm z&1Arw2UdGC%crV|0b<|>25^56&=4Jig+{e?K!?|7^w$wlK*zTPqA=(fEHr`#gzHp5 zoyyGk*8_)ks_+=^| z`Rge(A_j551uaMVYhpTX}fa3TTheP%y4Q1qAf9O8^XTAL%Hk_6yV@&M{bM V#97d;(gEorpa`Lk82AMSz5vkcO5^|l diff --git a/src/pages/.DS_Store b/src/pages/.DS_Store deleted file mode 100644 index d86d37c8ce8ecd3c7eaff8ab899ebe7af6223806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKO>fgc5S>i}-Lyi=0i+%+ajn__B?57A)Aqm>qjG>MwXsDlTyK;(b)_hh&+uco z@=N-6;LYx)YLz1OM5}5>ntijo^St(3Yd?rc4W{V}qAn3>IAg1W;s)b>_9biimNrn? zXPna(ol^R~FkhFlrQtp*z;mZ5r;<|2=*s*hg-OuIKgKS6>yI@=L~B&j2{;uPBZ}b} zjd{+maDLr}lhl)u=lo7aMLwx|y$jV^X+L_rs#o>8K8j9E9aV8PoebjfXRduTrbrfX zoE+v^J?uW+Gi4R$Wj3~iJk5~uavi#(JHzhAY_`*Xy&3Gh>CZQV z+1r;r#IO4Ec}G8czWwgQ@OyDunjiLyN#Xyt_Qc}?ej>P0kF#i87N-1${sniz5flYP z0a4(t74YklUcc)Xk?}+V+d|v3Wap>rz{N+RWk(IxpC_6fyAJ}wKp+hM}0a4((0xPcC<^BKQ z-}nFPB&mr4qQHYvK(+Uy{Q*A7@2yK8$9ru6KZdh$UgPkRg1~OY$mOkg18xoN0SCa) UW8)AlFgXZV8Ke*e{;L9i0i!Qzg#Z8m diff --git a/static/.DS_Store b/static/.DS_Store deleted file mode 100644 index 20fef11fc43dbbd2209ed9ac19dc0257c2f43d2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%SyyR5UkNf7WT47kMji!{=vAc2haY1CL#!n0YT5X`8j@~RzG}XqgM}74c#@< z)0Ii;ke&fhwokWbz#71kZip8PbF+2xnH^=uu=q2240yl>_vmNUKPQa4!X0k#?5r>T zaJe7)Za;Lau-7}MZ{FNE0#3M-u{y@bgWA`FS|=z-0VyB_q<|EV0#txK+ibZCRFncz zKni>+VE>0oH*ASxp#M4;?D%f$3qv!G{VqYQId6$$AXjK5sKlU_ykeA~Ghef=C60kX zNAaEcoZPwO4W;<*%vUc*X@QDTKnhG1IF9Ms`u_#}m;3*eq?r_u0{=>Zve;eiw)~{* xt+S7_UR&wc^bcdLmorQb0i0MXKK)i#ZOposI0ibMd8ZR~5HMY2Qs6HXcn9PcCy@XE From f21b46e224106dfac21b1181fc3f33a94c383008 Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Tue, 20 Jan 2026 08:44:35 -0300 Subject: [PATCH 09/13] Update fundamentals/certification-system --- docs/cli/Guides/tgwui.md | 6 +- docs/fundamentals/certification.md | 60 ++++++++++++++---- .../certification-system-architecture.png | Bin 21355 -> 32041 bytes src/theme/Layout/index.js | 12 ++++ 4 files changed, 64 insertions(+), 14 deletions(-) diff --git a/docs/cli/Guides/tgwui.md b/docs/cli/Guides/tgwui.md index e12f58ef..87602534 100644 --- a/docs/cli/Guides/tgwui.md +++ b/docs/cli/Guides/tgwui.md @@ -231,4 +231,8 @@ The most important statuses (see the [full list](/fundamentals/orders#compute-or - **Processing**: The compute is executing the order inside a TEE. Your model is either already available or will be available soon. - **In Queue**: The order is waiting for the compute to become available. This status appears only if the compute is overloaded with orders. If this status persists for a few minutes, place a new main order the same tunnel order and engine configuration but another compute offer. - **Done**: The order is completed successfully and the model's UI is no longer available. -- **Error**: The order completed with an error. [Download the order results](/cli/commands/orders/download-result) to get more information about the error. \ No newline at end of file +- **Error**: The order completed with an error. [Download the order results](/cli/commands/orders/download-result) to get more information about the error. + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/fundamentals/certification.md b/docs/fundamentals/certification.md index a943c6b5..0dfd2161 100644 --- a/docs/fundamentals/certification.md +++ b/docs/fundamentals/certification.md @@ -5,37 +5,67 @@ slug: "/certification" sidebar_position: 6 --- -Super Protocol uses a certification system for signing data, verifying signatures, and ensuring applications operate within a trusted confidential computing environment. Verified data is published on the blockchain on behalf of confidential containers, allowing anyone to validate application integrity and ensure confidentiality. End users only interact with issued certificates and verify signatures, while the complexities of Remote Attestation are seamlessly managed in the background. +The Super Protocol Certification System is a hierarchical infrastructure for managing trust in confidential computing environments. The main purpose of the system is to create a valid chain of X.509 certificates for any applications running in Trusted Execution Environments (TEEs). The Certification System itself also operates within TEEs, ensuring the entire chain is rooted in hardware-based trust. -All the system components are open-source, ensuring transparency and verifiability. +The Certification System performs remote attestation under the hood, but exposes a familiar X.509-style certificate chain on the surface. This allows any verifier (a user, an auditor, or an automated service) to validate that: + +- The execution took place within a TEE. +- The certificate chain leading to the workload is valid and trusted. + +The Certification System can function as an independent, standalone service. In this capacity, it could serve external companies and users who need to establish certificate chains for their own confidential computing applications. + +Note that the system is not responsible for validating what an application does internally. Its primary role is to issue certificates to trusted confidential environments, forming a cryptographically verifiable trust chain. + +All system components are planned to be open-sourced, improving transparency and verifiability. ## Architecture -The backbone of the system is a hierarchical structure of Certification Authorities operating inside Trusted Execution Environments (TEE)—Intel SGX enclaves. +The Certification System is organized as a hierarchy of Certification Authorities (CAs) that establishes trust for TEEs through a standard certificate chain. Every CA operates within a TEE—Intel SGX enclave.

-The Root Certification Authority (*Root CA*) is located at the highest hierarchical level. At the start, Root CA generates a self-signed certificate, embedding the SGX attestation quote. +The chain consists of three levels: + +- Root CA is the top-level certificate authority that establishes the trust anchor for the entire system. At the start, it generates a self-signed certificate, embedding the SGX attestation quote. +- SubRoot CAs are intermediate certificate authorities. They submit their quotes and public keys to the Root CA and request certificates. The Root CA verifies these incoming requests and then issues and signs certificates for the SubRoot CAs. Once a SubRoot CA is certified by the Root CA, it can certify any TEE-backed environment that proves it is actually confidential. +- End certificates are issued to specific workloads, entire Confidential Virtual Machines (CVMs) running in TEEs, and in some other cases. These certificates are not CAs and cannot be used to sign or issue other certificates. + +Each level in the hierarchy receives its certificate from the level above, creating a chain of trust that ultimately traces back to the Root CA. + +## Trusted Loader -SubRoot Certification Authorities (*SubRoot CAs*) are located at the next hierarchical level. These submit their quotes and public keys to the Root CA and request certificates. The Root CA verifies these incoming requests and then issues and signs certificates for the SubRoot CAs. +Trusted Loader is a special service that prepares and launches the workload associated with an order inside a CVM running in a TEE. It runs in a privileged position within the execution environment, allowing it to access the underlying attestation capabilities of the platform. Workloads themselves do not have such access. -The SubRoot CAs, in turn, issue and sign certificates for orders by request. +Trusted Loader also: + +- Collects hashes of the workload and its components. +- Verifies workload integrity before execution starts. +- Requests end certificates. + +All end certificates are requested and received by Trusted Loader. Other components do not interact directly with Certificate Authorities. Trusted Loader may request certificates in several cases: + +- At startup. The certificate confirms that the confidential environment is correctly configured and that the attestation challenge (TDX, SEV-SNP, etc.) matches expectations. +- When generating session keys. The certificate is included in the session key structures used during execution. +- When forming a TEE Confirmation Block (TCB). The certificate is embedded into TCB, which also includes system information and measurements. +- When deploying an order. An order-specific certificate is issued and delivered, along with cryptographic keys, to the order's execution environment. ## Order certificates -The issuing of order certificates involves Trusted Loader—a software mechanism developed by Super Protocol to load and run applications within a TEE. Trusted Loader operates inside the Confidential VM that executes the order. This Confidential VM may be deployed within a CPU-based or CPU/GPU-augmented TEE using technologies such as Intel TDX, AMD SEV-SNP, NVIDIA Confidential Computing, or others, making the system TEE-agnostic. +Trusted Loader requests a dedicated order-specific certificate when an order is prepared for execution. This certificate includes order-specific data, such as the hash of workload information. -To receive an order certificate, the Trusted Loader sends a request to a SubRoot CA providing the quote and a public key. The SubRoot CA verifies the quote, issues the order certificate, and signs it with the provided public key. +Trusted Loader places the order certificate as a file into the order's execution environment. There, it can be used by the order itself to prove that it was launched within a confidential environment. + +Note that the Certification System does not determine whether a CVM is correct or compromised. If a CVM runs in a confidential environment, it can obtain certificates. However, differences in hashes are visible in the certificate chain and can be detected by any verifying party. ### Order validation -Orders in Super Protocol are created with necessary input data. This execution environment is referred to as *Workload Info*. +Orders in Super Protocol are created with a workload description known as *Workload Info*. -The Workload Info includes an array called `runtimeInfo[]` with metadata about solutions and datasets used in the order. Each such order component has an entry in this array, which includes: +Workload Info includes an array called `runtimeInfo`. It contains information about solutions and data associated with the order. Each such order component has an entry in this array, which includes: -- Type +- Type (solution or data) - Hash - Size - Signature key hash (optional) @@ -43,9 +73,13 @@ The Workload Info includes an array called `runtimeInfo[]` with metadata about < The hash of the Workload Info is included in the order certificate. -Trusted Loader generates and publishes a report in the blockchain, allowing anyone to validate the order. This order report includes: +Before order execution begins, Trusted Loader checks the integrity of the full workload composition (solutions, data, and configuration). The order proceeds only if this verification succeeds. + +Trusted Loader also generates and publishes a report to the blockchain, allowing any verifier to validate the order. The report includes: - The public components of all the certificates in the chain - Workload Info: - Order creation date - - The `runtimeInfo[]` array \ No newline at end of file + - The `runtimeInfo` array + +The immutable nature of blockchain prevents any further alterations to the report once it is published. The report enables verifiers to confirm what exactly was launched and that the certificate corresponds to that specific workload. \ No newline at end of file diff --git a/docs/fundamentals/images/certification-system-architecture.png b/docs/fundamentals/images/certification-system-architecture.png index 4e4ffd05e8c23033e6afe295ca45eb89e086da79..32eead65e8ccb9caaf859d1bdda830911c72f48a 100644 GIT binary patch literal 32041 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 Da>mi+ literal 21355 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

;3YYtIyUi>@wL z)|Qx_mvZ&3I51%IH0f;h^W#kVu3d?y9^$2V#dEk zD?ho(snd9MqQ1V32Jvo4u1?g6dXnVoM4hN7Nv=-Rlb1T>>O@^O>L=v-l_w}yC+bPu zt5dGNM0?y!)RU2V(&Xxg)avVxrDvB8%~KouuK8Q#J&DvZ(E;Sol&1u z-*x9aFPwIB=h=mK&!1OcDeT{nqKHIfcqXserkZ-KYHIvGUiMdIb*E0bI#J&Q)UWjpuQzqd)rtCM zpq^WBmOV<7kmhwvLFToB@!s5#F!gIwN7->uFfPrckrz6e5z6m}hTP0hKIQ6b%hiec z#!=7fRg8Bjq)ABm+`7XJe9DXO3c}QnHcUa6;y^|y1R=#Zj1PD4IqgCnFig3+90?3j zPbBq*em)#M6nG18kCDPTqvBjI}GyUeqUdWg?T4daSD=%rkpsBbmue1Li8 zv+x{VyjSP*H|F*hL~8YZ)`540*hW)|f)0QNX+b`8P_9nYw;1*Q@$f8N67{@{@o}jN zAL)pvej>B0OU3UQFq8p9{IWDDsM9ZeM&0#e3Oc9<;I!awN5@Nl2 z!*G8t4J_fqQ3IB^!(~X zeX~=~9}k_)9H#N=ZyPoe^-WKm#;X%`qE6%0i8@iIT%D*B^_4feZz)mV9@Oc+r9?eB zs8g;^)McZ7VoIi#v2CcYs8O!I>8Q)!C|4)yNl2Y?b)udm)Zg4FS10O3eWM!X>O_4# zs8g;^)VBw9%GI|Gb+1LR)`_LkbE|L3O;W9f$kPB8B^Pzd)wd$`Howp_nznGM10Ah1 z_U`4V&(tyM7TtX6H_*=>tI(`P^s;9*v}^|IDz8|#g3U@CPFv}=roOUwYy0NvSJ7wi z`xX_JMof)9UxK=(a^APEdUd0z1i)enFzW0m@S=>=MKoCrfyK+sHSC2LyO;SXEt=z= z8`}ekqn@O>`Z5*3W}yC_O?bqp0=#euoa62K3_>MZKL98ap+`vN{b0M?)V&z)pS>nut0)Wv5RJ8H1hWliUvTO! ztaPCd(ri9+XKZx~_UK9_-$s9{U5rqlKnJv;mhGIu6aZI~Q^sE1#tJ4UJ4aQqI;seY z(d=?MN+zuAT`n!g%U}?zY+}%C^|i86rCqdDMX4J^t<^URbxuSL46-BHoR9=28FKY8 z!Q`m5+r4k1?$PP$8Fluz;naipg7t$~EI0LfY?Zzmu#x#-JvAd^6#zPMj=jdV8_c!J z<^!&!0;?jcC-?ypxfZqHqsUX2kXng1*bjE&)d_qd$V$D!)DuS?9Tp4@c(6z}AyG$X zs}F@H8{1Eh>2fXBMX9qjR;;f#V!JlYX0PqRx@}55;kmklzg6|@WLk{%E?cw$=++4S zfmh37r_M^B&l%vxiWnf)o5T1bBJvGDWFZU@hypec_W38X~Ks)W?_% z#2XRnm$66GL$9nZ{Y$`1+9gD1vQg@)av@=G13?2L|#i)-uEe?>Ax--Zw z5+v#q5_KJh8>N#b!(AaAwwf6AMz(u8i8?RYK(MZWI_2sBDwKL{4F-zQ7=TCx zV89wKKw1{9)w`k6IcK#`co_8-tkJToI@uE#E!qs89(MNE=&bg^h1B_x+R2X86ss82 zjYg@bpmVk@OkEc=#i)bE#LfUxR#<%QI181-(By97JgVOtZU zUK6EWx6)pna&_rVmwI*4q~bjbL@EG>)Rojp%i;?d-uXK!8TA^REwZP{PaR4jd$1jfv+cg!|>uro$|t`qI`3#q3VY$(nwMI8nmPOBCYK|Kj_bybC6 zYOl51Yr@nc6#y>~bS)4^J)FP@(nl>K&p=GPP$cSWqb@^R?_8Z9bMsmh%TlYg;^0P8 zXEh7Y)xD8d8mRypJMFJdtg%`>C{bs{4X0j;{If=)z9pz9GHhfN1XpX?Dyf_OW2@Z( z8m~^&H=4SqMT4WOq`qDW42@SO>g$%P^9u(4p*6RhRx9=dQ>9@VM(I=DHmv0fZS8Dz zl~tT&Jl$*5brcr}64Uecf_(e%WTkVhOJYJr-;QuSsm`@iOX-CjT5; zXmL0qpX$O3YpV;jVd`jYTz`Du1=z{|XumtT%)TzYmhrN1zmR^75({jCD|Gn_zk$1N; z^+bk^(q)^qg5#AkeT_ZUAPr6^##x^x4FcE`E?~@H4wp2g>}Uv6AB3ir*ELBnUj5*1 zfL-TOA?+rVgKF^+*Ae zdKEi4Ug=YqA{?m13W>Ua#`hv)HzJ?vR#^nZrZ9Dr3R>9WM7FIxUj5jw;1}upqu|Ql zSwQ{v;lt;?5AR<2@*F?(m)`PkJK=|W!kaVd@W(y#sDJU**XMo&J04X3<;Sr1tLj~I zaPp4+2*8!yhySr0^1pud!){q*JiUP9^;7Y%uj&$D`VJD1gWcQ}n7TUp)g|GyV^-@dU_U#4qU z-QFFTR2TKE=7qbbU&-p;cz_Oda%9Z^p(!y^*`nBfUiAazQA({%Os4YB|=8SzQs}tQC zBIm&1kxcDsUzP?npHDjrabeR^Dyz4|syLLHSzpbN4sWX2$ff#^s3~uBZfR-GMYO&r z&KuKG+7!oJ#~+_^VPjp@{VINbHCC1C75CMBeYK-H)s+M}-(8d?oR=fKi2M;UnRZL{ z`{WomUn@G2d|Yh=S9pCSWfm}u>NidpiLOkhC#U*!i2O3Y!{n;RF=76QSoMdcRQD^@ z97{)_c4Tix_5VhteRb*#)sE4s4l&3Qt8&YQz%z=61ZBpWn5PBm)-BbGkBoac4WA|o zRiC)cRu6g1tbQWU$}f5$&=Z+DIM3xF#n<`Pc8HQ%PrD^d&_CWwGK!D z4iVl45s~AwauTH5?QX57_@JyAx7!#NhL$sQ6|AIoRWp00000NkvXXu0mjfw;%Py diff --git a/src/theme/Layout/index.js b/src/theme/Layout/index.js index eeac7d18..980964c8 100644 --- a/src/theme/Layout/index.js +++ b/src/theme/Layout/index.js @@ -87,9 +87,21 @@ export default function Layout(props) { ᐧ A tunnel client hosts a web server; it remains hidden behind the tunnel server and protected from external threats. + + TEE Confirmation Block (TCB) contains a unique device ID, equipment benchmark results,
various hashes, device signature, and a certificate chain for signature verification.

+ + Trusted Loader generates and publishes TCB on the blockchain every 24 hours. +
+ + // Stabs and abbreviations + Confidential Virtual Machine + + + Trusted Loader + ); } \ No newline at end of file From dfc58bd0ede1c187c1320d3e91772ac9f9f85672 Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Fri, 30 Jan 2026 08:49:15 -0300 Subject: [PATCH 10/13] Rename cli/quick-guide to deploy-app. Add Python example --- .../Guides/deploy-app/deploy-app-example.md | 175 ++++++++++++++++++ .../{quick-guide.md => deploy-app/index.md} | 26 ++- docs/cli/Guides/tgwui.md | 14 +- docs/cli/Guides/unsloth.md | 4 +- docs/cli/Guides/vllm.md | 2 +- docs/fundamentals/certification.md | 6 +- docs/guides/index.md | 12 +- docusaurus.config.js | 8 +- static/files/usd_to_crypto.py | 45 +++++ 9 files changed, 254 insertions(+), 38 deletions(-) create mode 100644 docs/cli/Guides/deploy-app/deploy-app-example.md rename docs/cli/Guides/{quick-guide.md => deploy-app/index.md} (82%) create mode 100644 static/files/usd_to_crypto.py diff --git a/docs/cli/Guides/deploy-app/deploy-app-example.md b/docs/cli/Guides/deploy-app/deploy-app-example.md new file mode 100644 index 00000000..60d596e0 --- /dev/null +++ b/docs/cli/Guides/deploy-app/deploy-app-example.md @@ -0,0 +1,175 @@ +--- +id: "deploy-app-example" +title: "Example: Python script" +slug: "/guides/deploy-app/example" +sidebar_position: 1 +--- + +This guide serves as an example to the more general [deployment guide](/cli/guides/deploy-app) and shows how to deploy a Python script on Super Protocol without modifying its code. + +The [simple script](/files/usd_to_crypto.py) used here as an example calculates how much Bitcoin (BTC) and Ether (ETH) can be bought for given amount in US dollars: + +1. Reads the input amount from `input.txt` located in the same directory. +2. Fetches current prices of BTC and ETH using CoinGecko API. +3. Calculates how much BTC and ETH can be bought for this amount of USD. +4. Creates `result.txt` in the same directory and writes the result to it. + +In this deployment, the script will be the solution, and `input.txt` will be the data. + +## Prerequisites + +- Docker +- [SPCTL](/cli) + +### 0. Prepare the files + +Create a local directory `usd_to_crypto`. Download the [example script](/files/usd_to_crypto.py) and rename it to `usd_to_crypto.py`. + +Create a new file `input.txt` to serve as the data input, and add a number—USD amount, for example, `100000`. + +Copy SPCTL and its `config.json` into this directory. + +### 1. Prepare the solution + +Keep in mind that file locations inside a CVM will differ from a local run: + +- Data (`input.txt`) must be found in one of the `/sp/inputs/input-xxxx` directories. +- `result.txt` must be placed into `/sp/output` to be available to download once the execution is finished. + +1.1. Create an new file named `entrypoint.sh` and add the following code: + +```sh title="entrypoint.sh" +#!/bin/sh +set -eu + +# Fixed CVM paths (overridable if needed) +: "${INPUTS_DIR:=/sp/inputs}" +: "${OUTPUT_DIR:=/sp/output}" +: "${SCRIPT_PATH:=/usr/local/bin/usd_to_crypto.py}" + +mkdir -p "${OUTPUT_DIR}" +cd "${OUTPUT_DIR}" + +# Resolve input file +INPUT_FILE="$(find "${INPUTS_DIR}" -mindepth 2 -maxdepth 3 -type f -name 'input.txt' 2>/dev/null | sort | head -n 1 || true)" + +# Make the script's expected input file available in CWD (/sp/output) +rm -f input.txt || true +if [ -n "${INPUT_FILE}" ] && [ -f "${INPUT_FILE}" ]; then + cp -f "${INPUT_FILE}" input.txt +else + # If missing, create an empty file so the Python script emits a clean error + : > input.txt +fi + +# Run the Python script; it reads ./input.txt and writes ./result.txt here (/sp/output) +exec python3 "${SCRIPT_PATH}" +``` + +Create an new file named `Dockerfile` and add the following code: + +```dockerfile title="Dockerfile" +FROM ubuntu:22.04 + +# Non-interactive tzdata install +ENV DEBIAN_FRONTEND=noninteractive + +# System deps +RUN apt-get update && apt-get install -y \ + python3 \ + python3-pip \ + ca-certificates \ + curl \ + jq \ + openssl \ + tzdata \ + sed \ + grep \ + coreutils \ + && rm -rf /var/lib/apt/lists/* + +# Python deps +RUN pip3 install --no-cache-dir requests + +# Put the scripts where your environment expects executables +COPY usd_to_crypto.py /usr/local/bin/usd_to_crypto.py +RUN chmod +x /usr/local/bin/usd_to_crypto.py + +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +# Set /sp as workdir (doesn't matter in this case; entrypoint.sh uses /sp/output as workdir) +WORKDIR /sp + +# Set entrypoint +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +``` + +1.2. Build a Docker image: + +```shell +docker build -t usd_to_crypto . +``` + +1.3. Save and archive the image: + +```shell +docker save usd_to_crypto:latest | gzip > usd_to_crypto.tar.gz +``` + +1.4. Upload the archive: + +```shell +./spctl files upload usd_to_crypto.tar.gz \ + --filename usd_to_crypto.tar.gz \ + --output usd_to_crypto.resource.json +``` + +### 2. Prepare data + +2.1. Archive the file: + +```shell +tar -czvf input.tar.gz ./input.txt +``` + +2.2. Upload the archive: + +```shell +./spctl files upload ./input.tar.gz \ +--filename input.tar.gz \ +--output input.resource.json +``` + +### 3. Deploy + +Place an order: + +```shell +./spctl workflows create \ +--tee 7 \ +--solution ./usd_to_crypto.resource.json \ +--data ./input.resource.json +``` + +Find the order ID in the output, for example: + +``` +Workflow was created, TEE order id: ["275510"] +``` + +### 4. Download the result + +Replace `275510` with your order ID: + +```shell +./spctl orders download-result 275510 +``` + +If there is no result for your order yet, wait a couple of minutes and try again. + +Find `output/result.txt` inside the downloaded archive `result.tar.gz`. + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/Guides/quick-guide.md b/docs/cli/Guides/deploy-app/index.md similarity index 82% rename from docs/cli/Guides/quick-guide.md rename to docs/cli/Guides/deploy-app/index.md index 89d14492..205961f8 100644 --- a/docs/cli/Guides/quick-guide.md +++ b/docs/cli/Guides/deploy-app/index.md @@ -1,7 +1,7 @@ --- -id: "quick-guide" +id: "deploy-app" title: "Deploy Your App" -slug: "/guides/quick-guide" +slug: "/guides/deploy-app" sidebar_position: 2 --- @@ -18,13 +18,13 @@ This quick guide provides instructions on deploying your own TEE: -| **Location** | **Purpose** | **Access** | +|

**Location**
| **Purpose** |
**Access**
| | :- | :- | :- | -| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
etc. | Possible data locations | Read-only | -| `/sp/output` | Output directory for results | Write; read own files | +| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
... | Possible data locations | Read-only | +| `/sp/output` | Output directory for results | Read and write | | `/sp/certs` | Contains the order certificate, private key, and workloadInfo | Read-only | -So, your solution must find the data in `/sp/inputs` and write the results to `/sp/output`. +When you provide multiple data inputs, they are placed in separate directories inside the CVM: the first in `/sp/inputs/input-0001`, the second in `/sp/inputs/input-0002`, and so on. Your solution must find the data in `/sp/inputs` and write the results to `/sp/output`. :::important @@ -32,7 +32,9 @@ Always use absolute paths, such as `/sp/...`. ::: -You can find several Dockerfile examples in the [Super-Protocol/solutions](https://github.com/Super-Protocol/solutions) GitHub repository. +Check the [example](/cli/guides/deploy-app/example) at the end of this guide. + +More Dockerfile examples can be found in the [Super-Protocol/solutions](https://github.com/Super-Protocol/solutions) GitHub repository. ### 1.2. Build a Docker image @@ -124,17 +126,11 @@ Place an order using the [`workflows create`](/cli/commands/workflows/create) co --data ./more-data.resource.json ``` -:::note - -When you provide multiple data inputs, they are placed in separate directories inside the CVM: the first in `/sp/inputs/input-0001`, the second in `/sp/inputs/input-0002`, and so on. - -::: - Find the order ID in the output. ## 4. Download the result -Wait a few minutes and [check the order status](/cli/commands/orders/get): +Wait a few minutes and check the order status: ```shell ./spctl orders get @@ -146,7 +142,7 @@ For example: ./spctl orders get 256587 ``` -If the status is `Done`, the order is ready, and you can [download the order result](/cli/commands/orders/download-result): +If the status is `Done` or `Error`, you can [download the order result](/cli/commands/orders/download-result): ```shell ./spctl orders download-result diff --git a/docs/cli/Guides/tgwui.md b/docs/cli/Guides/tgwui.md index 87602534..0885d659 100644 --- a/docs/cli/Guides/tgwui.md +++ b/docs/cli/Guides/tgwui.md @@ -12,7 +12,7 @@ This guide provides step-by-step instructions for uploading and deploying an AI ## Prerequisites -- [SPCTL](https://docs.develop.superprotocol.com/cli/) +- [SPCTL](/cli/) - BNB and SPPI tokens (opBNB) to pay for transactions and orders ## 1. Prepare @@ -91,19 +91,20 @@ Replace `` with the tunnel order ID from the previous step. ./spctl orders download-result ``` -3.5. Extract the downloaded `result.tar.gz`, open `output/result.json`, and find the domain address. For example: +3.5. Extract the downloaded `result.tar.gz`, open `output/result.json`, and find the domain. For example: ```json title="result.json" "domain":"pret-tons-wade.superprotocol.io" ``` -Your model's web UI will be available at this address. +Your model's web UI will be available at this URL. ## 4. Prepare engine configuration files 4.1. Open the SPCTL's `config.json` and find the `workflow.resultEncryption.key` property that contains the key used for decrypting workflow results; for example: `NapSrwQRz2tL9ZftJbi6DATpCDn0BRImpSStU9xZT/s=`. -4.2. +4.2. Create configuration files: + Create a file named `engine-configuration-tgwui.json` and paste the following: @@ -184,10 +185,10 @@ Save and close the file. ## 5. Deploy the model -5.1. +5.1. Create the main order to deploy your uploaded model: + - Create the main order to deploy your uploaded model: ```shell ./spctl workflows create --tee --solution 25 --solution-configuration ./engine-configuration-tgwui.json --data ./model.resource.json @@ -198,7 +199,6 @@ Save and close the file. Note that `--solution 25` refers to [Text Generation Web UI with GPU support](https://marketplace.superprotocol.com/marketplace/models?offer=offerId%3D25). If you need the CPU version, use `--solution 26` instead. - Create the main order to deploy your uploaded model: ```shell ./spctl workflows create --tee --solution 27 --solution-configuration ./engine-configuration-comfyui.json --data ./model.resource.json diff --git a/docs/cli/Guides/unsloth.md b/docs/cli/Guides/unsloth.md index 24b46110..70ae7f67 100644 --- a/docs/cli/Guides/unsloth.md +++ b/docs/cli/Guides/unsloth.md @@ -7,11 +7,11 @@ sidebar_position: 5 This guide provides step-by-step instructions for fine-tuning an AI model using the Super Protocol packaging of [Unsloth](https://unsloth.ai/), an open-source framework for LLM fine-tuning and reinforcement learning. -The solution allows you to run fine-tuning within Super Protocol's Trusted Execution Environment (TEE). This provides enhanced security and privacy and enables a range of [confidential collaboration](https://docs.develop.superprotocol.com/cli/guides/multi-party-collab) scenarios. +The solution allows you to run fine-tuning within Super Protocol's Trusted Execution Environment (TEE). This provides enhanced security and privacy and enables a range of [confidential collaboration](/cli/guides/multi-party-collab) scenarios. ## Prerequisites -- [SPCTL](https://docs.develop.superprotocol.com/cli/) +- [SPCTL](/cli/) - Git - BNB and SPPI tokens (opBNB) to pay for transactions and orders diff --git a/docs/cli/Guides/vllm.md b/docs/cli/Guides/vllm.md index a833a22d..d701a650 100644 --- a/docs/cli/Guides/vllm.md +++ b/docs/cli/Guides/vllm.md @@ -9,7 +9,7 @@ This guide provides step-by-step instructions for running an AI model inference ## Prerequisites -- [SPCTL](https://docs.develop.superprotocol.com/cli/) +- [SPCTL](/cli/) - Git - BNB and SPPI tokens (opBNB) to pay for transactions and orders diff --git a/docs/fundamentals/certification.md b/docs/fundamentals/certification.md index 0dfd2161..4ef4e184 100644 --- a/docs/fundamentals/certification.md +++ b/docs/fundamentals/certification.md @@ -28,7 +28,7 @@ The Certification System is organized as a hierarchy of Confidential Virtual Machines (CVMs) running in TEEs, and in some other cases. These certificates are not CAs and cannot be used to sign or issue other certificates. @@ -36,7 +36,7 @@ Each level in the hierarchy receives its certificate from the level above, creat ## Trusted Loader -Trusted Loader is a special service that prepares and launches the workload associated with an order inside a CVM running in a TEE. It runs in a privileged position within the execution environment, allowing it to access the underlying attestation capabilities of the platform. Workloads themselves do not have such access. +Trusted Loader is a special service that prepares and launches the workload associated with an order inside a CVM running in a TEE. Loader occupies a privileged position within the execution environment, enabling it to access the platform's underlying attestation capabilities. Workloads themselves do not have such access. Trusted Loader also: @@ -63,7 +63,7 @@ Note that the Certification System does not determine whether a CVM is correct o Orders in Super Protocol are created with a workload description known as *Workload Info*. -Workload Info includes an array called `runtimeInfo`. It contains information about solutions and data associated with the order. Each such order component has an entry in this array, which includes: +Workload Info includes an array called `runtimeInfo` that contains information about solutions and data associated with the order. Each data and solution component of the order has an entry in this array, which includes: - Type (solution or data) - Hash diff --git a/docs/guides/index.md b/docs/guides/index.md index 31dab108..26693316 100644 --- a/docs/guides/index.md +++ b/docs/guides/index.md @@ -18,12 +18,12 @@ sidebar_position: 0 ## CLI -|
**Guide**
|
**Description**
| -| :- | :- | -| [Configure SPCTL](/cli) | How to set up SPCTL—a Super Protocol CLI tool. | -| [Configure Provider Tools](/cli/guides/provider-tools) | How to set up Provider Tools—a Super Protocol CLI utility for registering providers and creating offers. | -| [Quick Deployment Guide](/cli/guides/quick-guide) | Quick instructions on deploying a solution and data on Super Protocol. | -| [Confidential Collaboration](/cli/guides/multi-party-collab) | A scenario of confidential collaboration on Super Protocol. | +|
**Guide**
|
**Description**
| +| :- | :- | +| [Configure SPCTL](/cli) | How to set up SPCTL—a Super Protocol CLI tool. | +| [Configure Provider Tools](/cli/guides/provider-tools) | How to set up Provider Tools—a Super Protocol CLI utility for registering providers and creating offers. | +| [Quick Deployment Guide](/cli/guides/deploy-app) | Quick instructions on deploying a solution and data on Super Protocol. | +| [Confidential Collaboration](/cli/guides/multi-party-collab) | A scenario of confidential collaboration on Super Protocol. | ### Solutions diff --git a/docusaurus.config.js b/docusaurus.config.js index c3a86fd7..db773ef3 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -42,10 +42,10 @@ const config = { from: "/hackathon", to: "/hackathon/about", }, - /*{ - from: "/colab", - to: "/colab/jupyter", - },*/ + { + from: "/cli/guides/quick-guide", + to: "/cli/guides/deploy-app", + }, ], }, ], diff --git a/static/files/usd_to_crypto.py b/static/files/usd_to_crypto.py new file mode 100644 index 00000000..88da57e5 --- /dev/null +++ b/static/files/usd_to_crypto.py @@ -0,0 +1,45 @@ +import requests +import sys + +def main(): + input_file = "input.txt" + output_file = "result.txt" + + try: + # Read the input amount + with open(input_file, "r") as f: + content = f.read().strip() + if not content: + raise ValueError("Input file is empty") + + try: + usd_amount = float(content) + except ValueError: + raise ValueError("Input is not a valid number") + + # Fetch BTC and ETH prices from CoinGecko + url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd" + response = requests.get(url, timeout=10) + if response.status_code != 200: + raise RuntimeError(f"API request failed with status code {response.status_code}") + + data = response.json() + btc_price = data["bitcoin"]["usd"] + eth_price = data["ethereum"]["usd"] + + # Calculate how much BTC and ETH can be bought + btc_amount = usd_amount / btc_price + eth_amount = usd_amount / eth_price + + # Write results to output file, rounded to 6 decimals + with open(output_file, "w") as f: + f.write(f"BTC: {btc_amount:.6f}\n") + f.write(f"ETH: {eth_amount:.6f}\n") + + except Exception as e: + # Write the error message to the result file + with open(output_file, "w") as f: + f.write(f"Error: {str(e)}\n") + +if __name__ == "__main__": + main() From ea0801b561605b77510b50f8d0d44ace773bd715 Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Thu, 5 Feb 2026 13:12:18 -0300 Subject: [PATCH 11/13] Minor fixes --- docs/cli/Guides/deploy-app/deploy-app-example.md | 4 ++-- docs/cli/Guides/tgwui.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/cli/Guides/deploy-app/deploy-app-example.md b/docs/cli/Guides/deploy-app/deploy-app-example.md index 60d596e0..762949db 100644 --- a/docs/cli/Guides/deploy-app/deploy-app-example.md +++ b/docs/cli/Guides/deploy-app/deploy-app-example.md @@ -36,7 +36,7 @@ Keep in mind that file locations inside a CVM will differ from a local run: - Data (`input.txt`) must be found in one of the `/sp/inputs/input-xxxx` directories. - `result.txt` must be placed into `/sp/output` to be available to download once the execution is finished. -1.1. Create an new file named `entrypoint.sh` and add the following code: +1.1. Create a new file named `entrypoint.sh` and add the following code: ```sh title="entrypoint.sh" #!/bin/sh @@ -66,7 +66,7 @@ fi exec python3 "${SCRIPT_PATH}" ``` -Create an new file named `Dockerfile` and add the following code: +Create a new file named `Dockerfile` and add the following code: ```dockerfile title="Dockerfile" FROM ubuntu:22.04 diff --git a/docs/cli/Guides/tgwui.md b/docs/cli/Guides/tgwui.md index 0885d659..66ac340a 100644 --- a/docs/cli/Guides/tgwui.md +++ b/docs/cli/Guides/tgwui.md @@ -151,7 +151,7 @@ Your model's web UI will be available at this URL. } ```
- + Create a file named `engine-configuration-comfyui.json` and paste the following: ```json title="engine-configuration-comfyui.json" @@ -198,7 +198,7 @@ Save and close the file. Note that `--solution 25` refers to [Text Generation Web UI with GPU support](https://marketplace.superprotocol.com/marketplace/models?offer=offerId%3D25). If you need the CPU version, use `--solution 26` instead. - + ```shell ./spctl workflows create --tee --solution 27 --solution-configuration ./engine-configuration-comfyui.json --data ./model.resource.json From 82e91c4016efd16b01d5b5c5c8ec8bb6fc96184c Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Wed, 11 Feb 2026 15:03:00 -0300 Subject: [PATCH 12/13] Update marketplace/account --- docs/marketplace/Guides/storage.md | 6 +-- docs/marketplace/account.md | 52 +++++++++++++++++++++++ docs/marketplace/account/index.md | 39 ----------------- docs/marketplace/account/web2.md | 31 -------------- docs/marketplace/account/web3.md | 36 ---------------- docs/marketplace/images/web2-account.png | Bin 17191 -> 10357 bytes docs/marketplace/images/web3-account.png | Bin 17939 -> 0 bytes docusaurus.config.js | 8 ++++ 8 files changed, 62 insertions(+), 110 deletions(-) create mode 100644 docs/marketplace/account.md delete mode 100644 docs/marketplace/account/index.md delete mode 100644 docs/marketplace/account/web2.md delete mode 100644 docs/marketplace/account/web3.md delete mode 100644 docs/marketplace/images/web3-account.png diff --git a/docs/marketplace/Guides/storage.md b/docs/marketplace/Guides/storage.md index 95915151..7f477595 100644 --- a/docs/marketplace/Guides/storage.md +++ b/docs/marketplace/Guides/storage.md @@ -7,14 +7,12 @@ sidebar_position: 6 This guide provides step-by-step instructions on how to set up your personal Storj account. -The guide is intended for advanced Web3 users; feel free to skip it and continue using the default recommended option—**Super Protocol cloud**. Read about [types of storage](/marketplace/account/web3#storage). +The guide is intended for advanced users; feel free to skip it and continue using the default recommended option—**Super Protocol cloud**. Read about [types of storage](/marketplace/account#storage). - +

-Web2 users must first [log in as a Web3 user](/marketplace/guides/log-in) to be able to upload to a personal Storj account instead of the Super Protocol cloud. - ## Step 1. Register a Storj account If you don't already have a [Storj](https://www.storj.io/) account, register one. Both free Trial and Pro accounts are suitable. Note that with a Trial account, your files will become inaccessible once the trial period ends. diff --git a/docs/marketplace/account.md b/docs/marketplace/account.md new file mode 100644 index 00000000..3f2b4345 --- /dev/null +++ b/docs/marketplace/account.md @@ -0,0 +1,52 @@ +--- +id: "account" +title: "Enter Marketplace" +slug: "/account" +sidebar_position: 3 +--- + +Super Protocol supports two login methods: + +- Web2 requires an account on one of the supported platforms: + - Google + - Hugging Face + - GitHub + - Microsoft +- Web3 requires a software wallet installed as a browser extension: + - MetaMask + - Trust Wallet + +For instructions on how to set up software wallets and connect them to the Marketplace, read [How to Log In as a Web3 User](/marketplace/guides/log-in). + + +
+
+ +## Account window + +This window shows your user account settings. + + +
+
+ +**User ID**: your unique user ID. + +**Login**: the OAuth2 provider and your login email address. + +The **Get SPPI** button allows you to get tokens necessary to place orders. + +### Storage + +You have two options of decentralized storage to upload files: + +- **Super Protocol cloud**: + - Recommended for most users. + - Does not require additional setup. + - Uses Super Protocol's Storj account and thus relies on Super Protocol as the storage provider. +- **Your Storj account**: + - Intended for advanced users. + - Requires creating and [setting up a Storj account](http://localhost:3000/marketplace/guides/storage). + - Gives sole control over the uploaded content and storage account. + +Read [How to Set Up Storage](/marketplace/guides/storage) for step-by-step instructions. \ No newline at end of file diff --git a/docs/marketplace/account/index.md b/docs/marketplace/account/index.md deleted file mode 100644 index e2ae472f..00000000 --- a/docs/marketplace/account/index.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -id: "account" -title: "Enter Marketplace" -slug: "/account" -sidebar_position: 3 ---- - -There are two types of accounts in Super Protocol: - -- Web3 User account -- Web2 User account - - -
-
- -## Web3 User account - -_Web3 User account_ provides access to all Marketplace capabilities, including: - -- Full decentralization and sole control of user's funds, models, and datasets. -- Ability to upload models and datasets to the Super Protocol cloud or a personal Storj account. -- Placement of orders using Marketplace offers or the user's own uploaded content. -- Registration of individual providers. -- Creation and monetization of model and dataset offers on the Marketplace. -- Ability to request additional SPPI tokens. - -Read [How to Log In as a Web3 User](/marketplace/guides/log-in) for step-by-step instructions. - -## Web2 User account - -_Web2 User account_ is a quick way to start with the Marketplace. It streamlines a few steps, but this comes at the expense of full decentralization, such as using OAuth2 authentication for login instead of the decentralized MetaMask. - -To log in as a Web2 user, you need an account on one of the supported platforms: - -- Google -- Hugging Face -- GitHub -- Microsoft diff --git a/docs/marketplace/account/web2.md b/docs/marketplace/account/web2.md deleted file mode 100644 index 5e2e2140..00000000 --- a/docs/marketplace/account/web2.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: "web2" -title: "Web2 User Account" -slug: "/account/web2" -sidebar_position: 2 ---- - -This window shows the settings of your [Web2 User account](/marketplace/account#web2-user-account). - - -
-
- -**User ID**: your unique user ID. - -**Login**: the OAuth2 provider and your login email address. - -## Storage - -Super Protocol supports two options of decentralized storage to upload files: - -- **Super Protocol cloud**: - - Does not require additional setup. - - Uses Super Protocol's Storj account and thus relies on Super Protocol as the storage provider. - - Costs SPPI tokens for additional storage beyond the basic free package. -- **Your Storj account**: - - Available to Web3 users only. - - Requires creating and setting up a Storj account. - - Gives sole control over the uploaded content and storage account. - -To enable uploading to your personal Storj account, [log in as a Web3 user](/marketplace/guides/log-in). \ No newline at end of file diff --git a/docs/marketplace/account/web3.md b/docs/marketplace/account/web3.md deleted file mode 100644 index dd18bbb3..00000000 --- a/docs/marketplace/account/web3.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -id: "web3" -title: "Web3 User Account" -slug: "/account/web3" -sidebar_position: 1 ---- - -This window allows you to manage your [Web3 User account](/marketplace/account#web3-user-account). - - -
-
- -**User ID**: your unique user ID is your EVM wallet address. - -**Login**: the Web3 login method and the EVM wallet address you are using. Currently, Super Protocol only supports MetaMask as a Web3 login method. - -**Get SPPI** and **Get BNB** buttons allow you to get tokens necessary to place orders: - -- SPPI tokens are required to pay and receive payments in Super Protocol. -- BNB tokens are required to pay for opBNB blockchain transactions. - -## Storage - -You have two options of decentralized storage to upload files: - -- **Super Protocol cloud**: - - Recommended for most users. - - Does not require additional setup. - - Uses Super Protocol's Storj account and thus relies on Super Protocol as the storage provider. -- **Your Storj account**: - - Intended for advanced users. - - Requires creating and setting up a Storj account. - - Gives sole control over the uploaded content and storage account. - -Read [How to Set Up Storage](/marketplace/guides/storage) for step-by-step instructions. \ No newline at end of file diff --git a/docs/marketplace/images/web2-account.png b/docs/marketplace/images/web2-account.png index 528db2d7d11a089b30e226cbdcc7497ed4622be4..80cc8beec183f35b36d3cb095bb07b7e1e5446ea 100644 GIT binary patch literal 10357 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 Date: Thu, 2 Apr 2026 16:21:06 -0300 Subject: [PATCH 13/13] Add the vllm guide for swarm --- .../Guides/deploy-app/deploy-app-example.md | 12 +- docs/cli/Guides/swarm-vllm.md | 181 ++++++++++++++++++ docs/cli/images/create-kubernetes-space.png | Bin 0 -> 20631 bytes docs/cli/images/ingresses.png | Bin 0 -> 14143 bytes docs/cli/images/kubernetes-create-cluster.png | Bin 0 -> 19120 bytes .../images/kubernetes-download-kubeconfig.png | Bin 0 -> 22049 bytes .../cli/images/kubernetes-publish-cluster.png | Bin 0 -> 22774 bytes docs/cli/images/swarm-log-in.png | Bin 0 -> 3806 bytes docs/marketplace/Guides/storage.md | 2 +- docs/marketplace/account.md | 2 +- static/files/deploy_apertus_official.sh | 154 +++++++++++++++ static/files/deploy_medgemma_official.sh | 170 ++++++++++++++++ 12 files changed, 513 insertions(+), 8 deletions(-) create mode 100644 docs/cli/Guides/swarm-vllm.md create mode 100644 docs/cli/images/create-kubernetes-space.png create mode 100644 docs/cli/images/ingresses.png create mode 100644 docs/cli/images/kubernetes-create-cluster.png create mode 100644 docs/cli/images/kubernetes-download-kubeconfig.png create mode 100644 docs/cli/images/kubernetes-publish-cluster.png create mode 100644 docs/cli/images/swarm-log-in.png create mode 100755 static/files/deploy_apertus_official.sh create mode 100755 static/files/deploy_medgemma_official.sh diff --git a/docs/cli/Guides/deploy-app/deploy-app-example.md b/docs/cli/Guides/deploy-app/deploy-app-example.md index 762949db..edb21fd1 100644 --- a/docs/cli/Guides/deploy-app/deploy-app-example.md +++ b/docs/cli/Guides/deploy-app/deploy-app-example.md @@ -98,7 +98,7 @@ RUN chmod +x /usr/local/bin/usd_to_crypto.py COPY entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh -# Set /sp as workdir (doesn't matter in this case; entrypoint.sh uses /sp/output as workdir) +# Set /sp as workdir (doesn't matter in this case -- entrypoint.sh uses /sp/output as workdir) WORKDIR /sp # Set entrypoint @@ -137,8 +137,8 @@ tar -czvf input.tar.gz ./input.txt ```shell ./spctl files upload ./input.tar.gz \ ---filename input.tar.gz \ ---output input.resource.json + --filename input.tar.gz \ + --output input.resource.json ``` ### 3. Deploy @@ -147,9 +147,9 @@ Place an order: ```shell ./spctl workflows create \ ---tee 7 \ ---solution ./usd_to_crypto.resource.json \ ---data ./input.resource.json + --tee 7 \ + --solution ./usd_to_crypto.resource.json \ + --data ./input.resource.json ``` Find the order ID in the output, for example: diff --git a/docs/cli/Guides/swarm-vllm.md b/docs/cli/Guides/swarm-vllm.md new file mode 100644 index 00000000..c9022890 --- /dev/null +++ b/docs/cli/Guides/swarm-vllm.md @@ -0,0 +1,181 @@ +--- +id: "swarm-vllm" +title: "vLLM on Super Swarm" +slug: "/guides/swarm-vllm" +sidebar_position: 20 +--- + +This guide provides step-by-step instructions for deploying MedGemma and Apertus on Super Swarm using vLLM. + +## Prerequisites + +- [kubectl](https://kubernetes.io/docs/tasks/tools/) +- [helm](https://helm.sh/docs/intro/install/) +- A domain +- For [MedGemma](https://huggingface.co/google/medgemma-1.5-4b-it): an HF_TOKEN from an account that has already accepted the model's terms + +Also, download and rename deployment scripts: + +- [`deploy_medgemma_official.sh`](/files/deploy_medgemma_official.sh) +- [`deploy_apertus_official.sh`](/files/deploy_apertus_official.sh) + +## 1. Sign in using MetaMask + + +
+ +## 2. Create a Kubernetes cluster + +2.1. Go to **Kubernetes** and press **Create Cluster**: + + +
+
+ +2.2. Add a GPU to the cluster, allocate resources, and press **Create Cluster**: + + +
+ +## 3. Download the cluster configuration file + + +
+ +## 4. Point `kubectl` to the configuration file + +Execute the following command: + +```shell +export KUBECONFIG=-kubeconfig.yaml +``` + +Replace `-kubeconfig.yaml` with the name of the downloaded configuration file. + +## 5. Update the scripts + +In both scripts (`deploy_medgemma_official.sh` and `deploy_apertus_official.sh`), find `BASE_DOMAIN="${BASE_DOMAIN:-monai-swarm.win}"` and replace `monai-swarm.win` with your domain. + +## 6. Create an API key + +Execute the following command and type a desired key: + +```shell +read -rs API_KEY && export API_KEY +``` + +## 7. Deploy the model + +Apertus: + +```shell +bash deploy_apertus_official.sh +``` + +The deployment usually takes 5-7 minutes. + +A working Apertus config is already set in the script: + +``` +dtype=bfloat16 +max-model-len=32768 +gpu-memory-utilization=0.55 +max-num-seqs=8 +max-num-batched-tokens=4096 +``` + +MedGemma: + +```shell +export HF_TOKEN=hf_xxx +bash deploy_medgemma_official.sh +``` + +Replace `hf_xxx` with an HF_TOKEN. + +Alternatively, create a `.hf_token` file next to `deploy_medgemma_official.sh`; the script will read it automatically. + +A working MedGemma config is already set in the script: + +``` +dtype=bfloat16 +max-model-len=8192 +gpu-memory-utilization=0.40 +--mm-processor-cache-gb 1 +max-num-seqs=4 +max-num-batched-tokens=2048 +``` + +## 8. Check Kubernetes + +```shell +kubectl get pods -o wide +kubectl get svc +kubectl get ingress +``` + +Expected output: + +- Two pods in `1/1 Running` +- Two services +- Two ingresses + +## 9. Confirm DNS records + +Back in the Super Swarm dashboard, go to **Ingresses** and note the two hostnames listed there. + + +
+
+ +For each hostname, add a CNAME record pointing to it and a TXT record for domain verification at your DNS provider. + +## 10. Publish the cluster + +In the Super Swarm dashboard, go to **Kubernetes** and publish the cluster. + + +
+ +## 11. Send test requests + +In the test requests below, replace: + +- `` with your domain. +- `` with the API key you set in [Step 6](/cli/guides/swarm-vllm#6-create-an-api-key). + +Apertus: + +```shell +curl https://apertus-vllm./v1/completions \ + -H 'Authorization: Bearer ' \ + -H 'Content-Type: application/json' \ + -d '{ + "model": "swiss-ai/Apertus-8B-2509", + "prompt": "Write a concise technical summary of Kubernetes GPU scheduling.", + "temperature": 0, + "max_tokens": 200 + }' +``` + +MedGemma: + +```shell +curl https://medgemma-vllm./v1/chat/completions \ + -H 'Authorization: Bearer ' \ + -H 'Content-Type: application/json' \ + -d '{ + "model": "google/medgemma-1.5-4b-it", + "messages": [ + { + "role": "user", + "content": [ + {"type": "text", "text": "Describe this image briefly."}, + {"type": "image_url", "image_url": {"url": "data:image/png;base64,PASTE_BASE64_HERE"}} + ] + } + ], + "temperature": 0, + "max_tokens": 120 + }' +``` \ No newline at end of file diff --git a/docs/cli/images/create-kubernetes-space.png b/docs/cli/images/create-kubernetes-space.png new file mode 100644 index 0000000000000000000000000000000000000000..c98291d60cec3500c99123050dbb6fd28eb0c968 GIT binary patch literal 20631 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 X>I$>m^&OlvC}v@P;&6eP%gz4)3v^p3 literal 0 HcmV?d00001 diff --git a/docs/cli/images/ingresses.png b/docs/cli/images/ingresses.png new file mode 100644 index 0000000000000000000000000000000000000000..86b2a44b9d6e87b96dbb9bf115119500501bf0dd GIT binary patch literal 14143 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 literal 0 HcmV?d00001 diff --git a/docs/cli/images/kubernetes-create-cluster.png b/docs/cli/images/kubernetes-create-cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..312d03da18a0e1825373625be6569aaf5259d965 GIT binary patch literal 19120 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 z zn}=e~frU7SdlncWGr;dd^`aGQqVCn5?$6(>m|?)F_e8J#S{OnZ;y7@)B$3jHpHhhF z*(Kwt(`^kx@nE6zFJQlx)w#GsFvWV#lNL~GN`|e2f)I3*!=|<2;w{io{4#F7XFH~w z&E%XhvO`XEuku6OegW~Z>9$EI_wLh29X)*b7Pc4+topRBM7uEcmI-zQ{|+XQ?3>b- za`@ANbPfg7Sj7?TBY7P$-^xSBdorxo0vqjsKXbn3cHR5=LyfeqiVCBI)dN-C*Yz2B z)&bGWJ*Nr+%PWs6QHHY@k#4hxeC|6ui}3x;$J87Pq2Y4m)^9!UsAwkLDjCqI8?|Q>QPhYIBuze%I3v?rfgq25akbEc`0EQoJRjOE;WJQP^6%st z5%l})Pp60ZYQe5x(L=bM57*{Y$ll$yQPgQQ80$x4v-!A@IoAxZ{X@E8MV5*`b9=b2 zH~FC|bdy|bAcN?=P&41eQu{(*gmwX%*|2kF>Y_0HQMVoGQh7db4EYpt$3JSM+9FKDSgFK9ufTfDBA$O z*BX1~sQ}Kn(gYWynF;*-5=G&miQx(cRJ0w*Ba0$A?9j%D-v$L>-nY4}M1p`V&m1GM zB|Zotvmc`2ov46SLOa((=PKt+&e;-8-v`2f7YlqU9ku zF&yEGU3|}5ZM$4SWsqHygU;LkSV!*;Picg>Nw?#YBl85l$1b6vV_nO2u$n_t_JUMUOxY_Up29f((& zu!2GUAJ1w@w6v&=?97CpRC~_oZ7F08NTlL$^DBjW%|G+FI6jlT5m&wBuAERdffFD9 z{HBWA!|7=d5oJf_ytzb1i25@v&$Mr_@Ae(vZ%oRzJiTX9cB3UmU1k4z5rt{}=?l(+ zZ!FE2NK20RdYHQ#c+SI~bhTR^h&Q!0crWHm_UFbf?ZhhPXMH>f>OZu|3S|GNjux2V zUcYc~eS0rJa(<{-#iQF8cM_Y7T_nO}Ux6b%MI>=W^@!qj5OHepz<;x8J-%F193z)alECpDZnFFGjwm~ zZm-M3-)?fnpWOA|;f~2O_zN*}sZn#2MY$mq<_7)8=a|J*hakZsyK+YC;ab>TA9B0e zi1_$M;O@etHyJ_d7k+Yq)SFCWro2^3&^eBH?Z?xkCR}*&}F+IK{``>x@|0;hHVk38_)Xy*j;)<3@ z6g(^M)MAqJ!*3%qV6yi_fzuGw=TY3k#rlTkSR9e-+r-uowEvcj^GHp~pR#xrSy&ja z2P*F%{IODq*Qq1gdWODN7m6rLAA_$Rt1SKK)bpbLnqDobNxROYOe@IFaw@R|@=C@h zxE%lJZcDW(R*A?(riBPc%+Hfk5#r+2+t|b8+4jjl39ZbDpUWf zxS*&`SUI$>UIewFsVK_w8cqtW|4bfR3uI&%507*@!|bDcJ`Ql_Ghd4{kU0Za0?)B1 zuU)ObtHn%D0&2kt>=+4DeW-$yAB~Y|qEv}eEn&BLU9;44G=LZ^$l~=O`t_YsI}!K; zJiG-m%HjR&yJgC-H4o$D) zcT>O19H#yhUrA0P69Ysi@Hlq^N~XFqv=r&#}~TfM7-&TzdI zf_Lmxz=Sr3@QS&5Zn~?oc~<+W#yNs+kfX7;#Bs!2bXdTQXQ|(qZ>xturEwLkzgFu$ z?Gjd|!MKkuvDkd|50vw>=c@g$n@cqG5fyCWx9QA>{FN$`8}Y!Y5Lfw_&_2uSnC5h8 zrIR(Q@m0I@%j==Azp#aZZtfFyeae;Ht`_@iB1C1@mbLcyjjQ-;f_Cc zC5oH7i1^oS3@vRrvw^32OAsOi+;DUY_8zMKvldgXmjsK#jZ$rLzmj!m(*RC?1(5h@ z8sgiVK*(>92&!1ow4O-Le0OK*bcO1zZU>NJW*{&H_awexkC(ZZr zHQdTJG`!^F4+R#mjplGFCnyIdL*=w0!~b78Ey99%nIznoWyKgm#`+Z$f|zK~O)u5a zL~LxiSoDJfFzr5XkvvgOz)3Q+EBy-_PE{
diff --git a/docs/marketplace/account.md b/docs/marketplace/account.md index 3f2b4345..99f147c1 100644 --- a/docs/marketplace/account.md +++ b/docs/marketplace/account.md @@ -46,7 +46,7 @@ You have two options of decentralized storage to upload files: - Uses Super Protocol's Storj account and thus relies on Super Protocol as the storage provider. - **Your Storj account**: - Intended for advanced users. - - Requires creating and [setting up a Storj account](http://localhost:3000/marketplace/guides/storage). + - Requires creating and [setting up a Storj account](/marketplace/guides/storage). - Gives sole control over the uploaded content and storage account. Read [How to Set Up Storage](/marketplace/guides/storage) for step-by-step instructions. \ No newline at end of file diff --git a/static/files/deploy_apertus_official.sh b/static/files/deploy_apertus_official.sh new file mode 100755 index 00000000..1487a1c7 --- /dev/null +++ b/static/files/deploy_apertus_official.sh @@ -0,0 +1,154 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +BASE_DOMAIN="${BASE_DOMAIN:-monai-swarm.win}" +API_HOST="${API_HOST:-apertus-vllm.${BASE_DOMAIN}}" +MODEL_NAME="${MODEL_NAME:-swiss-ai/Apertus-8B-2509}" +MODEL_ENTRY_NAME="${MODEL_ENTRY_NAME:-apertus}" +RELEASE_NAME="${RELEASE_NAME:-apertus-official}" +if [ -z "${API_KEY:-}" ]; then + echo "API_KEY must be set. Execute:" >&2 + echo "read -rs API_KEY && export API_KEY" >&2 + echo "And then type a desired key." >&2 + exit 1 +fi +IMAGE_REPOSITORY="${IMAGE_REPOSITORY:-vllm/vllm-openai}" +IMAGE_TAG="${IMAGE_TAG:-v0.18.0}" +GPU_MEMORY_UTILIZATION="${GPU_MEMORY_UTILIZATION:-0.55}" +MAX_MODEL_LEN="${MAX_MODEL_LEN:-32768}" +CPU_REQUEST="${CPU_REQUEST:-8}" +MEMORY_REQUEST="${MEMORY_REQUEST:-48Gi}" +GPU_COUNT="${GPU_COUNT:-1}" +PVC_STORAGE="${PVC_STORAGE:-80Gi}" +INGRESS_CLASS="${INGRESS_CLASS:-nginx}" + +need() { command -v "$1" >/dev/null 2>&1 || { echo "Missing dependency: $1" >&2; exit 1; }; } +need kubectl +need helm + +NAMESPACE="${NAMESPACE:-$(kubectl config view --minify -o jsonpath='{..namespace}' 2>/dev/null || true)}" +if [ -z "${NAMESPACE}" ]; then + NAMESPACE="llm" +fi + +SECRET_NAME="${RELEASE_NAME}-auth" +SERVICE_NAME="${RELEASE_NAME}-${MODEL_ENTRY_NAME}-engine-service" +DEPLOY_LABEL_MODEL="${MODEL_ENTRY_NAME}" +INGRESS_NAME="${RELEASE_NAME}-api-ingress" + +echo "==> Runtime: vLLM (official helm chart)" +echo "==> Namespace: ${NAMESPACE}" +echo "==> Release: ${RELEASE_NAME}" +echo "==> API host: ${API_HOST}" +echo "==> Model: ${MODEL_NAME}" +echo "==> Model entry name: ${MODEL_ENTRY_NAME}" +echo "==> Image: ${IMAGE_REPOSITORY}:${IMAGE_TAG}" +echo "==> Max model length: ${MAX_MODEL_LEN}" +echo "==> GPU memory utilization: ${GPU_MEMORY_UTILIZATION}" +echo + +kubectl get ns "${NAMESPACE}" >/dev/null 2>&1 || kubectl create ns "${NAMESPACE}" + +helm repo add vllm https://vllm-project.github.io/production-stack >/dev/null 2>&1 || true +helm repo update >/dev/null 2>&1 + +cat < "${VALUES_FILE}" < Pods:" +kubectl -n "${NAMESPACE}" get pods -o wide +echo +echo "==> Services:" +kubectl -n "${NAMESPACE}" get svc -o wide +echo +echo "==> Ingress:" +kubectl -n "${NAMESPACE}" get ingress -o wide +echo +echo "==> Waiting for Apertus pod readiness..." +kubectl -n "${NAMESPACE}" wait --for=condition=ready pod \ + -l "model=${DEPLOY_LABEL_MODEL},helm-release-name=${RELEASE_NAME}" \ + --timeout=900s +echo +echo "==> Ready" +echo "Base URL: https://${API_HOST}/v1" +echo "Model: ${MODEL_NAME}" +echo "Example:" +echo " curl https://${API_HOST}/v1/models -H 'Authorization: Bearer ${API_KEY}'" diff --git a/static/files/deploy_medgemma_official.sh b/static/files/deploy_medgemma_official.sh new file mode 100755 index 00000000..7845a04e --- /dev/null +++ b/static/files/deploy_medgemma_official.sh @@ -0,0 +1,170 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +BASE_DOMAIN="${BASE_DOMAIN:-monai-swarm.win}" +API_HOST="${API_HOST:-medgemma-vllm.${BASE_DOMAIN}}" +MODEL_NAME="${MODEL_NAME:-google/medgemma-1.5-4b-it}" +MODEL_ENTRY_NAME="${MODEL_ENTRY_NAME:-medgemma}" +RELEASE_NAME="${RELEASE_NAME:-medgemma-official}" +if [ -z "${API_KEY:-}" ]; then + echo "API_KEY must be set. Execute:" >&2 + echo "read -rs API_KEY && export API_KEY" >&2 + echo "And then type a desired key." >&2 + exit 1 +fi +IMAGE_REPOSITORY="${IMAGE_REPOSITORY:-vllm/vllm-openai}" +IMAGE_TAG="${IMAGE_TAG:-v0.18.0}" +GPU_MEMORY_UTILIZATION="${GPU_MEMORY_UTILIZATION:-0.40}" +MAX_MODEL_LEN="${MAX_MODEL_LEN:-8192}" +CPU_REQUEST="${CPU_REQUEST:-8}" +MEMORY_REQUEST="${MEMORY_REQUEST:-48Gi}" +GPU_COUNT="${GPU_COUNT:-1}" +PVC_STORAGE="${PVC_STORAGE:-80Gi}" +INGRESS_CLASS="${INGRESS_CLASS:-nginx}" + +if [ -z "${HF_TOKEN:-}" ] && [ -f "${SCRIPT_DIR}/.hf_token" ]; then + HF_TOKEN="$(cat "${SCRIPT_DIR}/.hf_token")" +fi + +if [ -z "${HF_TOKEN:-}" ]; then + echo "HF_TOKEN is required for ${MODEL_NAME}." >&2 + echo "Set HF_TOKEN in the environment or create ${SCRIPT_DIR}/.hf_token." >&2 + exit 1 +fi + +need() { command -v "$1" >/dev/null 2>&1 || { echo "Missing dependency: $1" >&2; exit 1; }; } +need kubectl +need helm + +NAMESPACE="${NAMESPACE:-$(kubectl config view --minify -o jsonpath='{..namespace}' 2>/dev/null || true)}" +if [ -z "${NAMESPACE}" ]; then + NAMESPACE="llm" +fi + +SECRET_NAME="${RELEASE_NAME}-auth" +SERVICE_NAME="${RELEASE_NAME}-${MODEL_ENTRY_NAME}-engine-service" +DEPLOY_LABEL_MODEL="${MODEL_ENTRY_NAME}" +INGRESS_NAME="${RELEASE_NAME}-api-ingress" + +echo "==> Runtime: vLLM (official helm chart)" +echo "==> Namespace: ${NAMESPACE}" +echo "==> Release: ${RELEASE_NAME}" +echo "==> API host: ${API_HOST}" +echo "==> Model: ${MODEL_NAME}" +echo "==> Model entry name: ${MODEL_ENTRY_NAME}" +echo "==> Image: ${IMAGE_REPOSITORY}:${IMAGE_TAG}" +echo "==> Max model length: ${MAX_MODEL_LEN}" +echo "==> GPU memory utilization: ${GPU_MEMORY_UTILIZATION}" +echo + +kubectl get ns "${NAMESPACE}" >/dev/null 2>&1 || kubectl create ns "${NAMESPACE}" + +helm repo add vllm https://vllm-project.github.io/production-stack >/dev/null 2>&1 || true +helm repo update >/dev/null 2>&1 + +cat < "${VALUES_FILE}" < Pods:" +kubectl -n "${NAMESPACE}" get pods -o wide +echo +echo "==> Services:" +kubectl -n "${NAMESPACE}" get svc -o wide +echo +echo "==> Ingress:" +kubectl -n "${NAMESPACE}" get ingress -o wide +echo +echo "==> Waiting for MedGemma pod readiness..." +kubectl -n "${NAMESPACE}" wait --for=condition=ready pod \ + -l "model=${DEPLOY_LABEL_MODEL},helm-release-name=${RELEASE_NAME}" \ + --timeout=900s +echo +echo "==> Ready" +echo "Base URL: https://${API_HOST}/v1" +echo "Model: ${MODEL_NAME}" +echo "Example:" +echo " curl https://${API_HOST}/v1/models -H 'Authorization: Bearer ${API_KEY}'"