Compare commits

...

3 Commits

Author SHA1 Message Date
Hermes Pipeline f4f0328c43 Add Skill: research-pipeline
Extracted from: https://github.com/temiroff/Blacknode.git
Score: 1.0
2026-08-05 15:45:47 +00:00
Epictetus 5f917f4121 Add Publisher v2 + 5 extracted skills
Publisher fixes:
- Checkout new branch before push (was pushing main ref)
- Verify files staged before commit
- Handle duplicate files gracefully
- Clean error reporting per stage

Skills merged to main:
- mcp-server-setup (from pipeshub-ai)
- research-pipeline (from Blacknode)
- multi-agent-sequential-workflow (from Fast-LLM-Agent-MCP)
- unifai-workflow-execution (from UnifAI)
- code-review-agent-workflow (from AgentKit)
2026-08-05 15:15:09 +00:00
Epictetus 09b62adb93 Remove __pycache__ and runs/ from tracking 2026-08-05 15:00:08 +00:00
40 changed files with 799 additions and 142 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+79 -37
View File
@@ -1,10 +1,10 @@
"""Stage 8: Publisher — Create branch, commit, open PR on Gitea."""
import json
import subprocess
import os
import tempfile
import shutil
import datetime
import requests
def publish_skill(review_result, config):
"""
@@ -33,23 +33,20 @@ def publish_skill(review_result, config):
branch_name = f"skill/{skill_name}-{ts}"
with tempfile.TemporaryDirectory() as tmpdir:
# Clone repo
repo_dir = os.path.join(tmpdir, "agent-skills")
# Clone repo
result = subprocess.run(
["git", "clone", "--branch", "main", "--single-branch", clone_url, repo_dir],
["git", "clone", "--branch", "main", "--depth", "1", clone_url, repo_dir],
capture_output=True, text=True, timeout=30
)
if result.returncode != 0:
# Try without --branch (might not exist yet)
result = subprocess.run(
["git", "clone", clone_url, repo_dir],
["git", "clone", "--depth", "1", clone_url, repo_dir],
capture_output=True, text=True, timeout=30
)
if result.returncode != 0:
return {
"status": "CLONE_ERROR",
"error": result.stderr[:500],
}
return {"status": "CLONE_ERROR", "error": result.stderr[:500]}
# Configure git
subprocess.run(["git", "config", "user.email", "hermes@agent.local"], cwd=repo_dir)
@@ -59,34 +56,80 @@ def publish_skill(review_result, config):
skill_dir = os.path.join(repo_dir, "skills", skill_name)
os.makedirs(skill_dir, exist_ok=True)
# Write files
# Write skill files
for filename, content in files.items():
filepath = os.path.join(skill_dir, filename)
with open(filepath, 'w') as f:
with open(filepath, "w") as f:
f.write(content)
# Add and commit
subprocess.run(["git", "add", "."], cwd=repo_dir, capture_output=True)
subprocess.run(
["git", "commit", "-m", f"Add Skill: {skill_name}\n\nExtracted from: {gen.get('metadata', {}).get('source_repo', 'unknown')}\nScore: {gen.get('metadata', {}).get('score', 0)}"],
cwd=repo_dir, capture_output=True
# Verify files were written
written_files = []
for root, dirs, fnames in os.walk(skill_dir):
for fn in fnames:
written_files.append(os.path.join(root, fn))
if not written_files:
return {"status": "EMPTY_SKILL", "reason": "No files written to skill directory"}
# Stage and commit
add_result = subprocess.run(
["git", "add", "skills/"], cwd=repo_dir, capture_output=True, text=True
)
# Check if there are actually staged changes
status_result = subprocess.run(
["git", "diff", "--cached", "--name-only"],
cwd=repo_dir, capture_output=True, text=True
)
staged_files = status_result.stdout.strip().split("\n") if status_result.stdout.strip() else []
if not staged_files:
# Nothing to commit — files might already exist. Force add.
subprocess.run(["git", "add", "-f", "skills/"], cwd=repo_dir, capture_output=True, text=True)
status_result = subprocess.run(
["git", "diff", "--cached", "--name-only"],
cwd=repo_dir, capture_output=True, text=True
)
staged_files = status_result.stdout.strip().split("\n") if status_result.stdout.strip() else []
if not staged_files:
return {
"status": "NO_CHANGES",
"reason": f"No new files to commit for {skill_name}. Files already exist in repo.",
}
commit_result = subprocess.run(
[
"git", "commit", "-m",
f"Add Skill: {skill_name}\n\nExtracted from: {gen.get('metadata', {}).get('source_repo', 'unknown')}\nScore: {gen.get('metadata', {}).get('score', 0)}"
],
cwd=repo_dir, capture_output=True, text=True
)
if commit_result.returncode != 0:
return {
"status": "COMMIT_ERROR",
"error": commit_result.stderr[:500],
}
# Checkout new branch
checkout_result = subprocess.run(
["git", "checkout", "-b", branch_name],
cwd=repo_dir, capture_output=True, text=True
)
if checkout_result.returncode != 0:
return {
"status": "CHECKOUT_ERROR",
"error": checkout_result.stderr[:500],
}
# Push branch
auth_url = clone_url.replace("http://", f"http://tonyjbala:{token}@")
push_result = subprocess.run(
["git", "push", "-u", auth_url, f"main:{branch_name}"],
capture_output=True, text=True, timeout=30
["git", "push", "-u", auth_url, branch_name],
cwd=repo_dir, capture_output=True, text=True, timeout=30
)
if push_result.returncode != 0:
# Try creating from current branch
subprocess.run(["git", "checkout", "-b", branch_name], cwd=repo_dir, capture_output=True)
push_result = subprocess.run(
["git", "push", "-u", auth_url, branch_name],
capture_output=True, text=True, timeout=30
)
if push_result.returncode != 0:
return {
"status": "PUSH_ERROR",
@@ -97,19 +140,19 @@ def publish_skill(review_result, config):
pr_url = f"{base_url}/api/v1/repos/{owner}/{repo_name}/pulls"
pr_payload = {
"title": f"Add Skill: {skill_name}",
"body": f"## Skill: {skill_name}\n\n"
f"**Goal:** {gen.get('metadata', {}).get('goal', '')}\n"
f"**Source:** {gen.get('metadata', {}).get('source_repo', '')}\n"
f"**Score:** {gen.get('metadata', {}).get('score', 0)}\n"
f"**Confidence:** {gen.get('metadata', {}).get('confidence', 0)}\n"
f"**Review:** {review_result.get('reason', '')}\n\n"
f"### Files\n"
+ "".join(f"- `{f}`\n" for f in files.keys()),
"body": (
f"## Skill: {skill_name}\n\n"
f"**Goal:** {gen.get('metadata', {}).get('goal', '')}\n"
f"**Source:** {gen.get('metadata', {}).get('source_repo', '')}\n"
f"**Score:** {gen.get('metadata', {}).get('score', 0)}\n"
f"**Confidence:** {gen.get('metadata', {}).get('confidence', 0)}\n\n"
f"### Files\n"
+ "".join(f"- `{f}`\n" for f in files.keys())
),
"head": branch_name,
"base": "main",
}
import requests
headers = {
"Authorization": f"token {token}",
"Content-Type": "application/json",
@@ -127,7 +170,6 @@ def publish_skill(review_result, config):
"message": f"PR opened: {pr_data.get('html_url', '')}",
}
elif resp.status_code == 409:
# PR already exists for this branch
return {
"status": "PUBLISHED",
"skill_name": skill_name,
-21
View File
@@ -1,21 +0,0 @@
{
"run_id": "20260805-053642",
"started_at": "2026-08-05T05:36:42.627714",
"stages": {
"scout": {
"count": 2
},
"filter": {
"kept": 2,
"rejected": 0
}
},
"results": {
"extracted": 0,
"scored": 0,
"generated": 0,
"reviewed": 0,
"published": 0
},
"ended_at": "2026-08-05T05:36:49.213968"
}
-21
View File
@@ -1,21 +0,0 @@
{
"run_id": "20260805-053718",
"started_at": "2026-08-05T05:37:18.169016",
"stages": {
"scout": {
"count": 2
},
"filter": {
"kept": 2,
"rejected": 0
}
},
"results": {
"extracted": 0,
"scored": 0,
"generated": 0,
"reviewed": 0,
"published": 0
},
"ended_at": "2026-08-05T05:38:25.179277"
}
-21
View File
@@ -1,21 +0,0 @@
{
"run_id": "20260805-054839",
"started_at": "2026-08-05T05:48:39.344784",
"stages": {
"scout": {
"count": 5
},
"filter": {
"kept": 5,
"rejected": 0
}
},
"results": {
"extracted": 0,
"scored": 0,
"generated": 0,
"reviewed": 0,
"published": 0
},
"ended_at": "2026-08-05T05:48:50.960254"
}
-21
View File
@@ -1,21 +0,0 @@
{
"run_id": "20260805-054930",
"started_at": "2026-08-05T05:49:30.857560",
"stages": {
"scout": {
"count": 5
},
"filter": {
"kept": 5,
"rejected": 0
}
},
"results": {
"extracted": 0,
"scored": 0,
"generated": 0,
"reviewed": 0,
"published": 0
},
"ended_at": "2026-08-05T05:49:45.411491"
}
-21
View File
@@ -1,21 +0,0 @@
{
"run_id": "20260805-055041",
"started_at": "2026-08-05T05:50:41.871225",
"stages": {
"scout": {
"count": 5
},
"filter": {
"kept": 5,
"rejected": 0
}
},
"results": {
"extracted": 0,
"scored": 0,
"generated": 0,
"reviewed": 0,
"published": 0
},
"ended_at": "2026-08-05T05:50:57.051862"
}
@@ -0,0 +1,77 @@
---
name: code-review-agent-workflow
version: 1.0.0
description: Automate the code review process using a multi-step workflow with human-in-the-loop
approval.
inputs:
- Sample diff of code changes (str)
- Repo context (dict)
steps:
- 'Step 1: Build the graph for the code review agent using `build_graph()` from `agentkit.workflow.code_review.graph`'
- 'Step 2: Invoke the graph with initial parameters including sample diff, repo context,
user ID, and other metadata'
- 'Step 3: The graph processes the input through a series of steps, generating messages
and issues as it progresses'
outputs:
- Final result containing processed messages and issues (dict)
tags: []
metadata:
source_repo: https://github.com/itszhaoziyan-n/AgentKit.git
extracted_at: ''
confidence: 0.95
---
# code-review-agent-workflow
Automate the code review process using a multi-step workflow with human-in-the-loop approval.
## Setup
**Dependencies:**
```text
pip install langgraph>=0.3 langchain-core>=0.3 langchain-anthropic>=0.3 langfuse>=2.0 mcp[server]>=1.24,<2.0 langchain-mcp-adapters>=0.1 tenacity>=9.0 fastapi>=0.115 uvicorn[standard]>=0.32 psycopg[binary]>=3.1 langgraph-checkpoint-postgres>=2.0 httpx>=0.27 python-dotenv>=1.0 redis>=5.0
```
**Setup steps:**
1. cp .env.example .env
1. docker compose up -d
1. pip install -e '.[dev]'
## Key Files
- `agentkit/workflow/code_review/graph.py - Contains the `build_graph` function and graph invocation logic.`
- `examples/run_code_review.py - Example script demonstrating how to run the code review agent.`
## Steps
1. Step 1: Build the graph for the code review agent using `build_graph()` from `agentkit.workflow.code_review.graph`
2. Step 2: Invoke the graph with initial parameters including sample diff, repo context, user ID, and other metadata
3. Step 3: The graph processes the input through a series of steps, generating messages and issues as it progresses
## Implementation Details
```python
graph = build_graph()
thread_id = str(uuid.uuid4())
result = graph.invoke(...)
```
## Inputs
- Sample diff of code changes (str)
- Repo context (dict)
## Outputs
- Final result containing processed messages and issues (dict)
## Failure Modes
- Specific failure scenario with mitigation: If the `build_graph()` function fails to initialize properly, ensure all required dependencies are correctly installed.
## Source
Extracted from: [https://github.com/itszhaoziyan-n/AgentKit.git](https://github.com/itszhaoziyan-n/AgentKit.git)
Confidence: 0.95
@@ -0,0 +1,6 @@
# Commands: code-review-agent-workflow
## Available Commands
- `/skill code-review-agent-workflow` — Load this skill
- `/run code-review-agent-workflow` — Execute workflow
@@ -0,0 +1,10 @@
# Examples: code-review-agent-workflow
## Usage Example
```python
# How to use this skill
# Inputs: Sample diff of code changes (str), Repo context (dict)
# Process: Step 1: Build the graph for the code review agent using `build_graph()` from `agentkit.workflow.code_review.graph` → Step 2: Invoke the graph with initial parameters including sample diff, repo context, user ID, and other metadata → Step 3: The graph processes the input through a series of steps, generating messages and issues as it progresses
# Outputs: Final result containing processed messages and issues (dict)
```
@@ -0,0 +1,24 @@
{
"name": "code-review-agent-workflow",
"version": "1.0.0",
"goal": "Automate the code review process using a multi-step workflow with human-in-the-loop approval.",
"inputs": [
"Sample diff of code changes (str)",
"Repo context (dict)"
],
"steps": [
"Step 1: Build the graph for the code review agent using `build_graph()` from `agentkit.workflow.code_review.graph`",
"Step 2: Invoke the graph with initial parameters including sample diff, repo context, user ID, and other metadata",
"Step 3: The graph processes the input through a series of steps, generating messages and issues as it progresses"
],
"outputs": [
"Final result containing processed messages and issues (dict)"
],
"failure_modes": [
"Specific failure scenario with mitigation: If the `build_graph()` function fails to initialize properly, ensure all required dependencies are correctly installed."
],
"confidence": 0.95,
"explanation": "This workflow is reusable for any code review process that requires a multi-step analysis and human approval.",
"source_repo": "https://github.com/itszhaoziyan-n/AgentKit.git",
"score": 1.0
}
@@ -0,0 +1,9 @@
# Tests: code-review-agent-workflow
## Test Checklist
- [ ] Workflow has at least 3 steps
- [ ] All inputs are defined
- [ ] All outputs are defined
- [ ] Failure modes are documented
- [ ] Skill can be loaded without errors
+98
View File
@@ -0,0 +1,98 @@
---
name: mcp-server-setup
version: 1.0.0
description: Set up an MCP server to integrate PipesHub with any MCP-compatible client.
inputs:
- MCP server configuration details
- PipesHub credentials
steps:
- 'Step 1: Clone the `pipeshub-ai/mcp-server` repository using `git clone https://github.com/pipeshub-ai/mcp-server.git`'
- 'Step 2: Navigate to the cloned directory with `cd mcp-server`'
- 'Step 3: Run the interactive installer by executing `./install.sh`'
- 'Step 4: Follow the prompts in the installer to configure the server, including
setting up graph DB, message broker, and KV store'
- 'Step 5: The installer will generate a `.env` file with necessary environment variables.
Ensure these are correctly set'
- 'Step 6: Start the MCP server by running `docker-compose up -d`'
outputs:
- Running MCP server
- .env file generated
tags: []
metadata:
source_repo: https://github.com/pipeshub-ai/pipeshub-ai.git
extracted_at: ''
confidence: 0.95
---
# mcp-server-setup
Set up an MCP server to integrate PipesHub with any MCP-compatible client.
## Setup
**Dependencies:**
```text
pip install docker docker-compose
```
**Setup steps:**
1. Ensure Docker and Docker Compose are installed on your system.
1. Clone the `pipeshub-ai/mcp-server` repository using `git clone https://github.com/pipeshub-ai/mcp-server.git`
## Key Files
- `path/to/install.sh - Script to run the interactive installer`
- `path/to/docker-compose.yml - Configuration for Docker services`
## Steps
1. Step 1: Clone the `pipeshub-ai/mcp-server` repository using `git clone https://github.com/pipeshub-ai/mcp-server.git`
2. Step 2: Navigate to the cloned directory with `cd mcp-server`
3. Step 3: Run the interactive installer by executing `./install.sh`
4. Step 4: Follow the prompts in the installer to configure the server, including setting up graph DB, message broker, and KV store
5. Step 5: The installer will generate a `.env` file with necessary environment variables. Ensure these are correctly set
6. Step 6: Start the MCP server by running `docker-compose up -d`
## Implementation Details
```python
```bash
./install.sh
```
Run this script to start the installation process.
```
```python
```yaml
docker-compose:
version: '3.9'
services:
mcp-server:
image: pipeshubai/mcp-server:latest
environment:
- PIPESHUB_API_KEY=your_api_key_here
```
This snippet shows how to configure the Docker Compose file.
```
## Inputs
- MCP server configuration details
- PipesHub credentials
## Outputs
- Running MCP server
- .env file generated
## Failure Modes
- Installer fails to run due to missing dependencies or incorrect configuration
- Docker Compose setup issues preventing server from starting
## Source
Extracted from: [https://github.com/pipeshub-ai/pipeshub-ai.git](https://github.com/pipeshub-ai/pipeshub-ai.git)
Confidence: 0.95
+6
View File
@@ -0,0 +1,6 @@
# Commands: mcp-server-setup
## Available Commands
- `/skill mcp-server-setup` — Load this skill
- `/run mcp-server-setup` — Execute workflow
+10
View File
@@ -0,0 +1,10 @@
# Examples: mcp-server-setup
## Usage Example
```python
# How to use this skill
# Inputs: MCP server configuration details, PipesHub credentials
# Process: Step 1: Clone the `pipeshub-ai/mcp-server` repository using `git clone https://github.com/pipeshub-ai/mcp-server.git` → Step 2: Navigate to the cloned directory with `cd mcp-server` → Step 3: Run the interactive installer by executing `./install.sh`
# Outputs: Running MCP server, .env file generated
```
+29
View File
@@ -0,0 +1,29 @@
{
"name": "mcp-server-setup",
"version": "1.0.0",
"goal": "Set up an MCP server to integrate PipesHub with any MCP-compatible client.",
"inputs": [
"MCP server configuration details",
"PipesHub credentials"
],
"steps": [
"Step 1: Clone the `pipeshub-ai/mcp-server` repository using `git clone https://github.com/pipeshub-ai/mcp-server.git`",
"Step 2: Navigate to the cloned directory with `cd mcp-server`",
"Step 3: Run the interactive installer by executing `./install.sh`",
"Step 4: Follow the prompts in the installer to configure the server, including setting up graph DB, message broker, and KV store",
"Step 5: The installer will generate a `.env` file with necessary environment variables. Ensure these are correctly set",
"Step 6: Start the MCP server by running `docker-compose up -d`"
],
"outputs": [
"Running MCP server",
".env file generated"
],
"failure_modes": [
"Installer fails to run due to missing dependencies or incorrect configuration",
"Docker Compose setup issues preventing server from starting"
],
"confidence": 0.95,
"explanation": "This workflow is specific but can be adapted for different deployment environments and configurations.",
"source_repo": "https://github.com/pipeshub-ai/pipeshub-ai.git",
"score": 1.0
}
+9
View File
@@ -0,0 +1,9 @@
# Tests: mcp-server-setup
## Test Checklist
- [ ] Workflow has at least 3 steps
- [ ] All inputs are defined
- [ ] All outputs are defined
- [ ] Failure modes are documented
- [ ] Skill can be loaded without errors
@@ -0,0 +1,84 @@
---
name: multi-agent-sequential-workflow
version: 1.0.0
description: Gather and process information from multiple agents to generate a comprehensive
travel guide.
inputs:
- User query with location
steps:
- 'Step 1: Researcher agent (agent.py) uses LangGraph create_react_agent with BedrockModel
to gather raw facts about the destination.'
- 'Step 2: Travel Guide Generator agent (agent.py) synthesizes the gathered data into
a structured travel guide based on the user''s request and raw information provided
by the researcher.'
- 'Step 3: Writer agent (agent.py) formats the final response, including the structured
guide content and prominently features the ''Suggested Web Pages'' section.'
outputs:
- Structured travel guide with key sections
- Final client response
tags: []
metadata:
source_repo: https://github.com/omerbsezer/Fast-LLM-Agent-MCP.git
extracted_at: ''
confidence: 0.95
---
# multi-agent-sequential-workflow
Gather and process information from multiple agents to generate a comprehensive travel guide.
## Setup
**Dependencies:**
```text
pip install python3 fastapi uvicorn strands bedrock-model
```
**Setup steps:**
1. Install required dependencies using pip
1. Set up environment variables for API keys and model IDs
## Key Files
- `agents/aws_strands/05-agent-strands-multiagent-workflow-sequential/agent.py - Contains the multi-agent workflow logic.`
- `agents/aws_strands/05-agent-strands-multiagent-workflow-sequential/app.py - FastAPI app to handle user queries.`
## Steps
1. Step 1: Researcher agent (agent.py) uses LangGraph create_react_agent with BedrockModel to gather raw facts about the destination.
2. Step 2: Travel Guide Generator agent (agent.py) synthesizes the gathered data into a structured travel guide based on the user's request and raw information provided by the researcher.
3. Step 3: Writer agent (agent.py) formats the final response, including the structured guide content and prominently features the 'Suggested Web Pages' section.
## Implementation Details
```python
research_output = researcher_agent(query, stream=False)
```
```python
guide_output = travel_guide_agent(planner_prompt, stream=False)
```
```python
final_response = writer_agent(writer_prompt, stream=False)
```
## Inputs
- User query with location
## Outputs
- Structured travel guide with key sections
- Final client response
## Failure Modes
- Network issues during API calls could lead to incomplete data collection or processing failures
## Source
Extracted from: [https://github.com/omerbsezer/Fast-LLM-Agent-MCP.git](https://github.com/omerbsezer/Fast-LLM-Agent-MCP.git)
Confidence: 0.95
@@ -0,0 +1,6 @@
# Commands: multi-agent-sequential-workflow
## Available Commands
- `/skill multi-agent-sequential-workflow` — Load this skill
- `/run multi-agent-sequential-workflow` — Execute workflow
@@ -0,0 +1,10 @@
# Examples: multi-agent-sequential-workflow
## Usage Example
```python
# How to use this skill
# Inputs: User query with location
# Process: Step 1: Researcher agent (agent.py) uses LangGraph create_react_agent with BedrockModel to gather raw facts about the destination. → Step 2: Travel Guide Generator agent (agent.py) synthesizes the gathered data into a structured travel guide based on the user's request and raw information provided by the researcher. → Step 3: Writer agent (agent.py) formats the final response, including the structured guide content and prominently features the 'Suggested Web Pages' section.
# Outputs: Structured travel guide with key sections, Final client response
```
@@ -0,0 +1,24 @@
{
"name": "multi-agent-sequential-workflow",
"version": "1.0.0",
"goal": "Gather and process information from multiple agents to generate a comprehensive travel guide.",
"inputs": [
"User query with location"
],
"steps": [
"Step 1: Researcher agent (agent.py) uses LangGraph create_react_agent with BedrockModel to gather raw facts about the destination.",
"Step 2: Travel Guide Generator agent (agent.py) synthesizes the gathered data into a structured travel guide based on the user's request and raw information provided by the researcher.",
"Step 3: Writer agent (agent.py) formats the final response, including the structured guide content and prominently features the 'Suggested Web Pages' section."
],
"outputs": [
"Structured travel guide with key sections",
"Final client response"
],
"failure_modes": [
"Network issues during API calls could lead to incomplete data collection or processing failures"
],
"confidence": 0.95,
"explanation": "This workflow is specific but can be adapted for other types of guides or information gathering tasks.",
"source_repo": "https://github.com/omerbsezer/Fast-LLM-Agent-MCP.git",
"score": 1.0
}
@@ -0,0 +1,9 @@
# Tests: multi-agent-sequential-workflow
## Test Checklist
- [ ] Workflow has at least 3 steps
- [ ] All inputs are defined
- [ ] All outputs are defined
- [ ] Failure modes are documented
- [ ] Skill can be loaded without errors
+105
View File
@@ -0,0 +1,105 @@
---
name: research-pipeline
version: 1.0.0
description: Fetch a Wikipedia page, summarise it using an AI agent, and write the
summary to a file.
inputs:
- URL of the Wikipedia page
steps:
- '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`'
- 'Step 4: Add a Literal node for the URL of the Wikipedia page (`url`)'
- 'Step 5: Add an HTTPGet node to fetch the content from the URL (`fetcher`) and connect
it to the Literal node'
- '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 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:
- Path to the summary file
tags: []
metadata:
source_repo: https://github.com/temiroff/Blacknode.git
extracted_at: ''
confidence: 0.95
---
# research-pipeline
Fetch a Wikipedia page, summarise it using an AI agent, and write the summary to a file.
## Setup
**Dependencies:**
```text
pip install anthropic>=0.25 docker>=7.1 openai>=1.0
```
**Setup steps:**
1. Ensure NVIDIA NIM API key is set in the environment or editor UI
1. Install required dependencies using `pip install -r requirements.txt`
## Key Files
- `examples/research_pipeline.py - Contains the research pipeline workflow`
## Steps
1. Step 1: Import necessary modules from _bootstrap (NIM_MODEL, require_nim_api_key) and blacknode
2. Step 2: Require NVIDIA NIM API key using `require_nim_api_key()`
3. Step 3: Create a Graph instance `g`
4. Step 4: Add a Literal node for the URL of the Wikipedia page (`url`)
5. Step 5: Add an HTTPGet node to fetch the content from the URL (`fetcher`) and connect it to the Literal node
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`
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
```python
from _bootstrap import NIM_MODEL, require_nim_api_key
import blacknode as bn
```
```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')
```
```python
url.out('value') >> fetcher.inp('url')
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
- URL of the Wikipedia page
## Outputs
- Path to the summary file
## Failure Modes
- If the URL is invalid, HTTPGet will fail; if NIM API key is missing, LLMAgent will not function properly
## Source
Extracted from: [https://github.com/temiroff/Blacknode.git](https://github.com/temiroff/Blacknode.git)
Confidence: 0.95
+6
View File
@@ -0,0 +1,6 @@
# Commands: research-pipeline
## Available Commands
- `/skill research-pipeline` — Load this skill
- `/run research-pipeline` — Execute workflow
+10
View File
@@ -0,0 +1,10 @@
# Examples: research-pipeline
## Usage Example
```python
# How to use this skill
# 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`
# Outputs: Path to the summary file
```
+28
View File
@@ -0,0 +1,28 @@
{
"name": "research-pipeline",
"version": "1.0.0",
"goal": "Fetch a Wikipedia page, summarise it using an AI agent, and write the summary to a file.",
"inputs": [
"URL of the Wikipedia page"
],
"steps": [
"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`",
"Step 4: Add a Literal node for the URL of the Wikipedia page (`url`)",
"Step 5: Add an HTTPGet node to fetch the content from the URL (`fetcher`) and connect it to the Literal node",
"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 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": [
"Path to the summary file"
],
"failure_modes": [
"If the URL is invalid, HTTPGet will fail; if NIM API key is missing, LLMAgent will not function properly"
],
"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.",
"source_repo": "https://github.com/temiroff/Blacknode.git",
"score": 1.0
}
+9
View File
@@ -0,0 +1,9 @@
# Tests: research-pipeline
## Test Checklist
- [ ] Workflow has at least 3 steps
- [ ] All inputs are defined
- [ ] All outputs are defined
- [ ] Failure modes are documented
- [ ] Skill can be loaded without errors
+96
View File
@@ -0,0 +1,96 @@
---
name: unifai-workflow-execution
version: 1.0.0
description: Execute a multi-agent workflow on the UnifAI platform using a specified
blueprint and user prompt.
inputs:
- blueprint_id or blueprint_name
- user_shortcut
- user_question
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 3: Submit the session for background execution with the user prompt (submit_session
method)'
- 'Step 4: Poll session status until execution completes (poll_session_status method)'
outputs:
- session_id
- workflow_id
tags: []
metadata:
source_repo: https://github.com/redhat-community-ai-tools/UnifAI.git
extracted_at: ''
confidence: 0.95
---
# unifai-workflow-execution
Execute a multi-agent workflow on the UnifAI platform using a specified blueprint and user prompt.
## 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
1. Step 1: Resolve the blueprint ID from either direct ID or name lookup (resolve_blueprint_id method)
2. Step 2: Create a new session from the blueprint (create_session method)
3. Step 3: Submit the session for background execution with the user prompt (submit_session method)
4. Step 4: Poll session status until execution completes (poll_session_status method)
## 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
- blueprint_id or blueprint_name
- user_shortcut
- user_question
## Outputs
- session_id
- workflow_id
## Failure Modes
- Blueprint name not found or not unique - error during blueprint resolution
- Session creation fails - error from API response
- Session submission fails - error from API response
- Polling session status fails - error from API response
## Source
Extracted from: [https://github.com/redhat-community-ai-tools/UnifAI.git](https://github.com/redhat-community-ai-tools/UnifAI.git)
Confidence: 0.95
@@ -0,0 +1,6 @@
# Commands: unifai-workflow-execution
## Available Commands
- `/skill unifai-workflow-execution` — Load this skill
- `/run unifai-workflow-execution` — Execute workflow
@@ -0,0 +1,10 @@
# Examples: unifai-workflow-execution
## Usage Example
```python
# How to use this skill
# Inputs: blueprint_id or blueprint_name, user_shortcut, user_question
# 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)
# Outputs: session_id, workflow_id
```
@@ -0,0 +1,30 @@
{
"name": "unifai-workflow-execution",
"version": "1.0.0",
"goal": "Execute a multi-agent workflow on the UnifAI platform using a specified blueprint and user prompt.",
"inputs": [
"blueprint_id or blueprint_name",
"user_shortcut",
"user_question"
],
"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 3: Submit the session for background execution with the user prompt (submit_session method)",
"Step 4: Poll session status until execution completes (poll_session_status method)"
],
"outputs": [
"session_id",
"workflow_id"
],
"failure_modes": [
"Blueprint name not found or not unique - error during blueprint resolution",
"Session creation fails - error from API response",
"Session submission fails - error from API response",
"Polling session status fails - error from API response"
],
"confidence": 0.95,
"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.",
"source_repo": "https://github.com/redhat-community-ai-tools/UnifAI.git",
"score": 1.0
}
@@ -0,0 +1,9 @@
# Tests: unifai-workflow-execution
## Test Checklist
- [ ] Workflow has at least 3 steps
- [ ] All inputs are defined
- [ ] All outputs are defined
- [ ] Failure modes are documented
- [ ] Skill can be loaded without errors