diff --git a/pipeline/publisher.py b/pipeline/publisher.py index f74bdf5..a6b68cf 100644 --- a/pipeline/publisher.py +++ b/pipeline/publisher.py @@ -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, diff --git a/skills/code-review-agent-workflow/SKILL.md b/skills/code-review-agent-workflow/SKILL.md new file mode 100644 index 0000000..e4fbe18 --- /dev/null +++ b/skills/code-review-agent-workflow/SKILL.md @@ -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 diff --git a/skills/code-review-agent-workflow/commands.md b/skills/code-review-agent-workflow/commands.md new file mode 100644 index 0000000..722206d --- /dev/null +++ b/skills/code-review-agent-workflow/commands.md @@ -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 diff --git a/skills/code-review-agent-workflow/examples.md b/skills/code-review-agent-workflow/examples.md new file mode 100644 index 0000000..e4a5ae1 --- /dev/null +++ b/skills/code-review-agent-workflow/examples.md @@ -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) +``` diff --git a/skills/code-review-agent-workflow/metadata.json b/skills/code-review-agent-workflow/metadata.json new file mode 100644 index 0000000..09d6c02 --- /dev/null +++ b/skills/code-review-agent-workflow/metadata.json @@ -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 +} \ No newline at end of file diff --git a/skills/code-review-agent-workflow/tests.md b/skills/code-review-agent-workflow/tests.md new file mode 100644 index 0000000..5b5dbfc --- /dev/null +++ b/skills/code-review-agent-workflow/tests.md @@ -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 diff --git a/skills/mcp-server-setup/SKILL.md b/skills/mcp-server-setup/SKILL.md new file mode 100644 index 0000000..2d94be8 --- /dev/null +++ b/skills/mcp-server-setup/SKILL.md @@ -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 diff --git a/skills/mcp-server-setup/commands.md b/skills/mcp-server-setup/commands.md new file mode 100644 index 0000000..f9798c7 --- /dev/null +++ b/skills/mcp-server-setup/commands.md @@ -0,0 +1,6 @@ +# Commands: mcp-server-setup + +## Available Commands + +- `/skill mcp-server-setup` — Load this skill +- `/run mcp-server-setup` — Execute workflow diff --git a/skills/mcp-server-setup/examples.md b/skills/mcp-server-setup/examples.md new file mode 100644 index 0000000..1e7a3a1 --- /dev/null +++ b/skills/mcp-server-setup/examples.md @@ -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 +``` diff --git a/skills/mcp-server-setup/metadata.json b/skills/mcp-server-setup/metadata.json new file mode 100644 index 0000000..3484f47 --- /dev/null +++ b/skills/mcp-server-setup/metadata.json @@ -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 +} \ No newline at end of file diff --git a/skills/mcp-server-setup/tests.md b/skills/mcp-server-setup/tests.md new file mode 100644 index 0000000..0a3d38b --- /dev/null +++ b/skills/mcp-server-setup/tests.md @@ -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 diff --git a/skills/multi-agent-sequential-workflow/SKILL.md b/skills/multi-agent-sequential-workflow/SKILL.md new file mode 100644 index 0000000..fd52bbb --- /dev/null +++ b/skills/multi-agent-sequential-workflow/SKILL.md @@ -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 diff --git a/skills/multi-agent-sequential-workflow/commands.md b/skills/multi-agent-sequential-workflow/commands.md new file mode 100644 index 0000000..2031619 --- /dev/null +++ b/skills/multi-agent-sequential-workflow/commands.md @@ -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 diff --git a/skills/multi-agent-sequential-workflow/examples.md b/skills/multi-agent-sequential-workflow/examples.md new file mode 100644 index 0000000..15dae32 --- /dev/null +++ b/skills/multi-agent-sequential-workflow/examples.md @@ -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 +``` diff --git a/skills/multi-agent-sequential-workflow/metadata.json b/skills/multi-agent-sequential-workflow/metadata.json new file mode 100644 index 0000000..5128937 --- /dev/null +++ b/skills/multi-agent-sequential-workflow/metadata.json @@ -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 +} \ No newline at end of file diff --git a/skills/multi-agent-sequential-workflow/tests.md b/skills/multi-agent-sequential-workflow/tests.md new file mode 100644 index 0000000..16dc7cc --- /dev/null +++ b/skills/multi-agent-sequential-workflow/tests.md @@ -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 diff --git a/skills/research-pipeline/SKILL.md b/skills/research-pipeline/SKILL.md new file mode 100644 index 0000000..dc3cf29 --- /dev/null +++ b/skills/research-pipeline/SKILL.md @@ -0,0 +1,90 @@ +--- +name: research-pipeline +version: 1.0.0 +description: Fetch a Wikipedia page, summarise its content 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` 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()`.' +- '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: Connect nodes with edges: `url.out(''value'') >> fetcher.inp(''url''); + fetcher.out(''text'') >> summarise.inp(''prompt''); summarise.out(''text'') >> writer.inp(''text'')`' +- 'Step 6: Cook the graph to execute and get output: `result = g.cook(writer, ''path''); + print(f''Summary written to: {result}'')`' +outputs: +- Path of 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 its content 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 +1. Install required dependencies: `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` and `blacknode`: Run `from _bootstrap import NIM_MODEL, require_nim_api_key; import blacknode as bn` +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: Initialize `g = bn.Graph()`. +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: 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: Cook the graph to execute and get output: `result = g.cook(writer, 'path'); print(f'Summary written to: {result}')` + +## Implementation Details + +```python +from _bootstrap import NIM_MODEL, require_nim_api_key; import blacknode as bn +``` + +```python +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') +``` + +## Inputs + +- URL of the Wikipedia page + +## Outputs + +- Path of the summary file + +## Failure Modes + +- If the URL is invalid or unreachable, the HTTPGet node will fail; if the summarisation fails, the output text might be empty + +## Source + +Extracted from: [https://github.com/temiroff/Blacknode.git](https://github.com/temiroff/Blacknode.git) +Confidence: 0.95 diff --git a/skills/research-pipeline/commands.md b/skills/research-pipeline/commands.md new file mode 100644 index 0000000..e33ab75 --- /dev/null +++ b/skills/research-pipeline/commands.md @@ -0,0 +1,6 @@ +# Commands: research-pipeline + +## Available Commands + +- `/skill research-pipeline` — Load this skill +- `/run research-pipeline` — Execute workflow diff --git a/skills/research-pipeline/examples.md b/skills/research-pipeline/examples.md new file mode 100644 index 0000000..e78b24c --- /dev/null +++ b/skills/research-pipeline/examples.md @@ -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` 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 of the summary file +``` diff --git a/skills/research-pipeline/metadata.json b/skills/research-pipeline/metadata.json new file mode 100644 index 0000000..8dffb85 --- /dev/null +++ b/skills/research-pipeline/metadata.json @@ -0,0 +1,26 @@ +{ + "name": "research-pipeline", + "version": "1.0.0", + "goal": "Fetch a Wikipedia page, summarise its content 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` 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()`.", + "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: Connect nodes with edges: `url.out('value') >> fetcher.inp('url'); fetcher.out('text') >> summarise.inp('prompt'); summarise.out('text') >> writer.inp('text')`", + "Step 6: Cook the graph to execute and get output: `result = g.cook(writer, 'path'); print(f'Summary written to: {result}')`" + ], + "outputs": [ + "Path of the summary file" + ], + "failure_modes": [ + "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, + "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", + "score": 1.0 +} \ No newline at end of file diff --git a/skills/research-pipeline/tests.md b/skills/research-pipeline/tests.md new file mode 100644 index 0000000..f24dab4 --- /dev/null +++ b/skills/research-pipeline/tests.md @@ -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 diff --git a/skills/unifai-workflow-execution/SKILL.md b/skills/unifai-workflow-execution/SKILL.md new file mode 100644 index 0000000..42e7218 --- /dev/null +++ b/skills/unifai-workflow-execution/SKILL.md @@ -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 diff --git a/skills/unifai-workflow-execution/commands.md b/skills/unifai-workflow-execution/commands.md new file mode 100644 index 0000000..7f42284 --- /dev/null +++ b/skills/unifai-workflow-execution/commands.md @@ -0,0 +1,6 @@ +# Commands: unifai-workflow-execution + +## Available Commands + +- `/skill unifai-workflow-execution` — Load this skill +- `/run unifai-workflow-execution` — Execute workflow diff --git a/skills/unifai-workflow-execution/examples.md b/skills/unifai-workflow-execution/examples.md new file mode 100644 index 0000000..34f1cbf --- /dev/null +++ b/skills/unifai-workflow-execution/examples.md @@ -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 +``` diff --git a/skills/unifai-workflow-execution/metadata.json b/skills/unifai-workflow-execution/metadata.json new file mode 100644 index 0000000..4d4a57e --- /dev/null +++ b/skills/unifai-workflow-execution/metadata.json @@ -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 +} \ No newline at end of file diff --git a/skills/unifai-workflow-execution/tests.md b/skills/unifai-workflow-execution/tests.md new file mode 100644 index 0000000..2d12683 --- /dev/null +++ b/skills/unifai-workflow-execution/tests.md @@ -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