Compare commits

..

1 Commits

Author SHA1 Message Date
Hermes Pipeline 8a052b328d Add Skill: unifai-workflow-execution
Extracted from: https://github.com/redhat-community-ai-tools/UnifAI.git
Score: 1.0
2026-08-05 15:45:08 +00:00
6 changed files with 116 additions and 144 deletions
+30 -45
View File
@@ -1,27 +1,26 @@
--- ---
name: research-pipeline name: research-pipeline
version: 1.0.0 version: 1.0.0
description: Fetch a Wikipedia page, summarise it using an AI agent, and write the description: Fetch a Wikipedia page, summarise its content using an AI agent, and
summary to a file. write the summary to a file.
inputs: inputs:
- URL of the Wikipedia page - URL of the Wikipedia page
steps: steps:
- 'Step 1: Import necessary modules from _bootstrap (NIM_MODEL, require_nim_api_key) - 'Step 1: Import necessary modules from `_bootstrap` and `blacknode`: Run `from _bootstrap
and blacknode' import NIM_MODEL, require_nim_api_key; import blacknode as bn`'
- 'Step 2: Require NVIDIA NIM API key using `require_nim_api_key()`' - 'Step 2: Require NVIDIA NIM API key: Call `require_nim_api_key()` to ensure the
- 'Step 3: Create a Graph instance `g`' API key is set.'
- 'Step 4: Add a Literal node for the URL of the Wikipedia page (`url`)' - 'Step 3: Create a graph instance: Initialize `g = bn.Graph()`.'
- 'Step 5: Add an HTTPGet node to fetch the content from the URL (`fetcher`) and connect - 'Step 4: Add nodes for URL, HTTPGet, summarisation, and file writing: `url = g.node(''Literal'',
it to the Literal node' value=''URL of the Wikipedia page''); fetcher = g.node(''HTTPGet''); summarise =
- 'Step 6: Add an LLMAgent node with system prompt ''You are a technical writer. Summarise g.node(''LLMAgent'', system=''You are a technical writer. Summarise the text in
the text in 3 bullet points.'' and model NIM_MODEL (`summarise`), connecting its 3 bullet points.'', model=NIM_MODEL); writer = g.node(''FileWrite'', path=''summary.txt'')`'
input to the output of `fetcher`' - 'Step 5: Connect nodes with edges: `url.out(''value'') >> fetcher.inp(''url'');
- 'Step 7: Add a FileWrite node to write the summary to a file named ''summary.txt'' fetcher.out(''text'') >> summarise.inp(''prompt''); summarise.out(''text'') >> writer.inp(''text'')`'
(`writer`), connecting its input to the output of `summarise`' - 'Step 6: Cook the graph to execute and get output: `result = g.cook(writer, ''path'');
- 'Step 8: Cook the graph starting from the writer node and print the path where the print(f''Summary written to: {result}'')`'
summary is written'
outputs: outputs:
- Path to the summary file - Path of the summary file
tags: [] tags: []
metadata: metadata:
source_repo: https://github.com/temiroff/Blacknode.git source_repo: https://github.com/temiroff/Blacknode.git
@@ -31,7 +30,7 @@ metadata:
# research-pipeline # research-pipeline
Fetch a Wikipedia page, summarise it using an AI agent, and write the summary to a file. Fetch a Wikipedia page, summarise its content using an AI agent, and write the summary to a file.
## Setup ## Setup
@@ -43,8 +42,8 @@ pip install anthropic>=0.25 docker>=7.1 openai>=1.0
**Setup steps:** **Setup steps:**
1. Ensure NVIDIA NIM API key is set in the environment or editor UI 1. Ensure NVIDIA NIM API key is set in the environment or editor
1. Install required dependencies using `pip install -r requirements.txt` 1. Install required dependencies: `pip install -r requirements.txt`
## Key Files ## Key Files
@@ -52,39 +51,25 @@ pip install anthropic>=0.25 docker>=7.1 openai>=1.0
## Steps ## Steps
1. Step 1: Import necessary modules from _bootstrap (NIM_MODEL, require_nim_api_key) and blacknode 1. Step 1: Import necessary modules from `_bootstrap` and `blacknode`: Run `from _bootstrap import NIM_MODEL, require_nim_api_key; import blacknode as bn`
2. Step 2: Require NVIDIA NIM API key using `require_nim_api_key()` 2. Step 2: Require NVIDIA NIM API key: Call `require_nim_api_key()` to ensure the API key is set.
3. Step 3: Create a Graph instance `g` 3. Step 3: Create a graph instance: Initialize `g = bn.Graph()`.
4. Step 4: Add a Literal node for the URL of the Wikipedia page (`url`) 4. Step 4: Add nodes for URL, HTTPGet, summarisation, and file writing: `url = g.node('Literal', value='URL of the Wikipedia page'); fetcher = g.node('HTTPGet'); summarise = g.node('LLMAgent', system='You are a technical writer. Summarise the text in 3 bullet points.', model=NIM_MODEL); writer = g.node('FileWrite', path='summary.txt')`
5. Step 5: Add an HTTPGet node to fetch the content from the URL (`fetcher`) and connect it to the Literal node 5. Step 5: Connect nodes with edges: `url.out('value') >> fetcher.inp('url'); fetcher.out('text') >> summarise.inp('prompt'); summarise.out('text') >> writer.inp('text')`
6. Step 6: Add an LLMAgent node with system prompt 'You are a technical writer. Summarise the text in 3 bullet points.' and model NIM_MODEL (`summarise`), connecting its input to the output of `fetcher` 6. Step 6: Cook the graph to execute and get output: `result = g.cook(writer, 'path'); print(f'Summary written to: {result}')`
7. Step 7: Add a FileWrite node to write the summary to a file named 'summary.txt' (`writer`), connecting its input to the output of `summarise`
8. Step 8: Cook the graph starting from the writer node and print the path where the summary is written
## Implementation Details ## Implementation Details
```python ```python
from _bootstrap import NIM_MODEL, require_nim_api_key from _bootstrap import NIM_MODEL, require_nim_api_key; import blacknode as bn
import blacknode as bn
``` ```
```python ```python
g = bn.Graph() url = g.node('Literal', value='https://en.wikipedia.org/w/api.php?action=query&prop=extracts&exintro=1&explaintext=1&titles=Houdini_(software)&format=json&formatversion=2&origin=*'); fetcher = g.node('HTTPGet'); summarise = g.node('LLMAgent', system='You are a technical writer. Summarise the text in 3 bullet points.', model=NIM_MODEL); writer = g.node('FileWrite', path='summary.txt')
url = g.node('Literal', value='https://en.wikipedia.org/w/api.php?action=query&prop=extracts&exintro=1&explaintext=1&titles=Houdini_(software)&format=json&formatversion=2&origin=*')
fetcher = g.node('HTTPGet')
summarise = g.node('LLMAgent', system='You are a technical writer. Summarise the text in 3 bullet points.', model=NIM_MODEL)
writer = g.node('FileWrite', path='summary.txt')
``` ```
```python ```python
url.out('value') >> fetcher.inp('url') url.out('value') >> fetcher.inp('url'); fetcher.out('text') >> summarise.inp('prompt'); summarise.out('text') >> writer.inp('text')
fetcher.out('text') >> summarise.inp('prompt')
summarise.out('text') >> writer.inp('text')
```
```python
result = g.cook(writer, 'path')
print(f'Summary written to: {result}')
``` ```
## Inputs ## Inputs
@@ -93,11 +78,11 @@ print(f'Summary written to: {result}')
## Outputs ## Outputs
- Path to the summary file - Path of the summary file
## Failure Modes ## Failure Modes
- If the URL is invalid, HTTPGet will fail; if NIM API key is missing, LLMAgent will not function properly - If the URL is invalid or unreachable, the HTTPGet node will fail; if the summarisation fails, the output text might be empty
## Source ## Source
+2 -2
View File
@@ -5,6 +5,6 @@
```python ```python
# How to use this skill # How to use this skill
# Inputs: URL of the Wikipedia page # Inputs: URL of the Wikipedia page
# Process: Step 1: Import necessary modules from _bootstrap (NIM_MODEL, require_nim_api_key) and blacknode → Step 2: Require NVIDIA NIM API key using `require_nim_api_key()` → Step 3: Create a Graph instance `g` # Process: Step 1: Import necessary modules from `_bootstrap` and `blacknode`: Run `from _bootstrap import NIM_MODEL, require_nim_api_key; import blacknode as bn` → Step 2: Require NVIDIA NIM API key: Call `require_nim_api_key()` to ensure the API key is set. → Step 3: Create a graph instance: Initialize `g = bn.Graph()`.
# Outputs: Path to the summary file # Outputs: Path of the summary file
``` ```
+10 -12
View File
@@ -1,28 +1,26 @@
{ {
"name": "research-pipeline", "name": "research-pipeline",
"version": "1.0.0", "version": "1.0.0",
"goal": "Fetch a Wikipedia page, summarise it using an AI agent, and write the summary to a file.", "goal": "Fetch a Wikipedia page, summarise its content using an AI agent, and write the summary to a file.",
"inputs": [ "inputs": [
"URL of the Wikipedia page" "URL of the Wikipedia page"
], ],
"steps": [ "steps": [
"Step 1: Import necessary modules from _bootstrap (NIM_MODEL, require_nim_api_key) and blacknode", "Step 1: Import necessary modules from `_bootstrap` and `blacknode`: Run `from _bootstrap import NIM_MODEL, require_nim_api_key; import blacknode as bn`",
"Step 2: Require NVIDIA NIM API key using `require_nim_api_key()`", "Step 2: Require NVIDIA NIM API key: Call `require_nim_api_key()` to ensure the API key is set.",
"Step 3: Create a Graph instance `g`", "Step 3: Create a graph instance: Initialize `g = bn.Graph()`.",
"Step 4: Add a Literal node for the URL of the Wikipedia page (`url`)", "Step 4: Add nodes for URL, HTTPGet, summarisation, and file writing: `url = g.node('Literal', value='URL of the Wikipedia page'); fetcher = g.node('HTTPGet'); summarise = g.node('LLMAgent', system='You are a technical writer. Summarise the text in 3 bullet points.', model=NIM_MODEL); writer = g.node('FileWrite', path='summary.txt')`",
"Step 5: Add an HTTPGet node to fetch the content from the URL (`fetcher`) and connect it to the Literal node", "Step 5: Connect nodes with edges: `url.out('value') >> fetcher.inp('url'); fetcher.out('text') >> summarise.inp('prompt'); summarise.out('text') >> writer.inp('text')`",
"Step 6: Add an LLMAgent node with system prompt 'You are a technical writer. Summarise the text in 3 bullet points.' and model NIM_MODEL (`summarise`), connecting its input to the output of `fetcher`", "Step 6: Cook the graph to execute and get output: `result = g.cook(writer, 'path'); print(f'Summary written to: {result}')`"
"Step 7: Add a FileWrite node to write the summary to a file named 'summary.txt' (`writer`), connecting its input to the output of `summarise`",
"Step 8: Cook the graph starting from the writer node and print the path where the summary is written"
], ],
"outputs": [ "outputs": [
"Path to the summary file" "Path of the summary file"
], ],
"failure_modes": [ "failure_modes": [
"If the URL is invalid, HTTPGet will fail; if NIM API key is missing, LLMAgent will not function properly" "If the URL is invalid or unreachable, the HTTPGet node will fail; if the summarisation fails, the output text might be empty"
], ],
"confidence": 0.95, "confidence": 0.95,
"explanation": "This workflow can be adapted to fetch and summarise any text from a URL using an AI agent and save the summary to a file.", "explanation": "This workflow can be adapted to fetch and summarise any Wikipedia page or similar content source.",
"source_repo": "https://github.com/temiroff/Blacknode.git", "source_repo": "https://github.com/temiroff/Blacknode.git",
"score": 1.0 "score": 1.0
} }
+32 -66
View File
@@ -1,96 +1,62 @@
--- ---
name: unifai-workflow-execution name: unifai-workflow-execution
version: 1.0.0 version: 1.0.0
description: Execute a multi-agent workflow on the UnifAI platform using a specified description: Execute a multi-agent AI workflow defined in YAML or through the UI's
blueprint and user prompt. drag-and-drop editor.
inputs: inputs:
- blueprint_id or blueprint_name - name: blueprint_path
- user_shortcut description: Path to the blueprint file (YAML) defining the multi-agent workflow.
- user_question - name: execution_mode
description: 'Execution mode: ''local'' or ''distributed''.'
steps: steps:
- 'Step 1: Resolve the blueprint ID from either direct ID or name lookup (resolve_blueprint_id - step_name: Load Blueprint
method)' description: Parse and validate the blueprint file to ensure it conforms to expected
- 'Step 2: Create a new session from the blueprint (create_session method)' structure.
- 'Step 3: Submit the session for background execution with the user prompt (submit_session - step_name: Initialize Execution Engine
method)' description: Set up the execution engine based on the selected mode ('local' or
- 'Step 4: Poll session status until execution completes (poll_session_status method)' 'distributed').
- step_name: Execute Workflow
description: Run the multi-agent workflow, streaming node-by-node output as NDJSON
over HTTP.
- step_name: Stream Results
description: Render and stream results in real time to clients subscribing to the
event stream.
outputs: outputs:
- session_id - name: execution_results
- workflow_id description: The output of the executed workflow, streamed as NDJSON over HTTP.
tags: [] tags: []
metadata: metadata:
source_repo: https://github.com/redhat-community-ai-tools/UnifAI.git source_repo: https://github.com/redhat-community-ai-tools/UnifAI.git
extracted_at: '' extracted_at: ''
confidence: 0.95 confidence: 0.9
--- ---
# unifai-workflow-execution # unifai-workflow-execution
Execute a multi-agent workflow on the UnifAI platform using a specified blueprint and user prompt. Execute a multi-agent AI workflow defined in YAML or through the UI's drag-and-drop editor.
## Setup
**Dependencies:**
```text
pip install requests urllib3
```
**Setup steps:**
1. Install required dependencies using pip install requests urllib3
1. Ensure the environment variables are set correctly (BLUEPRINT_ID, BLUEPRINT_NAME, USER_SHORTCUT, POLLING_INTERVAL, UNIFAI_BASE_URL)
## Key Files
- `scripts/execution_workflow.py - Main script for workflow execution`
## Steps ## Steps
1. Step 1: Resolve the blueprint ID from either direct ID or name lookup (resolve_blueprint_id method) 1. {'step_name': 'Load Blueprint', 'description': 'Parse and validate the blueprint file to ensure it conforms to expected structure.'}
2. Step 2: Create a new session from the blueprint (create_session method) 2. {'step_name': 'Initialize Execution Engine', 'description': "Set up the execution engine based on the selected mode ('local' or 'distributed')."}
3. Step 3: Submit the session for background execution with the user prompt (submit_session method) 3. {'step_name': 'Execute Workflow', 'description': 'Run the multi-agent workflow, streaming node-by-node output as NDJSON over HTTP.'}
4. Step 4: Poll session status until execution completes (poll_session_status method) 4. {'step_name': 'Stream Results', 'description': 'Render and stream results in real time to clients subscribing to the event stream.'}
## Implementation Details
```python
resolve_blueprint_id(client: UnifAIClient) -> str
{...}
# Resolve the blueprint ID from either direct ID or name lookup.
```
```python
create_session(client: UnifAIClient, blueprint_id: str) -> str
{...}
# Create a new session from the blueprint.
```
```python
submit_session(client: UnifAIClient, session_id: str) -> dict
{...}
# Submit the session for background execution with the user prompt.
```
## Inputs ## Inputs
- blueprint_id or blueprint_name - {'name': 'blueprint_path', 'description': 'Path to the blueprint file (YAML) defining the multi-agent workflow.'}
- user_shortcut - {'name': 'execution_mode', 'description': "Execution mode: 'local' or 'distributed'."}
- user_question
## Outputs ## Outputs
- session_id - {'name': 'execution_results', 'description': 'The output of the executed workflow, streamed as NDJSON over HTTP.'}
- workflow_id
## Failure Modes ## Failure Modes
- Blueprint name not found or not unique - error during blueprint resolution - {'mode_name': 'Invalid Blueprint', 'description': 'Blueprint file is not valid YAML or does not conform to expected structure.'}
- Session creation fails - error from API response - {'mode_name': 'Execution Engine Initialization Failure', 'description': 'Failed to initialize the execution engine due to configuration issues or missing dependencies.'}
- Session submission fails - error from API response
- Polling session status fails - error from API response
## Source ## Source
Extracted from: [https://github.com/redhat-community-ai-tools/UnifAI.git](https://github.com/redhat-community-ai-tools/UnifAI.git) Extracted from: [https://github.com/redhat-community-ai-tools/UnifAI.git](https://github.com/redhat-community-ai-tools/UnifAI.git)
Confidence: 0.95 Confidence: 0.9
+3 -3
View File
@@ -4,7 +4,7 @@
```python ```python
# How to use this skill # How to use this skill
# Inputs: blueprint_id or blueprint_name, user_shortcut, user_question # Inputs: {'name': 'blueprint_path', 'description': 'Path to the blueprint file (YAML) defining the multi-agent workflow.'}, {'name': 'execution_mode', 'description': "Execution mode: 'local' or 'distributed'."}
# Process: Step 1: Resolve the blueprint ID from either direct ID or name lookup (resolve_blueprint_id method) → Step 2: Create a new session from the blueprint (create_session method) → Step 3: Submit the session for background execution with the user prompt (submit_session method) # Process: {'step_name': 'Load Blueprint', 'description': 'Parse and validate the blueprint file to ensure it conforms to expected structure.'} → {'step_name': 'Initialize Execution Engine', 'description': "Set up the execution engine based on the selected mode ('local' or 'distributed')."} → {'step_name': 'Execute Workflow', 'description': 'Run the multi-agent workflow, streaming node-by-node output as NDJSON over HTTP.'}
# Outputs: session_id, workflow_id # Outputs: {'name': 'execution_results', 'description': 'The output of the executed workflow, streamed as NDJSON over HTTP.'}
``` ```
+39 -16
View File
@@ -1,30 +1,53 @@
{ {
"name": "unifai-workflow-execution", "name": "unifai-workflow-execution",
"version": "1.0.0", "version": "1.0.0",
"goal": "Execute a multi-agent workflow on the UnifAI platform using a specified blueprint and user prompt.", "goal": "Execute a multi-agent AI workflow defined in YAML or through the UI's drag-and-drop editor.",
"inputs": [ "inputs": [
"blueprint_id or blueprint_name", {
"user_shortcut", "name": "blueprint_path",
"user_question" "description": "Path to the blueprint file (YAML) defining the multi-agent workflow."
},
{
"name": "execution_mode",
"description": "Execution mode: 'local' or 'distributed'."
}
], ],
"steps": [ "steps": [
"Step 1: Resolve the blueprint ID from either direct ID or name lookup (resolve_blueprint_id method)", {
"Step 2: Create a new session from the blueprint (create_session method)", "step_name": "Load Blueprint",
"Step 3: Submit the session for background execution with the user prompt (submit_session method)", "description": "Parse and validate the blueprint file to ensure it conforms to expected structure."
"Step 4: Poll session status until execution completes (poll_session_status method)" },
{
"step_name": "Initialize Execution Engine",
"description": "Set up the execution engine based on the selected mode ('local' or 'distributed')."
},
{
"step_name": "Execute Workflow",
"description": "Run the multi-agent workflow, streaming node-by-node output as NDJSON over HTTP."
},
{
"step_name": "Stream Results",
"description": "Render and stream results in real time to clients subscribing to the event stream."
}
], ],
"outputs": [ "outputs": [
"session_id", {
"workflow_id" "name": "execution_results",
"description": "The output of the executed workflow, streamed as NDJSON over HTTP."
}
], ],
"failure_modes": [ "failure_modes": [
"Blueprint name not found or not unique - error during blueprint resolution", {
"Session creation fails - error from API response", "mode_name": "Invalid Blueprint",
"Session submission fails - error from API response", "description": "Blueprint file is not valid YAML or does not conform to expected structure."
"Polling session status fails - error from API response" },
{
"mode_name": "Execution Engine Initialization Failure",
"description": "Failed to initialize the execution engine due to configuration issues or missing dependencies."
}
], ],
"confidence": 0.95, "confidence": 0.9,
"explanation": "This workflow is specific to the UnifAI platform and its multi-agent system, but can be adapted for similar systems with a similar architecture.", "explanation": "This workflow is designed to execute multi-agent AI workflows defined in YAML blueprints or through the UI's drag-and-drop editor, providing real-time streaming of results.",
"source_repo": "https://github.com/redhat-community-ai-tools/UnifAI.git", "source_repo": "https://github.com/redhat-community-ai-tools/UnifAI.git",
"score": 1.0 "score": 1.0
} }