Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .github/workflows/validate-tooltips.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: Validate Tooltip Imports

on:
pull_request:
branches:
- main
paths:
- '**.mdx'
- 'snippets/tooltips.jsx'
- 'scripts/validate-tooltips.js'
- '.github/workflows/validate-tooltips.yml'

jobs:
validate-tooltips:
name: Check tooltip imports
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Validate tooltip imports
run: node scripts/validate-tooltips.js
16 changes: 8 additions & 8 deletions community-solutions/copyparty-file-manager/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,18 @@ You can access the terminal in two ways:

#### Option 1: Web terminal
If you see this option when clicking "Connect" on your Pod page, you have web terminal access:
![Web Terminal Access](webterminal.png)
![Web Terminal Access](/community-solutions/copyparty-file-manager/webterminal.png)

#### Option 2: JupyterLab terminal
If you have JupyterLab installed on your Pod, you can access the terminal there:
![JupyterLab Terminal](labsterminal.png)
![JupyterLab Terminal](/community-solutions/copyparty-file-manager/labsterminal.png)

## Installation steps

### Step 1: Access your Pod settings

Navigate to your Pod page and locate the settings:
![Edit Pod Settings](edit.png)
![Edit Pod Settings](/community-solutions/copyparty-file-manager/edit.png)

### Step 2: Add an HTTP port

Expand All @@ -58,7 +58,7 @@ Before proceeding, ensure all important files are saved in `/workspace` or backe

Add a dedicated HTTP port for the CopyParty interface. If port 8888 is already in use (common for Jupyter), try port 8000 or another available port.

![Add HTTP Port](addhttp.png)
![Add HTTP Port](/community-solutions/copyparty-file-manager/addhttp.png)

### Step 3: Install and run CopyParty

Expand Down Expand Up @@ -105,19 +105,19 @@ This command:
### Step 4: Access the CopyParty interface

Once CopyParty is running, click on the port number in your Runpod dashboard:
![Access Port](port.png)
![Access Port](/community-solutions/copyparty-file-manager/port.png)

## Using CopyParty

### File navigation

The interface displays your file system on the left side:
![Directory View](directory.png)
![Directory View](/community-solutions/copyparty-file-manager/directory.png)

### Uploading files

Simply drag and drop files into the interface to upload them:
![Upload Files](upload.png)
![Upload Files](/community-solutions/copyparty-file-manager/upload.png)

### Downloading files

Expand All @@ -127,7 +127,7 @@ To download files:
- **"dl"** - Download individual files
- **"zip"** - Download multiple files as a zip archive

![Download Files](download.png)
![Download Files](/community-solutions/copyparty-file-manager/download.png)

## Tips and best practices

Expand Down
2 changes: 1 addition & 1 deletion get-started/manage-accounts.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "Manage accounts"
description: "Create accounts, manage teams, and configure user permissions in Runpod."
---

import { PodsTooltip, ServerlessTooltip, InstantClusterTooltip, NetworkVolumeTooltip, InferenceTooltip } from "/snippets/tooltips.jsx";
import { PodsTooltip, ServerlessTooltip, InferenceTooltip } from "/snippets/tooltips.jsx";

To access Runpod resources, you need to either create your own account or join an existing team through an invitation. This guide explains how to set up and manage accounts, teams, and user roles.

Expand Down
2 changes: 1 addition & 1 deletion get-started/products.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ sidebarTitle: "Product overview"
description: "Explore Runpod's major offerings and find the right solution for your workload."
---

import { ServerlessTooltip, PodsTooltip, PublicEndpointTooltip, InstantClusterTooltip, WorkerTooltip } from "/snippets/tooltips.jsx";
import { ServerlessTooltip, PodsTooltip, PublicEndpointTooltip, InstantClusterTooltip } from "/snippets/tooltips.jsx";

Runpod offers cloud computing resources for AI and machine learning workloads. You can choose from instant GPUs for development, auto-scaling <ServerlessTooltip /> computing, pre-deployed AI models, or multi-node clusters for distributed training.

Expand Down
2 changes: 1 addition & 1 deletion integrations/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ https://abc123xyz-8000.proxy.runpod.net

### Direct TCP

For protocols that require persistent connections or fall outside of standard HTTP, use the [Direct TCP Ports](/pods/configuration/expose-ports#tcp-access-via-public-ip). When you expose a TCP port, Runpod assigns a public IP address and a mapped external port. You can find these details using the [`GET /pods/POD_ID`](/api-reference/pods/GET/pods/POD_ID) endpoint or the [Pod connection menu](/pods/connect-to-a-pod) in the Runpod console.
For protocols that require persistent connections or fall outside of standard HTTP, use the [Direct TCP Ports](/pods/configuration/expose-ports#tcp-access-via-public-ip). When you expose a TCP port, Runpod assigns a public IP address and a mapped external port. You can find these details using the [`GET /pods/POD_ID`](/api-reference/pods/GET/pods/podId) endpoint or the [Pod connection menu](/pods/connect-to-a-pod) in the Runpod console.

## Integrate with Public Endpoints

Expand Down
2 changes: 1 addition & 1 deletion pods/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: Overview
description: "Get on-demand access to powerful computing resources."
---

import { NetworkVolumeTooltip, PodContainerDiskTooltip, VolumeDiskTooltip, ServerlessTooltip, RunpodHubTooltip, GlobalNetworkingTooltip, RunpodCLITooltip, TemplatesTooltip, InferenceTooltip, TrainingTooltip, FineTuningTooltip, MachinesTooltip } from "/snippets/tooltips.jsx";
import { NetworkVolumeTooltip, PodContainerDiskTooltip, VolumeDiskTooltip, ServerlessTooltip, RunpodHubTooltip, TemplatesTooltip, InferenceTooltip, TrainingTooltip, FineTuningTooltip, MachinesTooltip } from "/snippets/tooltips.jsx";

<Frame alt="Pods deployment options">
<img src="/images/pods-deploy.png" />
Expand Down
2 changes: 1 addition & 1 deletion pods/storage/types.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "Storage options"
description: "Choose the right type of storage for your Pods."
---

import { PodsTooltip, VolumeDiskTooltip, NetworkVolumeTooltip, PodTooltip } from "/snippets/tooltips.jsx";
import { PodsTooltip, PodTooltip } from "/snippets/tooltips.jsx";

Choosing the right type of storage is crucial for optimizing your workloads, whether you need temporary storage for active computations, persistent storage for long-term data retention, or permanent, shareable storage across multiple <PodsTooltip />.

Expand Down
2 changes: 1 addition & 1 deletion pods/templates/create-custom-template.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: "A step-by-step guide to extending Runpod's official templates."
tag: "NEW"
---

import { PodTooltip, PodsTooltip, PyTorchTooltip, CUDATooltip, TemplateTooltip, InferenceTooltip } from "/snippets/tooltips.jsx";
import { PodTooltip, PyTorchTooltip, CUDATooltip, TemplateTooltip, InferenceTooltip } from "/snippets/tooltips.jsx";

<Tip>
You can find the complete code for this tutorial, including automated build options with GitHub Actions, in the [runpod-workers/pod-template](https://github.com/runpod-workers/pod-template) repository.
Expand Down
2 changes: 1 addition & 1 deletion pods/templates/environment-variables.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "Environment variables"
description: "Learn how to use environment variables in Runpod Pods for configuration, security, and automation"
---

import { PodTooltip, PodsTooltip } from "/snippets/tooltips.jsx";
import { PodsTooltip } from "/snippets/tooltips.jsx";

Environment variables are key-value pairs that you can configure for your <PodsTooltip />. They are accessible within your containerized application and provide a flexible way to pass configuration settings, secrets, and runtime information to your application without hardcoding them into your code or container image.

Expand Down
2 changes: 1 addition & 1 deletion pods/templates/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "Overview"
description: "Streamline your Pod deployments with templates, bundling prebuilt container images with hardware specs and network settings."
---

import { PodTooltip, PodsTooltip, PodEnvironmentVariablesTooltip } from "/snippets/tooltips.jsx";
import { PodTooltip, PodEnvironmentVariablesTooltip } from "/snippets/tooltips.jsx";

<PodTooltip /> templates are pre-configured Docker image setups that let you quickly spin up Pods without manual environment configuration. They're essentially deployment configurations that include specific models, frameworks, or workflows bundled together.

Expand Down
2 changes: 1 addition & 1 deletion pods/templates/secrets.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "Manage secrets"
description: "Securely store and manage sensitive information like API keys, passwords, and tokens with Runpod secrets."
---

import { PodTooltip, PodsTooltip, TemplatesTooltip } from "/snippets/tooltips.jsx";
import { PodTooltip, TemplatesTooltip } from "/snippets/tooltips.jsx";

This guide shows how to create, view, edit, delete, and use secrets in your <PodTooltip /> <TemplatesTooltip /> to protect sensitive data and improve security.

Expand Down
193 changes: 193 additions & 0 deletions scripts/validate-tooltips.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
#!/usr/bin/env node

/**
* Tooltip Import Validator
*
* This script validates that all tooltip components used in MDX files
* are properly imported from /snippets/tooltips.jsx.
*
* Exit codes:
* 0 - All tooltips are properly imported
* 1 - Missing imports detected
*/

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');

// Path to the tooltips definition file
const TOOLTIPS_FILE = 'snippets/tooltips.jsx';

// Get all available tooltip exports from tooltips.jsx
function getAvailableTooltips() {
const tooltipsPath = path.join(process.cwd(), TOOLTIPS_FILE);

if (!fs.existsSync(tooltipsPath)) {
console.error(`Error: Tooltips file not found at ${tooltipsPath}`);
process.exit(1);
}

const content = fs.readFileSync(tooltipsPath, 'utf-8');
const exportRegex = /export\s+const\s+(\w+Tooltip)\s*=/g;
const tooltips = new Set();

let match;
while ((match = exportRegex.exec(content)) !== null) {
tooltips.add(match[1]);
}

return tooltips;
}

// Get all MDX files in the repository
function getMdxFiles() {
try {
// Use git to get tracked MDX files (respects .gitignore)
const output = execSync('git ls-files "*.mdx"', { encoding: 'utf-8' });
return output.trim().split('\n').filter(Boolean);
} catch {
// Fallback: find all MDX files manually
const files = [];
function walkDir(dir) {
const entries = fs.readdirSync(dir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {
walkDir(fullPath);
} else if (entry.isFile() && entry.name.endsWith('.mdx')) {
files.push(path.relative(process.cwd(), fullPath));
}
}
}
walkDir(process.cwd());
return files;
}
}

// Extract imported tooltips from a file
function getImportedTooltips(content) {
const imported = new Set();

// Match import statements from tooltips.jsx
// Handles: import { Tooltip1, Tooltip2 } from "/snippets/tooltips.jsx";
const importRegex = /import\s*\{([^}]+)\}\s*from\s*["']\/snippets\/tooltips\.jsx["']/g;

let match;
while ((match = importRegex.exec(content)) !== null) {
const imports = match[1].split(',').map(s => s.trim()).filter(Boolean);
imports.forEach(name => imported.add(name));
}

return imported;
}

// Extract used tooltips from a file
function getUsedTooltips(content, availableTooltips) {
const used = new Set();

// Match JSX component usage: <TooltipName /> or <TooltipName>...</TooltipName>
// Only match known tooltip names to avoid false positives
for (const tooltip of availableTooltips) {
// Self-closing: <TooltipName />
const selfClosingRegex = new RegExp(`<${tooltip}\\s*/>`, 'g');
// Opening tag: <TooltipName> or <TooltipName ...>
const openingRegex = new RegExp(`<${tooltip}[\\s>]`, 'g');

if (selfClosingRegex.test(content) || openingRegex.test(content)) {
used.add(tooltip);
}
}

return used;
}

// Main validation function
function validateTooltips() {
const availableTooltips = getAvailableTooltips();
const mdxFiles = getMdxFiles();

console.log(`Found ${availableTooltips.size} tooltip definitions in ${TOOLTIPS_FILE}`);
console.log(`Scanning ${mdxFiles.length} MDX files...\n`);

const errors = [];
const warnings = [];
let filesWithTooltips = 0;

for (const file of mdxFiles) {
const filePath = path.join(process.cwd(), file);
const content = fs.readFileSync(filePath, 'utf-8');

const imported = getImportedTooltips(content);
const used = getUsedTooltips(content, availableTooltips);

if (used.size === 0 && imported.size === 0) {
continue;
}

filesWithTooltips++;

// Check for used but not imported tooltips
for (const tooltip of used) {
if (!imported.has(tooltip)) {
errors.push({
file,
tooltip,
type: 'missing-import',
message: `Tooltip "${tooltip}" is used but not imported`
});
}
}

// Check for imported but not used tooltips (warning only)
for (const tooltip of imported) {
if (!used.has(tooltip)) {
warnings.push({
file,
tooltip,
type: 'unused-import',
message: `Tooltip "${tooltip}" is imported but not used`
});
}
}

// Check for imports of non-existent tooltips
for (const tooltip of imported) {
if (!availableTooltips.has(tooltip)) {
errors.push({
file,
tooltip,
type: 'invalid-import',
message: `Tooltip "${tooltip}" does not exist in ${TOOLTIPS_FILE}`
});
}
}
}

// Print results
console.log(`Files using tooltips: ${filesWithTooltips}\n`);

if (warnings.length > 0) {
console.log('⚠️ Warnings (unused imports):');
for (const warning of warnings) {
console.log(` ${warning.file}: ${warning.message}`);
}
console.log('');
}

if (errors.length > 0) {
console.log('❌ Errors:');
for (const error of errors) {
console.log(` ${error.file}: ${error.message}`);
}
console.log(`\n${errors.length} error(s) found.`);
console.log('\nTo fix missing imports, add the tooltip to the import statement:');
console.log(' import { ExistingTooltip, MissingTooltip } from "/snippets/tooltips.jsx";');
process.exit(1);
}

console.log('✅ All tooltips are properly imported!');
process.exit(0);
}

// Run validation
validateTooltips();
2 changes: 1 addition & 1 deletion serverless/endpoints/job-states.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "Job states and metrics"
description: "Monitor your endpoints effectively by understanding job states and key metrics."
---

import { JobTooltip, RequestsTooltip, WorkerTooltip } from "/snippets/tooltips.jsx";
import { RequestsTooltip } from "/snippets/tooltips.jsx";

Understanding job states and metrics is essential for effectively managing your Serverless endpoints. This documentation covers the different states your jobs can be in and the key metrics available to monitor endpoint performance and health.

Expand Down
1 change: 0 additions & 1 deletion serverless/endpoints/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ sidebarTitle: "Overview"
description: "Deploy and manage Serverless endpoints using the Runpod console or REST API."
---

import { QueueBasedEndpointsTooltip, LoadBalancingEndpointsTooltip, ServerlessEnvironmentVariablesTooltip } from "/snippets/tooltips.jsx";

Endpoints are the foundation of Runpod Serverless, serving as the gateway for deploying and managing your [Serverless workers](/serverless/workers/overview). They provide a consistent API interface that allows your applications to interact with powerful compute resources on demand.

Expand Down
4 changes: 2 additions & 2 deletions serverless/endpoints/send-requests.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ sidebarTitle: "Send API requests"
description: "Submit and manage jobs for your queue-based endpoints by sending HTTP requests."
---

import { JobTooltip, JobsTooltip, RequestsTooltip, WorkersTooltip, HandlerFunctionTooltip, QueueBasedEndpointsTooltip, LoadBalancingEndpointTooltip } from "/snippets/tooltips.jsx";
import { QueueBasedEndpointsTooltip, LoadBalancingEndpointTooltip } from "/snippets/tooltips.jsx";

After creating a [Severless endpoint](/serverless/endpoints/overview), you can start sending it HTTP requests (using `cURL` or the Runpod SDK) to submit jobs and retrieve results:

Expand Down Expand Up @@ -1208,4 +1208,4 @@ Here are some common issues and suggested solutions:
| Rate limiting | Too many requests in short time | Implement backoff strategy, batch requests when possible |
| Missing results | Results expired | Retrieve results within expiration window (30 min for async, 1 min for sync) |

Implementing proper [error handling](/serverless/endpoints/error-handling) and retry logic will make your integrations more robust and reliable.
Implementing proper [error handling](/serverless/development/error-handling) and retry logic will make your integrations more robust and reliable.
Loading