From bca38240b6cb646ccf6477fd8091b19d0296afea Mon Sep 17 00:00:00 2001 From: NiveditJain Date: Mon, 1 Sep 2025 22:24:01 +0530 Subject: [PATCH 1/2] Enhance documentation for Runtime blocking behavior and interactive usage - Added a section in the Getting Started guide to highlight the blocking nature of `Runtime.start()`, particularly in interactive environments like Jupyter notebooks and Python REPLs. - Provided alternative approaches for running the runtime in the background using threading and asyncio, ensuring users can continue their interactive sessions without interruption. - Updated the index and create-runtime documentation to reference the new guidance on handling blocking operations. - Removed the satellites documentation as part of a cleanup effort, consolidating relevant information into the main guides. --- docs/docs/exosphere/create-runtime.md | 38 ++++++ docs/docs/getting-started.md | 77 ++++++++++-- docs/docs/index.md | 5 +- .../satellites/exospherehost/call-webhook.md | 71 ----------- .../deepseek-r1-distrill-llama-70b.md | 68 ---------- .../satellites/exospherehost/forward-logs.md | 53 -------- .../satellites/exospherehost/get-files.md | 81 ------------ .../satellites/exospherehost/move-file.md | 48 -------- .../exospherehost/parse-with-docling.md | 32 ----- .../satellites/exospherehost/send-alert.md | 38 ------ .../satellites/exospherehost/send-email.md | 72 ----------- docs/docs/satellites/index.md | 116 ------------------ 12 files changed, 111 insertions(+), 588 deletions(-) delete mode 100644 docs/docs/satellites/exospherehost/call-webhook.md delete mode 100644 docs/docs/satellites/exospherehost/deepseek-r1-distrill-llama-70b.md delete mode 100644 docs/docs/satellites/exospherehost/forward-logs.md delete mode 100644 docs/docs/satellites/exospherehost/get-files.md delete mode 100644 docs/docs/satellites/exospherehost/move-file.md delete mode 100644 docs/docs/satellites/exospherehost/parse-with-docling.md delete mode 100644 docs/docs/satellites/exospherehost/send-alert.md delete mode 100644 docs/docs/satellites/exospherehost/send-email.md delete mode 100644 docs/docs/satellites/index.md diff --git a/docs/docs/exosphere/create-runtime.md b/docs/docs/exosphere/create-runtime.md index 30cd0807..604fa148 100644 --- a/docs/docs/exosphere/create-runtime.md +++ b/docs/docs/exosphere/create-runtime.md @@ -4,6 +4,29 @@ The `Runtime` class is the core component that manages the execution environment ## Runtime Setup +Before creating a runtime, you need to set up the state manager and configure your environment variables. + +### Prerequisites + +1. **Start the State Manager**: Run the state manager using Docker Compose: + ```bash + docker-compose up -d + ``` + For detailed setup instructions, see [State Manager Setup](./state-manager-setup.md). + +2. **Set Environment Variables**: Configure your authentication: + ```bash + export EXOSPHERE_STATE_MANAGER_URI="your-state-manager-uri" + export EXOSPHERE_API_KEY="your-api-key" + ``` + + Or create a `.env` file: + ```bash + EXOSPHERE_STATE_MANAGER_URI=your-state-manager-uri + EXOSPHERE_API_KEY=your-api-key + ``` + +### Creating a Runtime === "Basic" ```python hl_lines="17-22" @@ -68,6 +91,21 @@ The `Runtime` class is the core component that manages the execution environment ``` +!!! warning "Blocking Operation" + `Runtime.start()` is a blocking operation that runs indefinitely. In interactive environments like Jupyter notebooks, consider running it in a background thread: + + ```python + import threading + + def run_runtime(): + runtime.start() + + thread = threading.Thread(target=run_runtime, daemon=True) + thread.start() + ``` + + See the [Getting Started guide](../getting-started.md#important-blocking-behavior) for more alternatives. + ## Runtime Parameters ### Required Parameters diff --git a/docs/docs/getting-started.md b/docs/docs/getting-started.md index 7ab29670..31ddf8ce 100644 --- a/docs/docs/getting-started.md +++ b/docs/docs/getting-started.md @@ -86,6 +86,71 @@ Runtime( ).start() ``` +## Important: Blocking Behavior + +**Note**: `Runtime.start()` is a blocking operation that will run indefinitely until stopped. This can be problematic in interactive environments like Jupyter notebooks or Python REPLs. + +### For Interactive Environments + +If you're working in a Jupyter notebook or Python REPL, consider these alternatives: + +=== "Background Thread" + + ```python + import threading + + # Create the runtime + runtime = Runtime( + namespace="MyProject", + name="DataProcessor", + nodes=[SampleNode] + ) + + # Run in a background thread + def run_runtime(): + runtime.start() + + thread = threading.Thread(target=run_runtime, daemon=True) + thread.start() + + # Your interactive session continues here + print("Runtime is running in the background!") + ``` + +=== "Asyncio Task" + + ```python + import asyncio + + # Create the runtime + runtime = Runtime( + namespace="MyProject", + name="DataProcessor", + nodes=[SampleNode] + ) + + # Run as an asyncio task (if you're in an async context) + async def main(): + task = runtime.start() # Returns a task when in an existing event loop + # You can now do other async work while the runtime runs + await asyncio.sleep(1) # Example: do other work + return task + + # In Jupyter: await main() + ``` + +=== "Production Script" + + ```python + # For production scripts, the blocking behavior is usually desired + if __name__ == "__main__": + Runtime( + namespace="MyProject", + name="DataProcessor", + nodes=[SampleNode] + ).start() # Blocks and runs forever + ``` + ## Next Steps Now that you have the basics, explore: @@ -107,14 +172,10 @@ Now that you have the basics, explore: ## Architecture -``` -┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ -│ Your Nodes │ │ Runtime │ │ State Manager │ -│ │◄──►│ │◄──►│ │ -│ - Inputs │ │ - Registration │ │ - Orchestration │ -│ - Outputs │ │ - Execution │ │ - State Mgmt │ -│ - Secrets │ │ - Error Handling │ │ - Dashboard │ -└─────────────────┘ └──────────────────┘ └─────────────────┘ +```mermaid +graph LR + A["Your Nodes
- Inputs
- Outputs
- Secrets"] <--> B["Runtime
- Registration
- Execution
- Error Handling"] + B <--> C["State Manager
- Orchestration
- State Mgmt
- Dashboard"] ``` ## Data Model (v1) diff --git a/docs/docs/index.md b/docs/docs/index.md index 469bfff2..78b1162c 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -59,9 +59,12 @@ Runtime( namespace="MyProject", name="HelloWorld", nodes=[HelloWorldNode] -).start() +).start() # Note: This blocks the main thread ``` +!!! info "Interactive Environments" + If you're using Jupyter notebooks or Python REPLs, `Runtime.start()` will block your session. See the [Getting Started guide](./getting-started.md#important-blocking-behavior) for non-blocking alternatives. + ### Run it Run the server with: diff --git a/docs/docs/satellites/exospherehost/call-webhook.md b/docs/docs/satellites/exospherehost/call-webhook.md deleted file mode 100644 index 1170a944..00000000 --- a/docs/docs/satellites/exospherehost/call-webhook.md +++ /dev/null @@ -1,71 +0,0 @@ -# `exospherehost/call-webhook` -Call webhooks using HTTP methods (GET, POST, PUT, PATCH, DELETE) to external APIs and services. - -```yaml -# available in namespace `exospherehost/call-webhook` -uses: exospherehost/call-webhook - -# define the sla of the satellite (6h, 12h, 24h) -# higher the sla, higher the discount on the cost -sla: 6h - -# optional: human readable name for the satellite -name: Call External API - -# optional: unique identifier for the satellite -# think of this like a variable name -identifier: call-webhook - -# retries: number of times to retry the satellite if it fails -# default: 3 -retries: 5 - -# configuration for the satellite -config: - # url: the webhook URL to call - # required: true - url: https://api.example.com/webhook - - # method: HTTP method to use - # default: POST - # options: GET, POST, PUT, PATCH, DELETE - method: POST - - # headers: HTTP headers to include in the request - # default: {} - headers: - - Content-Type: application/json - - Authorization: Bearer ${{ secrets.API_TOKEN }} - - # timeout: request timeout in seconds - # default: 30 - timeout: 60 - - # follow_redirects: whether to follow HTTP redirects - # default: true - follow_redirects: true - - # verify_ssl: whether to verify SSL certificates - # default: true - verify_ssl: true - -input: - # body: request body (for POST, PUT, PATCH methods) - # default: null - body: - key: value - data: ${{ satellites.previous-satellite.output }} - - # query_params: query parameters for GET requests - # default: {} - query_params: - param1: value1 - param2: value2 - - # form_data: form data for POST requests - # default: {} - form_data: - field1: value1 - file: ${{ satellites.file-upload.output }} - -``` \ No newline at end of file diff --git a/docs/docs/satellites/exospherehost/deepseek-r1-distrill-llama-70b.md b/docs/docs/satellites/exospherehost/deepseek-r1-distrill-llama-70b.md deleted file mode 100644 index 9e5b8d99..00000000 --- a/docs/docs/satellites/exospherehost/deepseek-r1-distrill-llama-70b.md +++ /dev/null @@ -1,68 +0,0 @@ -# `exospherehost/deepseek-r1-distrill-llama-70b` -This satellite is designed for running DeepSeek R1 Distrill LLama 70B on ExosphereHost optimized for batch, high data throughput, and low cost (expect 50-75% cheaper inferencing as compared to platforms like Groq, TogetherAI). - -Here are possible configurations available to you for this satellite: - -```yaml -# available in namespace `exospherehost/deepseek-r1-distrill-llama-70b` -uses: exospherehost/deepseek-r1-distrill-llama-70b - -# define the sla of the satellite (6h, 12h, 24h) -# higher the sla, higher the discount on the cost -sla: 6h - -# optional: human readable name for the satellite -name: Say Hello World - -# optional: unique identifier for the satellite -# think of this like a variable name -identifier: say-hello - -# retries: number of times to retry the satellite if it fails -# default: 3 -retries: 5 - -# configuration for the satellite -config: - # temperature: temperature for the model - # default: 0.5 - temperature: 0.5 - - # max-tokens: maximum number of tokens to generate - # default: 65,536 - max-tokens: 1024 - - # output-format: format of the output, in built supported formats are: - # - text - # - json - # default: text - output-format: json - - # output-schema: schema for the output - # default: null - output-schema: | - { - "company": string, - "quarter": string, - "year": string, - "revenue": number, - "net-income": number, - "gross-profit": number, - "operating-income": number, - } - - input: - prompt: Give me data in the format of the output-schema - - # alternatively, you can pass a chat history like this: - messages: - - role: user - content: | - What is the capital of France? - - role: assistant - content: | - The capital of France is Paris. - - role: user - content: | - What is the capital of Germany? -``` \ No newline at end of file diff --git a/docs/docs/satellites/exospherehost/forward-logs.md b/docs/docs/satellites/exospherehost/forward-logs.md deleted file mode 100644 index 978b782e..00000000 --- a/docs/docs/satellites/exospherehost/forward-logs.md +++ /dev/null @@ -1,53 +0,0 @@ -# `exospherehost/forward-logs` -Simply forward logs to your favorite logging service, currently supported services are: - -- New Relic -- Datadog -- Sentry -- Logz.io -- Kusto -- CloudWatch - -```yaml -# available in namespace `exospherehost/forward-logs` -uses: exospherehost/forward-logs - -# define the sla of the satellite (6h, 12h, 24h) -# higher the sla, higher the discount on the cost -sla: 6h - -# optional: name for human readable identifier -identifier: forward-logs - -# optional: Identifier for the satellite -# think of this like a variable name -identifier: forward-logs - -# retries: number of times to retry the satellite if it fails -# default: 3 -retries: 5 - -# configuration for the satellite -config: - # log-level: level of the log to forward - # default: info - log-level: info - - # provider: provider of the log - # required: true - provider: new-relic - - # account-id: account id for the provider - # required: true - account-id: ${{ secrets.NEW_RELIC_ACCOUNT_ID }} - - # api-key: api key for the provider - # required: true - api-key: ${{ secrets.NEW_RELIC_API_KEY }} - - # application-id: application id for the provider - # required: true - application-id: ${{ secrets.NEW_RELIC_APPLICATION_ID }} -``` - -Secrets can vary depending on the provider of your choice. \ No newline at end of file diff --git a/docs/docs/satellites/exospherehost/get-files.md b/docs/docs/satellites/exospherehost/get-files.md deleted file mode 100644 index 261bf500..00000000 --- a/docs/docs/satellites/exospherehost/get-files.md +++ /dev/null @@ -1,81 +0,0 @@ -# `exospherehost/get-files` -Simply gets files from various cloud storage services to exospherehost for further processing. Currently supported services are: - -- AWS S3 -- Google Cloud Storage -- Azure Blob Storage -- Dropbox -- Google Drive -- OneDrive -- SFTP -- FTP - -```yaml -# available in namespace `exospherehost/get-files` -uses: exospherehost/get-files - -# define the sla of the satellite (6h, 12h, 24h) -# higher the sla, higher the discount on the cost -sla: 6h - -# optional: name for human readable identifier -identifier: get-files - -# retries: number of times to retry the satellite if it fails -# default: 3 -retries: 5 - -# configuration for the satellite -config: - # provider: provider of the file - # required: true - provider: aws-s3 - - # root-path: root path of the file or folder to get - folder-path: s3://my-bucket/my-folder - - # file-path: file path of the file to get - file-path: s3://my-bucket/my-file.txt - - # recursive: whether to get the files recursively - # default: false - recursive: true - - # exclude-files: files to exclude from the get - # default: [] - exclude-files: - - s3://my-bucket/my-folder/my-file.txt - - s3://my-bucket/my-folder/my-file2.txt - - # exclude-folders: folders to exclude from the get - # default: [] - exclude-folders: - - s3://my-bucket/my-folder/my-folder2 - - # allowed extensions: extensions to include from the get - # default: [] - allowed-extensions: - - .txt - - .pdf - - .docx - - .doc - - .xls - - .xlsx - - .csv - - # blocked-extensions: extensions to exclude from the get - # default: [] - blocked-extensions: - - .exe - - .dll - - .so - - .dylib - - .lib - - # secrets: secrets to use for the satellite - # depends on the provider of the file - # required: true - secrets: - - AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} - - AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} -``` \ No newline at end of file diff --git a/docs/docs/satellites/exospherehost/move-file.md b/docs/docs/satellites/exospherehost/move-file.md deleted file mode 100644 index 7b8de3bd..00000000 --- a/docs/docs/satellites/exospherehost/move-file.md +++ /dev/null @@ -1,48 +0,0 @@ -# `exospherehost/move-file` -Very similar to `exospherehost/get-files` but instead of getting files, it moves files from one location to another, all support for get-files is also supported for move-file. - -```yaml -# available in namespace `exospherehost/move-file` -uses: exospherehost/move-file - -# define the sla of the satellite (6h, 12h, 24h) -# higher the sla, higher the discount on the cost -sla: 6h - -# optional: name for human readable identifier -identifier: move-file - -# optional: Identifier for the satellite -# think of this like a variable name -identifier: move-file - -# retries: number of times to retry the satellite if it fails -# default: 3 -retries: 5 - -# configuration for the satellite -config: - # source provider: provider of the file - # required: true - source-provider: aws-s3 - - # source-file-path: file path of the file to move - # required: true - source-file-path: s3://my-bucket/my-file.txt - - # destination provider: provider of the file - # required: true - destination-provider: aws-s3 - - # destination-file-path: file path of the file to move - # required: true - destination-file-path: s3://my-bucket/my-file.txt - - # secrets: secrets to use for the satellite - # required: true - secrets: - - SOURCE_AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} - - SOURCE_AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} - - DESTINATION_AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} - - DESTINATION_AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} -``` \ No newline at end of file diff --git a/docs/docs/satellites/exospherehost/parse-with-docling.md b/docs/docs/satellites/exospherehost/parse-with-docling.md deleted file mode 100644 index 7588137b..00000000 --- a/docs/docs/satellites/exospherehost/parse-with-docling.md +++ /dev/null @@ -1,32 +0,0 @@ -# `exospherehost/parse-with-docling` -This satellite is designed to parse documents with Docling, a powerful document parsing library to get structured data from documents. - -```yaml -# available in namespace `exospherehost/parse-with-docling` -uses: exospherehost/parse-with-docling - -# define the sla of the satellite (6h, 12h, 24h) -# higher the sla, higher the discount on the cost -sla: 6h - -# optional: name for human readable identifier -identifier: parse-with-docling - -# optional: Identifier for the satellite -# think of this like a variable name -identifier: parse-with-docling - -# retries: number of times to retry the satellite if it fails -# default: 3 -retries: 5 - -# configuration for the satellite -config: - # file-path: file path of the file to parse - # required: true - file-path: s3://my-bucket/my-file.txt - - # output-format: format of the output - # default: json - output-format: markdown -``` \ No newline at end of file diff --git a/docs/docs/satellites/exospherehost/send-alert.md b/docs/docs/satellites/exospherehost/send-alert.md deleted file mode 100644 index d3f6c2d6..00000000 --- a/docs/docs/satellites/exospherehost/send-alert.md +++ /dev/null @@ -1,38 +0,0 @@ -# `exospherehost/send-alert` -Sends alerts to your favorite alerting service, currently supported services are: - -- PagerDuty -- Slack -- Discord - -```yaml -# available in namespace `exospherehost/send-alert` -uses: exospherehost/send-alert - -# define the sla of the satellite (6h, 12h, 24h) -# higher the sla, higher the discount on the cost -sla: 6h - -# optional: name for human readable identifier -identifier: send-alert - -# optional: Identifier for the satellite -# think of this like a variable name -config: - # provider: provider of the alert - # required: true - provider: pagerduty - - secrets: - # account-id: account id for the provider - # required: true - account-id: ${{ secrets.PAGERDUTY_ACCOUNT_ID }} - - # api-key: api key for the provider - # required: true - api-key: ${{ secrets.PAGERDUTY_API_KEY }} - - # service-key: service key for the provider - # required: true - service-key: ${{ secrets.PAGERDUTY_SERVICE_KEY }} -``` \ No newline at end of file diff --git a/docs/docs/satellites/exospherehost/send-email.md b/docs/docs/satellites/exospherehost/send-email.md deleted file mode 100644 index 0ca16424..00000000 --- a/docs/docs/satellites/exospherehost/send-email.md +++ /dev/null @@ -1,72 +0,0 @@ -# `exospherehost/send-email` -Send emails using SMTP or any of the supported email providers, including: - -- SMTP -- SES -- Mailgun - -```yaml -# available in namespace `exospherehost/send-email` -uses: exospherehost/send-email - -# define the sla of the satellite (6h, 12h, 24h) -# higher the sla, higher the discount on the cost -sla: 6h - -# optional: name for human readable identifier -identifier: send-email - -# optional: Identifier for the satellite -# think of this like a variable name -identifier: send-email - -# retries: number of times to retry the satellite if it fails -# default: 3 -retries: 5 - -# configuration for the satellite -config: - # provider: provider of the email - # required: true - provider: smtp - - # secrets: secrets to use for the satellite - # required: true - secrets: - - SMTP_HOST: ${{ secrets.SMTP_HOST }} - - SMTP_PORT: ${{ secrets.SMTP_PORT }} - - SMTP_USER: ${{ secrets.SMTP_USER }} - - SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }} - -input: - # to: email address to send the email to - to: john.doe@example.com - - # subject: subject of the email - # required: true - subject: Hello, world! - - # body: body of the email - # required: true - body: This is a test email - - # attachments: attachments to send with the email - # default: [] - attachments: - - s3://my-bucket/my-file.txt - - s3://my-bucket/my-file2.txt - - # cc: cc email addresses - # default: [] - cc: - - jane.doe@example.com - - # bcc: bcc email addresses - # default: [] - bcc: - - jane.doe@example.com - - # reply-to: reply to email address - # default: null - reply-to: john.doe@example.com -``` \ No newline at end of file diff --git a/docs/docs/satellites/index.md b/docs/docs/satellites/index.md deleted file mode 100644 index 4d453897..00000000 --- a/docs/docs/satellites/index.md +++ /dev/null @@ -1,116 +0,0 @@ -# Satellite - -Satellite is the core building blocks for exosphere. They are lego blocks designed for a specific purpose: you can connect them together to create complex systems in a matter of minutes without worrying about the underlying infrastructure. - -They are pre-implemented serverless functions highly optimized for workflows and high volume batch processing, optimized for cost, reliability, developer velocity and ease of use. Our inhouse optimization for workflows and batch processing can lead to significant cost savings, for example you can expect a cost per token saving of about 50-75% on LLMs like DeepSeek R1 70B, Gemma 3 27B, etc. - -## How to use -There are multiple ways to use satellites and depends upon the interface provided by the satellite. Usually you can either use the satellite as a standalone function or you can use it as a part of a cluster (think a group or workflow of satellites for a specific purpose). - -### Cluster based execution -Our model of satellite based execution delivers the best value when grouped together with multiple other satellites for a specific purpose. For example you can create a cluster of satellites to parse a resume, understand financial reports, generating synthetic data, and more. - -To use with cluster you need pass satellite parameter to cluster `YML` file, API or SDK. For example to use `satellite/exospherehost/deepseek-r1-distrill-llama-70b` in a cluster you would need to pass the following to the cluster `YML` file: - -```yaml -sla: "6h" -cluster: - satellites: - - name: DeepSeek R1 Distrill Llama 70B - uses: satellite/exospherehost/deepseek-r1-distrill-llama-70b - identifier: deepseek-r1-distrill-llama-70b - config: - max_tokens: 1000 - temperature: 0.5 - input: - prompt: Hello, how are you? -``` - -Check cluster documentation for more details on how to use satellites in a cluster, further APIs and SDKs would be available soon. - -### API based execution -Usually API based satellite signature would be something like this: -```curl -curl -X POST https://api.exosphere.host/v1/satellites/// \ --H "Authorization: " \ --H "Content-Type: application/json" \ --d '{ - "input": { - "prompt": "Hello, how are you?" - }, - "config": { - "max_tokens": 1000, - "temperature": 0.5 - }, - "sla": "6h" -}' -``` - -This will return a JSON response with output schema as follows: -```json -{ - "execution_id": "", - "sla": "6h", - "status": "pending", - "created_at": "", - "updated_at": "", - "output": null, - "error": null, - "retries": 0 -} -``` - -Further you can poll the status and result of the execution using API execution similar to this: - -```curl -curl -X GET https://api.exosphere.host/v1/satellites//// \ --H "Authorization: " --H "Content-Type: application/json" -``` -this should return a JSON response with status and result of the execution, similar to this: -```json -{ - "execution_id": "", - "sla": "6h", - "status": "completed", - "created_at": "", - "updated_at": "", - "output": { - "response": "Hello, how are you?" - }, - "error": null, - "retries": 0 -} -``` - -### SDK based execution -We are working on SDKs for different programming languages to make it easier to use satellite like Python, JavaScript, Go, etc. These would be available soon on our [github](https://github.com/exospherehost) further on various package managers like `pip`, `npm`, `go get`, etc. - -## Available Exosphere Satellites -Following are the list of satellites which are currently available to `private-beta` developers. - -| Satellite Name | Description | Documentation | -|----------------|-------------|---------------| -| `exospherehost/deepseek-r1-distrill-llama-70b` | Batch inference for DeepSeek R1 Distrill Llama 70B (upto 75% cost savings) | [Read more](./exospherehost/deepseek-r1-distrill-llama-70b.md) | -| `exospherehost/get-files` | Get files from cloud storages | [Read more](./exospherehost/get-files.md) | -| `exospherehost/parse-with-docling` | Parse documents with Docling (PDFs, Word, Images, etc) | [Read more](./exospherehost/parse-with-docling.md) | -| `exospherehost/call-webhook` | Call Webhook (POST, PUT, PATCH, GET, DELETE, etc) | [Read more](./exospherehost/call-webhook.md) | -| `exospherehost/forward-logs` | Forward logs to NewRelic, LogZ, Dynatrace etc. | [Read more](./exospherehost/forward-logs.md) | -| `exospherehost/move-file` | Move files within cloud storages (S3, GCS, etc) | [Read more](./exospherehost/move-file.md) | -| `exospherehost/send-alert ` | Send alert to Slack, PagerDuty, etc. | [Read more](./exospherehost/send-alert.md) | -| `exospherehost/send-email` | Send email (SMTP, SendGrid, SES, SendInBlue, etc) | [Read more](./exospherehost/send-email.md) | - -## Types of Satellites -We are working on following broad types of satellites (Currently `exosphere-satellites` are only available to the `private-beta` users, we are working on making other categories of satellites available to the community): - -#### `exosphere-satellites` -These are the satellites which are built by exosphere team and are available to the community. Initially we will be focusing on building satellites for AI workflows and agents. These would be available under the namespace `satellite/exospherehost/` for example `satellite/exospherehost/deepseek-r1-distrill-llama-70b`. - -#### `community-satellites` -These are the satellites which are built by the community and are available to the community. There would be available under the namespace `satellite//` for example `satellite/aikinclub/parse-resume`. Developers would be able to create them using our ongoing work on `orbit` SDK, once verified and approved they would be available for the community to use. More details on `orbit` SDK, how to create these satellites and how to add to exosphere ecosystem would be available soon. - -#### `custom-satellites` -These are the satellites which are built by the user and is available as per the permission boundary set by the user. These would also follow naming convention of `satellite//` for example `satellite/aikinclub/send-whatsapp-message`, however only cluster/satellite running in the same namespace would be able to access these satellites. Similar to `community-satellites` developers would be able to create them using our ongoing work on `orbit` SDK, however they would be available within the project namespace and would not require any approval. - -#### `configured-satellites` -These are the satellites with additional configuration added to the existing pre-implemented satellites or custom satellites. These would also follow naming convention of `satellite//` for example `satellite/aikinclub/send-whatsapp-message`, however only cluster/satellite running in the same namespace would be able to access these satellites. Creating these would be much easier, essentially you would be able to create a new satellite by configuring an existing satellite through a simple UI or API call, details on how to do this would be available soon. \ No newline at end of file From a38691dcd14129ba56793876c8f7f65fd20ee7b6 Mon Sep 17 00:00:00 2001 From: Nivedit Jain Date: Mon, 1 Sep 2025 22:27:39 +0530 Subject: [PATCH 2/2] Update docs/docs/getting-started.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- docs/docs/getting-started.md | 37 +++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/docs/docs/getting-started.md b/docs/docs/getting-started.md index 31ddf8ce..886648c9 100644 --- a/docs/docs/getting-started.md +++ b/docs/docs/getting-started.md @@ -120,23 +120,26 @@ If you're working in a Jupyter notebook or Python REPL, consider these alternati === "Asyncio Task" ```python - import asyncio - - # Create the runtime - runtime = Runtime( - namespace="MyProject", - name="DataProcessor", - nodes=[SampleNode] - ) - - # Run as an asyncio task (if you're in an async context) - async def main(): - task = runtime.start() # Returns a task when in an existing event loop - # You can now do other async work while the runtime runs - await asyncio.sleep(1) # Example: do other work - return task - - # In Jupyter: await main() +import asyncio + +# Create the runtime +runtime = Runtime( + namespace="MyProject", + name="DataProcessor", + nodes=[SampleNode] +) + +# In an async context (like a Jupyter notebook), +# runtime.start() returns a task that runs in the background. +runtime_task = runtime.start() + +# Your interactive session can continue. +print("Runtime is running in the background!") + +# You can now do other async work while the runtime runs. +# For example: +# await asyncio.sleep(10) +# print("Finished waiting.") ``` === "Production Script"