Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 63d645fc3b | |||
| 7f496feb90 |
@@ -52,6 +52,18 @@ def publish_skill(review_result, config):
|
|||||||
subprocess.run(["git", "config", "user.email", "hermes@agent.local"], cwd=repo_dir)
|
subprocess.run(["git", "config", "user.email", "hermes@agent.local"], cwd=repo_dir)
|
||||||
subprocess.run(["git", "config", "user.name", "Hermes Pipeline"], cwd=repo_dir)
|
subprocess.run(["git", "config", "user.name", "Hermes Pipeline"], cwd=repo_dir)
|
||||||
|
|
||||||
|
# Check for duplicates in skills/ directory
|
||||||
|
skills_dir = os.path.join(repo_dir, "skills")
|
||||||
|
existing_skills = []
|
||||||
|
if os.path.isdir(skills_dir):
|
||||||
|
existing_skills = [d for d in os.listdir(skills_dir) if os.path.isdir(os.path.join(skills_dir, d))]
|
||||||
|
|
||||||
|
if skill_name in existing_skills:
|
||||||
|
return {
|
||||||
|
"status": "SKIP",
|
||||||
|
"reason": f"Skill '{skill_name}' already exists in skills/ directory",
|
||||||
|
}
|
||||||
|
|
||||||
# Create skill directory
|
# Create skill directory
|
||||||
skill_dir = os.path.join(repo_dir, "skills", skill_name)
|
skill_dir = os.path.join(repo_dir, "skills", skill_name)
|
||||||
os.makedirs(skill_dir, exist_ok=True)
|
os.makedirs(skill_dir, exist_ok=True)
|
||||||
|
|||||||
@@ -137,6 +137,8 @@ def main():
|
|||||||
if publish_output.get("status") == "PUBLISHED":
|
if publish_output.get("status") == "PUBLISHED":
|
||||||
print(f" ✓ Published! PR: {publish_output.get('pr_url', '')}")
|
print(f" ✓ Published! PR: {publish_output.get('pr_url', '')}")
|
||||||
results["published"] += 1
|
results["published"] += 1
|
||||||
|
elif publish_output.get("status") == "SKIP":
|
||||||
|
print(f" ⏸ Skipped: {publish_output.get('reason', '')}")
|
||||||
else:
|
else:
|
||||||
print(f" ! {publish_output.get('status', '?')}: {publish_output.get('message', publish_output.get('error', ''))[:100]}")
|
print(f" ! {publish_output.get('status', '?')}: {publish_output.get('message', publish_output.get('error', ''))[:100]}")
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,83 @@
|
|||||||
|
---
|
||||||
|
name: langgraph-workflow-creation
|
||||||
|
version: 1.0.0
|
||||||
|
description: Create a LangGraph workflow to gather facts using SerperDevTool and process
|
||||||
|
them with an AI agent.
|
||||||
|
inputs:
|
||||||
|
- API Key for SerperDevTool
|
||||||
|
- Search Query
|
||||||
|
steps:
|
||||||
|
- 'Step 1: Import necessary modules from langgraph and langchain libraries'
|
||||||
|
- 'Step 2: Create a LangGraph agent using `langgraph.create_react_agent` function
|
||||||
|
with SerperDevTool as the tool node'
|
||||||
|
- 'Step 3: Define the search query and pass it to the agent for fact gathering'
|
||||||
|
- 'Step 4: Process the gathered facts within the AI agent'
|
||||||
|
outputs:
|
||||||
|
- Processed Facts
|
||||||
|
tags: []
|
||||||
|
metadata:
|
||||||
|
source_repo: https://github.com/jkmaina/LangGraphProjects.git
|
||||||
|
extracted_at: ''
|
||||||
|
confidence: 0.95
|
||||||
|
---
|
||||||
|
|
||||||
|
# langgraph-workflow-creation
|
||||||
|
|
||||||
|
Create a LangGraph workflow to gather facts using SerperDevTool and process them with an AI agent.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
**Dependencies:**
|
||||||
|
|
||||||
|
```text
|
||||||
|
pip install langchain serperdev
|
||||||
|
```
|
||||||
|
|
||||||
|
**Setup steps:**
|
||||||
|
|
||||||
|
1. Install required libraries: pip install langchain serperdev
|
||||||
|
1. Add API key to .env file: OPENAPI_API_KEY=your_api_key
|
||||||
|
|
||||||
|
## Key Files
|
||||||
|
|
||||||
|
- `agent.py - Contains the LangGraph agent creation logic`
|
||||||
|
- `tool_node.py - Defines the SerperDevTool node`
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
1. Step 1: Import necessary modules from langgraph and langchain libraries
|
||||||
|
2. Step 2: Create a LangGraph agent using `langgraph.create_react_agent` function with SerperDevTool as the tool node
|
||||||
|
3. Step 3: Define the search query and pass it to the agent for fact gathering
|
||||||
|
4. Step 4: Process the gathered facts within the AI agent
|
||||||
|
|
||||||
|
## Implementation Details
|
||||||
|
|
||||||
|
```python
|
||||||
|
import langgraph
|
||||||
|
from serperdev import SerperDevTool
|
||||||
|
|
||||||
|
def create_agent(api_key, query):
|
||||||
|
tool = SerperDevTool(api_key)
|
||||||
|
agent = langgraph.create_react_agent(tool=tool)
|
||||||
|
facts = agent.run(query)
|
||||||
|
return process_facts(facts)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- API Key for SerperDevTool
|
||||||
|
- Search Query
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
- Processed Facts
|
||||||
|
|
||||||
|
## Failure Modes
|
||||||
|
|
||||||
|
- API Key not provided
|
||||||
|
- Invalid Search Query
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
Extracted from: [https://github.com/jkmaina/LangGraphProjects.git](https://github.com/jkmaina/LangGraphProjects.git)
|
||||||
|
Confidence: 0.95
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Commands: langgraph-workflow-creation
|
||||||
|
|
||||||
|
## Available Commands
|
||||||
|
|
||||||
|
- `/skill langgraph-workflow-creation` — Load this skill
|
||||||
|
- `/run langgraph-workflow-creation` — Execute workflow
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# Examples: langgraph-workflow-creation
|
||||||
|
|
||||||
|
## Usage Example
|
||||||
|
|
||||||
|
```python
|
||||||
|
# How to use this skill
|
||||||
|
# Inputs: API Key for SerperDevTool, Search Query
|
||||||
|
# Process: Step 1: Import necessary modules from langgraph and langchain libraries → Step 2: Create a LangGraph agent using `langgraph.create_react_agent` function with SerperDevTool as the tool node → Step 3: Define the search query and pass it to the agent for fact gathering
|
||||||
|
# Outputs: Processed Facts
|
||||||
|
```
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"name": "langgraph-workflow-creation",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"goal": "Create a LangGraph workflow to gather facts using SerperDevTool and process them with an AI agent.",
|
||||||
|
"inputs": [
|
||||||
|
"API Key for SerperDevTool",
|
||||||
|
"Search Query"
|
||||||
|
],
|
||||||
|
"steps": [
|
||||||
|
"Step 1: Import necessary modules from langgraph and langchain libraries",
|
||||||
|
"Step 2: Create a LangGraph agent using `langgraph.create_react_agent` function with SerperDevTool as the tool node",
|
||||||
|
"Step 3: Define the search query and pass it to the agent for fact gathering",
|
||||||
|
"Step 4: Process the gathered facts within the AI agent"
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
"Processed Facts"
|
||||||
|
],
|
||||||
|
"failure_modes": [
|
||||||
|
"API Key not provided",
|
||||||
|
"Invalid Search Query"
|
||||||
|
],
|
||||||
|
"confidence": 0.95,
|
||||||
|
"explanation": "This workflow is specific to fact gathering and can be adapted for different search queries or tools.",
|
||||||
|
"source_repo": "https://github.com/jkmaina/LangGraphProjects.git",
|
||||||
|
"score": 1.0
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# Tests: langgraph-workflow-creation
|
||||||
|
|
||||||
|
## 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
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user