Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f4f0328c43 | |||
| 5f917f4121 | |||
| 09b62adb93 |
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.
+74
-32
@@ -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,32 +56,78 @@ 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
|
||||
)
|
||||
|
||||
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
|
||||
cwd=repo_dir, capture_output=True, text=True, timeout=30
|
||||
)
|
||||
|
||||
if push_result.returncode != 0:
|
||||
@@ -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"
|
||||
"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"**Confidence:** {gen.get('metadata', {}).get('confidence', 0)}\n\n"
|
||||
f"### Files\n"
|
||||
+ "".join(f"- `{f}`\n" for f in files.keys()),
|
||||
+ "".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,
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,6 @@
|
||||
# Commands: research-pipeline
|
||||
|
||||
## Available Commands
|
||||
|
||||
- `/skill research-pipeline` — Load this skill
|
||||
- `/run research-pipeline` — Execute workflow
|
||||
@@ -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
|
||||
```
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user