Skip to content

feat(examples): add mixed marketplace skills example#2299

Closed
neubig wants to merge 3 commits intomainfrom
feat/mixed-marketplace-skills-example
Closed

feat(examples): add mixed marketplace skills example#2299
neubig wants to merge 3 commits intomainfrom
feat/mixed-marketplace-skills-example

Conversation

@neubig
Copy link
Contributor

@neubig neubig commented Mar 4, 2026

Summary

Add an example demonstrating how to create a plugin that combines local and remote skills, showing how teams can maintain their own custom skills while also leveraging the public OpenHands skills repository.

Related PRs

Changes

New Example: 43_mixed_marketplace_skills/

This example includes:

  • .plugin/marketplace.json - Plugin marketplace definition that includes:

    • Local skills from skills/ directory
    • References to remote skills from OpenHands/extensions
  • skills/greeting-helper/SKILL.md - A local skill following the AgentSkills standard

  • main.py - Main script demonstrating:

    • Loading local skills with load_skills_from_dir()
    • Loading remote skills with load_public_skills()
    • Combining skills with precedence handling
    • Using combined skills with an agent
  • README.md - Documentation explaining the pattern

Plugin Structure

43_mixed_marketplace_skills/
├── .plugin/
│   └── marketplace.json     # Plugin marketplace definition
├── skills/
│   └── greeting-helper/
│       └── SKILL.md         # Local skill content
├── main.py                  # Example code
└── README.md                # Documentation

Use Case

This pattern is useful for:

  • Teams maintaining their own custom skills
  • Projects that need to combine public skills with internal workflows
  • Creating curated skill sets for specific use cases

Example Output (Dry Run)

================================================================================
Part 1: Loading Local Skills from Plugin
================================================================================

Loaded local skills:
  - greeting-helper: A local skill that helps generate creative greetings...
    Triggers: ['greeting', 'hello', 'salutation']

================================================================================
Part 2: Loading Remote Skills from OpenHands/extensions
================================================================================

Loaded 34 public skills from OpenHands/extensions:
  - init, onboarding-agent, skill-creator, discord, bitbucket...

================================================================================
Part 3: Combining Local and Remote Skills
================================================================================

Total combined skills: 35
  - Local skills: 1
  - Public skills: 34

Testing

# Dry run (no LLM required)
python examples/01_standalone_sdk/43_mixed_marketplace_skills/main.py --dry-run

# Full run with LLM
export LLM_API_KEY=your-key
python examples/01_standalone_sdk/43_mixed_marketplace_skills/main.py

Note on CI

The check-examples CI check will fail until the docs PR is merged. This is expected behavior.

Add example demonstrating how to combine local and remote skills
from different sources:
- Local skills from a project directory (greeting-helper)
- Remote skills from OpenHands/extensions repository

The example includes:
- marketplace.json defining local skills with remote dependencies
- A local SKILL.md following the AgentSkills standard
- Main script showing skill loading, merging, and agent usage
- README documentation

Co-authored-by: openhands <openhands@all-hands.dev>
@github-actions
Copy link
Contributor

github-actions bot commented Mar 4, 2026

API breakage checks (Griffe)

Result: Failed

Log excerpt (first 1000 characters)

============================================================
Checking openhands-sdk (openhands.sdk)
============================================================
Comparing openhands-sdk 1.11.5 against 1.11.4
::notice title=openhands-sdk API::Ignoring Field metadata-only change (non-breaking): load_public_skills
::notice title=openhands-sdk API::Ignoring Field metadata-only change (non-breaking): temperature
::warning file=openhands-sdk/openhands/sdk/llm/llm.py,line=196,title=LLM.top_p::Attribute value was changed: `Field(default=1.0, ge=0, le=1)` -> `Field(default=None, ge=0, le=1, description='Nucleus sampling parameter. Defaults to None (uses provider default). Set to a value between 0 and 1 to control diversity of outputs.')`
::error title=SemVer::Breaking changes detected (1); require at least minor version bump from 1.11.x, but new is 1.11.5

============================================================
Checking openhands-workspace (openhands.workspace)
============================

Action log

@github-actions
Copy link
Contributor

github-actions bot commented Mar 4, 2026

Agent server REST API breakage checks (OpenAPI)

Result: Passed

Action log

- Remove unnecessary f-string prefix (ruff)
- Use getattr for trigger attributes to satisfy pyright type checking

Co-authored-by: openhands <openhands@all-hands.dev>
Follow the standard plugin structure where skills are in a skills/
directory within the plugin root.

Co-authored-by: openhands <openhands@all-hands.dev>
@neubig neubig requested a review from enyst March 5, 2026 14:02
Copy link
Contributor Author

neubig commented Mar 5, 2026

Closing to create a new PR with cleaner implementation that focuses on marketplace schema changes and skill installation.

@neubig neubig closed this Mar 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants