OPAL Agent & Skill Assembler
Dual-purpose skill for working with OPAL (OpenLink AI Layer) agents, skills, and function tools. Assemble new agent/skill configurations or exercise existing ones against any OPAL endpoint.
What OPAL Provides
OPAL exposes /chat/api on any OPAL-enabled Virtuoso instance. An Agent orchestrates one or more Skills; a Skill bundles one or more Tools (functions). See references/opal-service-surface.md for the full API surface.
Elicitation Flow
1. OPAL Endpoint
Present these options and ask the user to choose or enter a custom host:
| Shortcut | Host |
|---|---|
| URIBurner | linkeddata.uriburner.com |
| Demo | demo.openlinksw.com |
| NetID QA | netid-qa.openlinksw.com |
| ODS-QA | ods-qa.openlinksw.com |
| Custom | (enter any hostname) |
All endpoints are constructed as https://{host}/chat/api, https://{host}/listAgents, etc.
2. Authentication
Ask the user to choose:
- OAuth 2.1: Run Authorization Code flow (see
preferences.ttlhowto for OAuth flow). Use dynamic client registration athttps://{host}/OAuth2/register, capture code onlocalhost:12345/callback, exchange for Bearer token. - API Key: Prompt user to paste their Bearer token directly.
3. Mode
Ask the user to choose:
| Mode | What it does |
|---|---|
| Assemble Agent | List Skills → select → generate AGENTS.md + JSON → upload to WebDAV |
| Assemble Skill | List Tools → select → generate SKILLS.md + JSON → upload to WebDAV |
| Exercise Agent | List Agents → select one → instantiate → send test prompt → report |
| Exercise Skill | List Skills → select one → instantiate → send test prompt → report |
4A. Assemble Mode Details
Agent Assembly:
GET https://{host}/listSkills— fetch available skills- Present skills as a multi-select list with their descriptions
- Ask for: agent ID, title, version, optional model key override
- Generate AGENTS.md using
prompts/agents-md-template.md - Generate companion
.jsonperreferences/opal-agent-skill-json-schema.md - Offer to upload both to
https://{host}/DAV/VAD/personal_assistant/json/{agent_id}.jsonand.../md/{agent_id}.md - Provide curl commands for the upload
Skill Assembly:
GET https://{host}/listFunctions— fetch available function tools- Present tools as a multi-select list with descriptions
- Ask for: skill ID, title, version
- Generate SKILLS.md using
prompts/skills-md-template.md - Generate companion
.json - Offer to upload to WebDAV
4B. Exercise Mode Details
Exercise Agent:
GET https://{host}/listAgents— fetch available agents- Present as single-select list
- Ask for optional model API key override and test prompt text (default: "Introduce yourself and your capabilities.")
- Instantiate:
POST https://{host}/chat/apiwith{"agent": "{selected_id}"}and the test message - Display the response
Exercise Skill:
GET https://{host}/listSkills— fetch available skills- Same flow as agent exercise but with
{"skills": ["{selected_id}"]}
OAuth Flow Reference
Per preferences.ttl howto (uriburner-oauth-authcode-flow.ttl):
# 1. Register client
curl -X POST https://{host}/OAuth2/register \
-H "Content-Type: application/json" \
-d '{"client_name":"OPAL Assembler","redirect_uris":["http://localhost:12345/callback"],"grant_types":["authorization_code"],"token_endpoint_auth_method":"none"}'
# 2. Authorize (open browser)
open "https://{host}/OAuth2/authorize?response_type=code&client_id={client_id}&redirect_uri=http://localhost:12345/callback&scope=openid"
# 3. Exchange code for token
curl -X POST https://{host}/OAuth2/token \
-d "grant_type=authorization_code&code={code}&redirect_uri=http://localhost:12345/callback&client_id={client_id}&client_secret={client_secret}"
WebDAV Upload
# Upload AGENTS.md / SKILLS.md
curl -X PUT https://{host}/DAV/VAD/personal_assistant/md/{id}.md \
-H "Authorization: Bearer {token}" \
-H "Content-Type: text/markdown" \
--data-binary @{local_file}
# Upload JSON companion
curl -X PUT https://{host}/DAV/VAD/personal_assistant/json/{id}.json \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
--data-binary @{local_file}
Verification
After assembly or exercise:
- Assemble: confirm both
.mdand.jsonexist at the WebDAV paths - Assemble:
GET https://{host}/listAgents(or/listSkills) should include the newly created agent/skill - Exercise: confirm the instantiated session returns a meaningful response
References
references/opal-service-surface.md— full OPAL API surfacereferences/opal-agent-skill-json-schema.md— JSON registration format- OPAL Playground:
https://linkeddata.uriburner.com/chat/api - OAuth howto:
preferences.ttl→howto/uriburner-oauth-authcode-flow.ttl
License
AGPL-3.0