@octavus/docs 2.15.0 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/content/01-getting-started/02-quickstart.md +1 -0
- package/content/02-server-sdk/01-overview.md +26 -0
- package/content/02-server-sdk/02-sessions.md +11 -0
- package/content/02-server-sdk/03-tools.md +4 -1
- package/content/02-server-sdk/04-streaming.md +9 -0
- package/content/02-server-sdk/08-computer.md +400 -0
- package/content/03-client-sdk/06-http-transport.md +2 -0
- package/content/04-protocol/01-overview.md +9 -0
- package/content/04-protocol/04-tools.md +5 -4
- package/content/04-protocol/05-skills.md +88 -8
- package/content/04-protocol/06-handlers.md +3 -1
- package/content/04-protocol/07-agent-config.md +65 -17
- package/content/04-protocol/09-skills-advanced.md +89 -8
- package/content/04-protocol/13-mcp-servers.md +289 -0
- package/content/06-examples/02-nextjs-chat.md +1 -0
- package/dist/chunk-4PNP4HF5.js +1549 -0
- package/dist/chunk-4PNP4HF5.js.map +1 -0
- package/dist/{chunk-2UFDUNPK.js → chunk-54ND2CTI.js} +25 -21
- package/dist/chunk-54ND2CTI.js.map +1 -0
- package/dist/chunk-B4A36GEV.js +1549 -0
- package/dist/chunk-B4A36GEV.js.map +1 -0
- package/dist/chunk-CFDET7QG.js +1549 -0
- package/dist/chunk-CFDET7QG.js.map +1 -0
- package/dist/chunk-DKVYIFV7.js +1549 -0
- package/dist/chunk-DKVYIFV7.js.map +1 -0
- package/dist/{chunk-JEOGYIRI.js → chunk-UZWGRPRR.js} +61 -21
- package/dist/chunk-UZWGRPRR.js.map +1 -0
- package/dist/content.js +1 -1
- package/dist/docs.json +34 -16
- package/dist/index.js +1 -1
- package/dist/search-index.json +1 -1
- package/dist/search.js +1 -1
- package/dist/search.js.map +1 -1
- package/dist/sections.json +34 -16
- package/package.json +1 -1
- package/dist/chunk-2UFDUNPK.js.map +0 -1
- package/dist/chunk-JEOGYIRI.js.map +0 -1
|
@@ -107,17 +107,19 @@ This also works for named threads in interactive agents, allowing different thre
|
|
|
107
107
|
|
|
108
108
|
When skills are enabled, the LLM has access to these tools:
|
|
109
109
|
|
|
110
|
-
| Tool | Purpose |
|
|
111
|
-
| -------------------- | --------------------------------------- |
|
|
112
|
-
| `octavus_skill_read` | Read skill documentation (SKILL.md) |
|
|
113
|
-
| `octavus_skill_list` | List available scripts in a skill |
|
|
114
|
-
| `octavus_skill_run` | Execute a pre-built script from a skill |
|
|
115
|
-
| `octavus_code_run` | Execute arbitrary Python/Bash code |
|
|
116
|
-
| `octavus_file_write` | Create files in the sandbox |
|
|
117
|
-
| `octavus_file_read` | Read files from the sandbox |
|
|
110
|
+
| Tool | Purpose | Availability |
|
|
111
|
+
| -------------------- | --------------------------------------- | -------------------- |
|
|
112
|
+
| `octavus_skill_read` | Read skill documentation (SKILL.md) | All skills |
|
|
113
|
+
| `octavus_skill_list` | List available scripts in a skill | All skills |
|
|
114
|
+
| `octavus_skill_run` | Execute a pre-built script from a skill | All skills |
|
|
115
|
+
| `octavus_code_run` | Execute arbitrary Python/Bash code | Standard skills only |
|
|
116
|
+
| `octavus_file_write` | Create files in the sandbox | Standard skills only |
|
|
117
|
+
| `octavus_file_read` | Read files from the sandbox | Standard skills only |
|
|
118
118
|
|
|
119
119
|
The LLM learns about available skills through system prompt injection and can use these tools to interact with skills.
|
|
120
120
|
|
|
121
|
+
Skills that have [secrets](#skill-secrets) configured run in **secure mode**, where only `octavus_skill_read`, `octavus_skill_list`, and `octavus_skill_run` are available. See [Skill Secrets](#skill-secrets) below.
|
|
122
|
+
|
|
121
123
|
## Example: QR Code Generation
|
|
122
124
|
|
|
123
125
|
```yaml
|
|
@@ -212,6 +214,17 @@ Main script for generating QR codes...
|
|
|
212
214
|
|
|
213
215
|
````
|
|
214
216
|
|
|
217
|
+
### Frontmatter Fields
|
|
218
|
+
|
|
219
|
+
| Field | Required | Description |
|
|
220
|
+
| ------------- | -------- | ------------------------------------------------------ |
|
|
221
|
+
| `name` | Yes | Skill slug (lowercase, hyphens) |
|
|
222
|
+
| `description` | Yes | What the skill does (shown to the LLM) |
|
|
223
|
+
| `version` | No | Semantic version string |
|
|
224
|
+
| `license` | No | License identifier |
|
|
225
|
+
| `author` | No | Skill author |
|
|
226
|
+
| `secrets` | No | Array of secret declarations (enables secure mode) |
|
|
227
|
+
|
|
215
228
|
## Best Practices
|
|
216
229
|
|
|
217
230
|
### 1. Clear Descriptions
|
|
@@ -337,6 +350,72 @@ steps:
|
|
|
337
350
|
|
|
338
351
|
Thread-level `sandboxTimeout` takes priority over agent-level. Maximum: 1 hour (3,600,000 ms).
|
|
339
352
|
|
|
353
|
+
## Skill Secrets
|
|
354
|
+
|
|
355
|
+
Skills can declare secrets they need to function. When an organization configures those secrets, the skill runs in **secure mode** with additional isolation.
|
|
356
|
+
|
|
357
|
+
### Declaring Secrets
|
|
358
|
+
|
|
359
|
+
Add a `secrets` array to your SKILL.md frontmatter:
|
|
360
|
+
|
|
361
|
+
```yaml
|
|
362
|
+
---
|
|
363
|
+
name: github
|
|
364
|
+
description: >
|
|
365
|
+
Run GitHub CLI (gh) commands to manage repos, issues, PRs, and more.
|
|
366
|
+
secrets:
|
|
367
|
+
- name: GITHUB_TOKEN
|
|
368
|
+
description: GitHub personal access token with repo access
|
|
369
|
+
required: true
|
|
370
|
+
- name: GITHUB_ORG
|
|
371
|
+
description: Default GitHub organization
|
|
372
|
+
required: false
|
|
373
|
+
---
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
Each secret declaration has:
|
|
377
|
+
|
|
378
|
+
| Field | Required | Description |
|
|
379
|
+
| ------------- | -------- | ----------------------------------------------------------- |
|
|
380
|
+
| `name` | Yes | Environment variable name (uppercase, e.g., `GITHUB_TOKEN`) |
|
|
381
|
+
| `description` | No | Explains what this secret is for (shown in the UI) |
|
|
382
|
+
| `required` | No | Whether the secret is required (defaults to `true`) |
|
|
383
|
+
|
|
384
|
+
Secret names must match the pattern `^[A-Z_][A-Z0-9_]*$` (uppercase letters, digits, and underscores).
|
|
385
|
+
|
|
386
|
+
### Configuring Secrets
|
|
387
|
+
|
|
388
|
+
Organization admins configure secret values through the skill editor in the platform UI. Each organization maintains its own independent set of secrets for each skill.
|
|
389
|
+
|
|
390
|
+
Secrets are encrypted at rest and only decrypted at execution time.
|
|
391
|
+
|
|
392
|
+
### Secure Mode
|
|
393
|
+
|
|
394
|
+
When a skill has secrets configured for the organization, it automatically runs in **secure mode**:
|
|
395
|
+
|
|
396
|
+
- The skill gets its own **isolated sandbox** (separate from other skills)
|
|
397
|
+
- Secrets are injected as **environment variables** available to all scripts
|
|
398
|
+
- Only `octavus_skill_read`, `octavus_skill_list`, and `octavus_skill_run` are available — `octavus_code_run`, `octavus_file_write`, and `octavus_file_read` are blocked
|
|
399
|
+
- Scripts receive input as **JSON via stdin** (using the `input` parameter on `octavus_skill_run`) instead of CLI args
|
|
400
|
+
- All output (stdout/stderr) is **automatically redacted** for secret values before being returned to the LLM
|
|
401
|
+
|
|
402
|
+
### Writing Scripts for Secure Skills
|
|
403
|
+
|
|
404
|
+
Scripts in secure skills read input from stdin as JSON and access secrets from environment variables:
|
|
405
|
+
|
|
406
|
+
```python
|
|
407
|
+
import json
|
|
408
|
+
import os
|
|
409
|
+
import sys
|
|
410
|
+
|
|
411
|
+
input_data = json.load(sys.stdin)
|
|
412
|
+
token = os.environ.get('GITHUB_TOKEN')
|
|
413
|
+
|
|
414
|
+
# Use the token and input_data to perform the task
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
For standard skills (without secrets), scripts receive input as CLI arguments. For secure skills, always use stdin JSON.
|
|
418
|
+
|
|
340
419
|
## Security
|
|
341
420
|
|
|
342
421
|
Skills run in isolated sandbox environments:
|
|
@@ -345,6 +424,7 @@ Skills run in isolated sandbox environments:
|
|
|
345
424
|
- **No persistent storage** (sandbox destroyed after each `next-message` execution)
|
|
346
425
|
- **File output only** via `/output/` directory
|
|
347
426
|
- **Time limits** enforced (5-minute default, configurable via `sandboxTimeout`)
|
|
427
|
+
- **Secret redaction** — output from secure skills is automatically scanned for secret values
|
|
348
428
|
|
|
349
429
|
## Next Steps
|
|
350
430
|
|
|
@@ -144,16 +144,18 @@ Start summary thread:
|
|
|
144
144
|
block: start-thread
|
|
145
145
|
thread: summary # Thread name
|
|
146
146
|
model: anthropic/claude-sonnet-4-5 # Optional: different model
|
|
147
|
+
backupModel: openai/gpt-4o # Failover on provider errors
|
|
147
148
|
thinking: low # Extended reasoning level
|
|
148
149
|
maxSteps: 1 # Tool call limit
|
|
149
150
|
system: escalation-summary # System prompt
|
|
150
151
|
input: [COMPANY_NAME] # Variables for prompt
|
|
152
|
+
mcpServers: [figma, browser] # MCP servers for this thread
|
|
151
153
|
skills: [qr-code] # Octavus skills for this thread
|
|
152
154
|
sandboxTimeout: 600000 # Skill sandbox timeout (default: 5 min, max: 1 hour)
|
|
153
155
|
imageModel: google/gemini-2.5-flash-image # Image generation model
|
|
154
156
|
```
|
|
155
157
|
|
|
156
|
-
The `model` field can also reference a variable for dynamic model selection
|
|
158
|
+
The `model` field can also reference a variable for dynamic model selection. The `backupModel` field follows the same format and supports variable references.
|
|
157
159
|
|
|
158
160
|
```yaml
|
|
159
161
|
Start summary thread:
|
|
@@ -14,28 +14,31 @@ agent:
|
|
|
14
14
|
model: anthropic/claude-sonnet-4-5
|
|
15
15
|
system: system # References prompts/system.md
|
|
16
16
|
tools: [get-user-account] # Available tools
|
|
17
|
+
mcpServers: [figma, browser] # MCP server connections
|
|
17
18
|
skills: [qr-code] # Available skills
|
|
18
19
|
references: [api-guidelines] # On-demand context documents
|
|
19
20
|
```
|
|
20
21
|
|
|
21
22
|
## Configuration Options
|
|
22
23
|
|
|
23
|
-
| Field | Required | Description
|
|
24
|
-
| ---------------- | -------- |
|
|
25
|
-
| `model` | Yes | Model identifier or variable reference
|
|
26
|
-
| `
|
|
27
|
-
| `
|
|
28
|
-
| `
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
31
|
-
| `
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
| `
|
|
24
|
+
| Field | Required | Description |
|
|
25
|
+
| ---------------- | -------- | ------------------------------------------------------------------------------ |
|
|
26
|
+
| `model` | Yes | Model identifier or variable reference |
|
|
27
|
+
| `backupModel` | No | Backup model for automatic failover on provider errors |
|
|
28
|
+
| `system` | Yes | System prompt filename (without .md) |
|
|
29
|
+
| `input` | No | Variables to pass to the system prompt |
|
|
30
|
+
| `tools` | No | List of tools the LLM can call |
|
|
31
|
+
| `mcpServers` | No | List of MCP servers to connect (see [MCP Servers](/docs/protocol/mcp-servers)) |
|
|
32
|
+
| `skills` | No | List of Octavus skills the LLM can use |
|
|
33
|
+
| `references` | No | List of references the LLM can fetch on demand |
|
|
34
|
+
| `sandboxTimeout` | No | Skill sandbox timeout in ms (default: 5 min, max: 1 hour) |
|
|
35
|
+
| `imageModel` | No | Image generation model (enables agentic image generation) |
|
|
36
|
+
| `webSearch` | No | Enable built-in web search tool (provider-agnostic) |
|
|
37
|
+
| `agentic` | No | Allow multiple tool call cycles |
|
|
38
|
+
| `maxSteps` | No | Maximum agentic steps (default: 10) |
|
|
39
|
+
| `temperature` | No | Model temperature (0-2) |
|
|
40
|
+
| `thinking` | No | Extended reasoning level |
|
|
41
|
+
| `anthropic` | No | Anthropic-specific options (tools, skills) |
|
|
39
42
|
|
|
40
43
|
## Models
|
|
41
44
|
|
|
@@ -104,6 +107,41 @@ The model value is validated at runtime to ensure it's in the correct `provider/
|
|
|
104
107
|
|
|
105
108
|
> **Note**: When using dynamic models, provider-specific options (like `anthropic:`) may not apply if the model resolves to a different provider.
|
|
106
109
|
|
|
110
|
+
## Backup Model
|
|
111
|
+
|
|
112
|
+
Configure a fallback model that activates automatically when the primary model encounters a transient provider error (rate limits, outages, timeouts):
|
|
113
|
+
|
|
114
|
+
```yaml
|
|
115
|
+
agent:
|
|
116
|
+
model: anthropic/claude-sonnet-4-5
|
|
117
|
+
backupModel: openai/gpt-4o
|
|
118
|
+
system: system
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
When a provider error occurs, the system retries once with the backup model. If the backup also fails, the original error is returned.
|
|
122
|
+
|
|
123
|
+
**Key behaviors:**
|
|
124
|
+
|
|
125
|
+
- Only transient provider errors trigger fallback — authentication and validation errors are not retried
|
|
126
|
+
- Provider-specific options (like `anthropic:`) are only forwarded to the backup model if it uses the same provider
|
|
127
|
+
- For streaming responses, fallback only occurs if no content has been sent to the client yet
|
|
128
|
+
|
|
129
|
+
Like `model`, `backupModel` supports variable references:
|
|
130
|
+
|
|
131
|
+
```yaml
|
|
132
|
+
input:
|
|
133
|
+
BACKUP_MODEL:
|
|
134
|
+
type: string
|
|
135
|
+
description: Fallback model for provider errors
|
|
136
|
+
|
|
137
|
+
agent:
|
|
138
|
+
model: anthropic/claude-sonnet-4-5
|
|
139
|
+
backupModel: BACKUP_MODEL
|
|
140
|
+
system: system
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
> **Tip**: Use a different provider for your backup model (e.g., primary on Anthropic, backup on OpenAI) to maximize resilience against single-provider outages.
|
|
144
|
+
|
|
107
145
|
## System Prompt
|
|
108
146
|
|
|
109
147
|
The system prompt sets the agent's persona and instructions. The `input` field controls which variables are available to the prompt — only variables listed in `input` are interpolated.
|
|
@@ -358,16 +396,18 @@ handlers:
|
|
|
358
396
|
block: start-thread
|
|
359
397
|
thread: summary
|
|
360
398
|
model: anthropic/claude-sonnet-4-5 # Different model
|
|
399
|
+
backupModel: openai/gpt-4o # Failover model
|
|
361
400
|
thinking: low # Different thinking
|
|
362
401
|
maxSteps: 1 # Limit tool calls
|
|
363
402
|
system: escalation-summary # Different prompt
|
|
403
|
+
mcpServers: [figma, browser] # Thread-specific MCP servers
|
|
364
404
|
skills: [data-analysis] # Thread-specific skills
|
|
365
405
|
references: [escalation-policy] # Thread-specific references
|
|
366
406
|
imageModel: google/gemini-2.5-flash-image # Thread-specific image model
|
|
367
407
|
webSearch: true # Thread-specific web search
|
|
368
408
|
```
|
|
369
409
|
|
|
370
|
-
Each thread can have its own skills, references, image model, and web search setting. Skills must be defined in the protocol's `skills:` section. References must exist in the agent's `references/` directory. Workers use this same pattern since they don't have a global `agent:` section.
|
|
410
|
+
Each thread can have its own model, backup model, MCP servers, skills, references, image model, and web search setting. Skills must be defined in the protocol's `skills:` section. References must exist in the agent's `references/` directory. Workers use this same pattern since they don't have a global `agent:` section.
|
|
371
411
|
|
|
372
412
|
## Full Example
|
|
373
413
|
|
|
@@ -399,6 +439,12 @@ tools:
|
|
|
399
439
|
summary: { type: string }
|
|
400
440
|
priority: { type: string } # low, medium, high
|
|
401
441
|
|
|
442
|
+
mcpServers:
|
|
443
|
+
figma:
|
|
444
|
+
description: Figma design tool integration
|
|
445
|
+
source: remote
|
|
446
|
+
display: description
|
|
447
|
+
|
|
402
448
|
skills:
|
|
403
449
|
qr-code:
|
|
404
450
|
display: description
|
|
@@ -406,6 +452,7 @@ skills:
|
|
|
406
452
|
|
|
407
453
|
agent:
|
|
408
454
|
model: anthropic/claude-sonnet-4-5
|
|
455
|
+
backupModel: openai/gpt-4o
|
|
409
456
|
system: system
|
|
410
457
|
input:
|
|
411
458
|
- COMPANY_NAME
|
|
@@ -414,6 +461,7 @@ agent:
|
|
|
414
461
|
- get-user-account
|
|
415
462
|
- search-docs
|
|
416
463
|
- create-support-ticket
|
|
464
|
+
mcpServers: [figma] # MCP server connections
|
|
417
465
|
skills: [qr-code] # Octavus skills
|
|
418
466
|
references: [support-policies] # On-demand context
|
|
419
467
|
webSearch: true # Built-in web search
|
|
@@ -307,6 +307,76 @@ Pattern:
|
|
|
307
307
|
2. LLM uses skill to analyze/process the data
|
|
308
308
|
3. Generate outputs (files, reports)
|
|
309
309
|
|
|
310
|
+
## Secure Skills
|
|
311
|
+
|
|
312
|
+
When a skill declares secrets and an organization configures them, the skill runs in secure mode with its own isolated sandbox.
|
|
313
|
+
|
|
314
|
+
### Standard vs Secure Skills
|
|
315
|
+
|
|
316
|
+
| Aspect | Standard Skills | Secure Skills |
|
|
317
|
+
| ------------------- | --------------------------------- | --------------------------------------------------- |
|
|
318
|
+
| **Sandbox** | Shared with other standard skills | Isolated (one per skill) |
|
|
319
|
+
| **Available tools** | All 6 skill tools | `skill_read`, `skill_list`, `skill_run` only |
|
|
320
|
+
| **Script input** | CLI arguments via `args` | JSON via stdin (use `input` parameter) |
|
|
321
|
+
| **Environment** | No secrets | Secrets as env vars |
|
|
322
|
+
| **Output** | Raw stdout/stderr | Redacted (secret values replaced with `[REDACTED]`) |
|
|
323
|
+
|
|
324
|
+
### Writing Scripts for Secure Skills
|
|
325
|
+
|
|
326
|
+
Secure skill scripts receive structured input via stdin (JSON) and access secrets from environment variables:
|
|
327
|
+
|
|
328
|
+
```python
|
|
329
|
+
#!/usr/bin/env python3
|
|
330
|
+
import json
|
|
331
|
+
import os
|
|
332
|
+
import sys
|
|
333
|
+
import subprocess
|
|
334
|
+
|
|
335
|
+
input_data = json.load(sys.stdin)
|
|
336
|
+
token = os.environ["GITHUB_TOKEN"]
|
|
337
|
+
|
|
338
|
+
repo = input_data.get("repo", "")
|
|
339
|
+
result = subprocess.run(
|
|
340
|
+
["gh", "repo", "view", repo, "--json", "name,description"],
|
|
341
|
+
capture_output=True, text=True,
|
|
342
|
+
env={**os.environ, "GH_TOKEN": token}
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
print(result.stdout)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
Key patterns:
|
|
349
|
+
|
|
350
|
+
- **Read stdin**: `json.load(sys.stdin)` to get the `input` object from the `octavus_skill_run` call
|
|
351
|
+
- **Access secrets**: `os.environ["SECRET_NAME"]` — secrets are injected as env vars
|
|
352
|
+
- **Print output**: Write results to stdout — the LLM sees the (redacted) stdout
|
|
353
|
+
- **Error handling**: Write errors to stderr and exit with non-zero code
|
|
354
|
+
|
|
355
|
+
### Declaring Secrets in SKILL.md
|
|
356
|
+
|
|
357
|
+
```yaml
|
|
358
|
+
---
|
|
359
|
+
name: github
|
|
360
|
+
description: >
|
|
361
|
+
Run GitHub CLI (gh) commands to manage repos, issues, PRs, and more.
|
|
362
|
+
secrets:
|
|
363
|
+
- name: GITHUB_TOKEN
|
|
364
|
+
description: GitHub personal access token with repo access
|
|
365
|
+
required: true
|
|
366
|
+
- name: GITHUB_ORG
|
|
367
|
+
description: Default GitHub organization
|
|
368
|
+
required: false
|
|
369
|
+
---
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Testing Secure Skills Locally
|
|
373
|
+
|
|
374
|
+
You can test scripts locally by piping JSON to stdin:
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
echo '{"repo": "octavus-ai/agent-sdk"}' | GITHUB_TOKEN=ghp_xxx python scripts/list-issues.py
|
|
378
|
+
```
|
|
379
|
+
|
|
310
380
|
## Skill Development Tips
|
|
311
381
|
|
|
312
382
|
### Writing SKILL.md
|
|
@@ -373,6 +443,15 @@ The LLM sees these errors and can retry or explain to users.
|
|
|
373
443
|
- **File output only** via `/output/` directory
|
|
374
444
|
- **Time limits** enforced (5-minute default, configurable via `sandboxTimeout`)
|
|
375
445
|
|
|
446
|
+
### Secret Protection
|
|
447
|
+
|
|
448
|
+
For skills with configured secrets:
|
|
449
|
+
|
|
450
|
+
- **Isolated sandbox** — each secure skill gets its own sandbox, preventing cross-skill secret leakage
|
|
451
|
+
- **No arbitrary code** — `octavus_code_run`, `octavus_file_write`, and `octavus_file_read` are blocked for secure skills, so only pre-built scripts can execute
|
|
452
|
+
- **Output redaction** — all stdout and stderr are scanned for secret values before being returned to the LLM
|
|
453
|
+
- **Encrypted at rest** — secrets are encrypted using AES-256-GCM and only decrypted at execution time
|
|
454
|
+
|
|
376
455
|
### Input Validation
|
|
377
456
|
|
|
378
457
|
Skills should validate inputs:
|
|
@@ -455,14 +534,16 @@ Check execution logs in the platform debug view:
|
|
|
455
534
|
|
|
456
535
|
## Best Practices Summary
|
|
457
536
|
|
|
458
|
-
1. **Enable only needed skills**
|
|
459
|
-
2. **Choose appropriate display modes**
|
|
460
|
-
3. **Write clear skill descriptions**
|
|
461
|
-
4. **Handle errors gracefully**
|
|
462
|
-
5. **Test skills locally**
|
|
463
|
-
6. **Monitor execution**
|
|
464
|
-
7. **Combine with tools**
|
|
465
|
-
8. **Consider performance**
|
|
537
|
+
1. **Enable only needed skills** — Don't overwhelm the LLM
|
|
538
|
+
2. **Choose appropriate display modes** — Match user experience needs
|
|
539
|
+
3. **Write clear skill descriptions** — Help LLM understand when to use
|
|
540
|
+
4. **Handle errors gracefully** — Provide helpful error messages
|
|
541
|
+
5. **Test skills locally** — Verify before uploading
|
|
542
|
+
6. **Monitor execution** — Check logs for issues
|
|
543
|
+
7. **Combine with tools** — Use tools for data, skills for processing
|
|
544
|
+
8. **Consider performance** — Be aware of timeouts and limits
|
|
545
|
+
9. **Use secrets for credentials** — Declare secrets in frontmatter instead of hardcoding tokens
|
|
546
|
+
10. **Design scripts for stdin input** — Secure skills receive JSON via stdin, so plan for both input methods if the skill might be used in either mode
|
|
466
547
|
|
|
467
548
|
## Next Steps
|
|
468
549
|
|