agent-recipes 0.0.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agent_recipes/__init__.py +27 -0
- agent_recipes/recipe_runtime/__init__.py +28 -0
- agent_recipes/recipe_runtime/core.py +385 -0
- agent_recipes/templates/ai-ab-hook-tester/recipe.yaml +45 -0
- agent_recipes/templates/ai-ab-hook-tester/tools.py +169 -0
- agent_recipes/templates/ai-angle-generator/recipe.yaml +49 -0
- agent_recipes/templates/ai-angle-generator/tools.py +182 -0
- agent_recipes/templates/ai-api-doc-generator/README.md +59 -0
- agent_recipes/templates/ai-api-doc-generator/TEMPLATE.yaml +29 -0
- agent_recipes/templates/ai-api-tester/README.md +60 -0
- agent_recipes/templates/ai-api-tester/TEMPLATE.yaml +29 -0
- agent_recipes/templates/ai-audio-enhancer/README.md +59 -0
- agent_recipes/templates/ai-audio-enhancer/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-audio-normalizer/README.md +13 -0
- agent_recipes/templates/ai-audio-normalizer/TEMPLATE.yaml +44 -0
- agent_recipes/templates/ai-audio-splitter/README.md +14 -0
- agent_recipes/templates/ai-audio-splitter/TEMPLATE.yaml +47 -0
- agent_recipes/templates/ai-background-music-generator/README.md +59 -0
- agent_recipes/templates/ai-background-music-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-background-remover/README.md +60 -0
- agent_recipes/templates/ai-background-remover/TEMPLATE.yaml +27 -0
- agent_recipes/templates/ai-barcode-scanner/README.md +60 -0
- agent_recipes/templates/ai-barcode-scanner/TEMPLATE.yaml +26 -0
- agent_recipes/templates/ai-blog-generator/README.md +59 -0
- agent_recipes/templates/ai-blog-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-brief-generator/recipe.yaml +52 -0
- agent_recipes/templates/ai-brief-generator/tools.py +231 -0
- agent_recipes/templates/ai-broll-builder/recipe.yaml +47 -0
- agent_recipes/templates/ai-broll-builder/tools.py +204 -0
- agent_recipes/templates/ai-calendar-scheduler/README.md +60 -0
- agent_recipes/templates/ai-calendar-scheduler/TEMPLATE.yaml +29 -0
- agent_recipes/templates/ai-changelog-generator/README.md +14 -0
- agent_recipes/templates/ai-changelog-generator/TEMPLATE.yaml +46 -0
- agent_recipes/templates/ai-chart-generator/README.md +61 -0
- agent_recipes/templates/ai-chart-generator/TEMPLATE.yaml +32 -0
- agent_recipes/templates/ai-code-documenter/README.md +12 -0
- agent_recipes/templates/ai-code-documenter/TEMPLATE.yaml +37 -0
- agent_recipes/templates/ai-code-refactorer/README.md +59 -0
- agent_recipes/templates/ai-code-refactorer/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-code-reviewer/README.md +59 -0
- agent_recipes/templates/ai-code-reviewer/TEMPLATE.yaml +31 -0
- agent_recipes/templates/ai-color-palette-extractor/README.md +60 -0
- agent_recipes/templates/ai-color-palette-extractor/TEMPLATE.yaml +27 -0
- agent_recipes/templates/ai-comment-miner/recipe.yaml +40 -0
- agent_recipes/templates/ai-comment-miner/tools.py +141 -0
- agent_recipes/templates/ai-commit-message-generator/README.md +59 -0
- agent_recipes/templates/ai-commit-message-generator/TEMPLATE.yaml +31 -0
- agent_recipes/templates/ai-content-calendar/recipe.yaml +43 -0
- agent_recipes/templates/ai-content-calendar/tools.py +170 -0
- agent_recipes/templates/ai-context-enricher/recipe.yaml +48 -0
- agent_recipes/templates/ai-context-enricher/tools.py +258 -0
- agent_recipes/templates/ai-contract-analyzer/README.md +60 -0
- agent_recipes/templates/ai-contract-analyzer/TEMPLATE.yaml +34 -0
- agent_recipes/templates/ai-csv-cleaner/README.md +13 -0
- agent_recipes/templates/ai-csv-cleaner/TEMPLATE.yaml +45 -0
- agent_recipes/templates/ai-cta-generator/recipe.yaml +54 -0
- agent_recipes/templates/ai-cta-generator/tools.py +174 -0
- agent_recipes/templates/ai-daily-news-show/recipe.yaml +103 -0
- agent_recipes/templates/ai-daily-news-show/tools.py +308 -0
- agent_recipes/templates/ai-data-anonymizer/README.md +60 -0
- agent_recipes/templates/ai-data-anonymizer/TEMPLATE.yaml +31 -0
- agent_recipes/templates/ai-data-profiler/README.md +14 -0
- agent_recipes/templates/ai-data-profiler/TEMPLATE.yaml +42 -0
- agent_recipes/templates/ai-dependency-auditor/README.md +12 -0
- agent_recipes/templates/ai-dependency-auditor/TEMPLATE.yaml +37 -0
- agent_recipes/templates/ai-doc-translator/README.md +12 -0
- agent_recipes/templates/ai-doc-translator/TEMPLATE.yaml +41 -0
- agent_recipes/templates/ai-duplicate-finder/README.md +59 -0
- agent_recipes/templates/ai-duplicate-finder/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-ebook-converter/README.md +60 -0
- agent_recipes/templates/ai-ebook-converter/TEMPLATE.yaml +27 -0
- agent_recipes/templates/ai-email-parser/README.md +59 -0
- agent_recipes/templates/ai-email-parser/TEMPLATE.yaml +29 -0
- agent_recipes/templates/ai-etl-pipeline/README.md +60 -0
- agent_recipes/templates/ai-etl-pipeline/TEMPLATE.yaml +30 -0
- agent_recipes/templates/ai-excel-formula-generator/README.md +59 -0
- agent_recipes/templates/ai-excel-formula-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-face-blur/README.md +60 -0
- agent_recipes/templates/ai-face-blur/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-fact-checker/recipe.yaml +52 -0
- agent_recipes/templates/ai-fact-checker/tools.py +279 -0
- agent_recipes/templates/ai-faq-generator/README.md +59 -0
- agent_recipes/templates/ai-faq-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-file-organizer/README.md +59 -0
- agent_recipes/templates/ai-file-organizer/TEMPLATE.yaml +29 -0
- agent_recipes/templates/ai-folder-packager/README.md +15 -0
- agent_recipes/templates/ai-folder-packager/TEMPLATE.yaml +48 -0
- agent_recipes/templates/ai-form-filler/README.md +60 -0
- agent_recipes/templates/ai-form-filler/TEMPLATE.yaml +30 -0
- agent_recipes/templates/ai-hashtag-optimizer/recipe.yaml +45 -0
- agent_recipes/templates/ai-hashtag-optimizer/tools.py +134 -0
- agent_recipes/templates/ai-hook-generator/recipe.yaml +50 -0
- agent_recipes/templates/ai-hook-generator/tools.py +177 -0
- agent_recipes/templates/ai-image-captioner/README.md +59 -0
- agent_recipes/templates/ai-image-captioner/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-image-cataloger/README.md +13 -0
- agent_recipes/templates/ai-image-cataloger/TEMPLATE.yaml +39 -0
- agent_recipes/templates/ai-image-optimizer/README.md +13 -0
- agent_recipes/templates/ai-image-optimizer/TEMPLATE.yaml +43 -0
- agent_recipes/templates/ai-image-resizer/README.md +12 -0
- agent_recipes/templates/ai-image-resizer/TEMPLATE.yaml +39 -0
- agent_recipes/templates/ai-image-tagger/README.md +59 -0
- agent_recipes/templates/ai-image-tagger/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-image-upscaler/README.md +60 -0
- agent_recipes/templates/ai-image-upscaler/TEMPLATE.yaml +27 -0
- agent_recipes/templates/ai-invoice-processor/README.md +60 -0
- agent_recipes/templates/ai-invoice-processor/TEMPLATE.yaml +34 -0
- agent_recipes/templates/ai-json-to-csv/README.md +12 -0
- agent_recipes/templates/ai-json-to-csv/TEMPLATE.yaml +36 -0
- agent_recipes/templates/ai-log-analyzer/README.md +59 -0
- agent_recipes/templates/ai-log-analyzer/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-markdown-to-pdf/README.md +12 -0
- agent_recipes/templates/ai-markdown-to-pdf/TEMPLATE.yaml +40 -0
- agent_recipes/templates/ai-meeting-summarizer/README.md +59 -0
- agent_recipes/templates/ai-meeting-summarizer/TEMPLATE.yaml +32 -0
- agent_recipes/templates/ai-meta-tag-generator/README.md +59 -0
- agent_recipes/templates/ai-meta-tag-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-news-capture-pack/recipe.yaml +42 -0
- agent_recipes/templates/ai-news-capture-pack/tools.py +150 -0
- agent_recipes/templates/ai-news-crawler/recipe.yaml +99 -0
- agent_recipes/templates/ai-news-crawler/tools.py +417 -0
- agent_recipes/templates/ai-news-deduper/recipe.yaml +47 -0
- agent_recipes/templates/ai-news-deduper/tools.py +235 -0
- agent_recipes/templates/ai-newsletter-generator/README.md +59 -0
- agent_recipes/templates/ai-newsletter-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-note-summarizer/README.md +59 -0
- agent_recipes/templates/ai-note-summarizer/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-pdf-summarizer/README.md +12 -0
- agent_recipes/templates/ai-pdf-summarizer/TEMPLATE.yaml +40 -0
- agent_recipes/templates/ai-pdf-to-markdown/README.md +19 -0
- agent_recipes/templates/ai-pdf-to-markdown/TEMPLATE.yaml +63 -0
- agent_recipes/templates/ai-performance-analyzer/recipe.yaml +45 -0
- agent_recipes/templates/ai-performance-analyzer/tools.py +159 -0
- agent_recipes/templates/ai-podcast-cleaner/README.md +117 -0
- agent_recipes/templates/ai-podcast-cleaner/TEMPLATE.yaml +117 -0
- agent_recipes/templates/ai-podcast-cleaner/agents.yaml +59 -0
- agent_recipes/templates/ai-podcast-cleaner/workflow.yaml +77 -0
- agent_recipes/templates/ai-podcast-transcriber/README.md +59 -0
- agent_recipes/templates/ai-podcast-transcriber/TEMPLATE.yaml +32 -0
- agent_recipes/templates/ai-post-copy-generator/recipe.yaml +41 -0
- agent_recipes/templates/ai-post-copy-generator/tools.py +105 -0
- agent_recipes/templates/ai-product-description-generator/README.md +59 -0
- agent_recipes/templates/ai-product-description-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-publisher-pack/recipe.yaml +44 -0
- agent_recipes/templates/ai-publisher-pack/tools.py +252 -0
- agent_recipes/templates/ai-qr-code-generator/README.md +60 -0
- agent_recipes/templates/ai-qr-code-generator/TEMPLATE.yaml +26 -0
- agent_recipes/templates/ai-regex-generator/README.md +59 -0
- agent_recipes/templates/ai-regex-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-repo-readme/README.md +13 -0
- agent_recipes/templates/ai-repo-readme/TEMPLATE.yaml +42 -0
- agent_recipes/templates/ai-report-generator/README.md +61 -0
- agent_recipes/templates/ai-report-generator/TEMPLATE.yaml +32 -0
- agent_recipes/templates/ai-resume-parser/README.md +60 -0
- agent_recipes/templates/ai-resume-parser/TEMPLATE.yaml +33 -0
- agent_recipes/templates/ai-rss-aggregator/README.md +60 -0
- agent_recipes/templates/ai-rss-aggregator/TEMPLATE.yaml +30 -0
- agent_recipes/templates/ai-schema-generator/README.md +12 -0
- agent_recipes/templates/ai-schema-generator/TEMPLATE.yaml +34 -0
- agent_recipes/templates/ai-screen-recorder/recipe.yaml +43 -0
- agent_recipes/templates/ai-screen-recorder/tools.py +184 -0
- agent_recipes/templates/ai-screenshot-capture/recipe.yaml +45 -0
- agent_recipes/templates/ai-screenshot-capture/tools.py +231 -0
- agent_recipes/templates/ai-screenshot-ocr/README.md +12 -0
- agent_recipes/templates/ai-screenshot-ocr/TEMPLATE.yaml +37 -0
- agent_recipes/templates/ai-script-writer/recipe.yaml +58 -0
- agent_recipes/templates/ai-script-writer/tools.py +297 -0
- agent_recipes/templates/ai-sentiment-analyzer/README.md +59 -0
- agent_recipes/templates/ai-sentiment-analyzer/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-seo-optimizer/README.md +59 -0
- agent_recipes/templates/ai-seo-optimizer/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-signal-ranker/recipe.yaml +54 -0
- agent_recipes/templates/ai-signal-ranker/tools.py +256 -0
- agent_recipes/templates/ai-sitemap-generator/README.md +59 -0
- agent_recipes/templates/ai-sitemap-generator/TEMPLATE.yaml +26 -0
- agent_recipes/templates/ai-sitemap-scraper/README.md +13 -0
- agent_recipes/templates/ai-sitemap-scraper/TEMPLATE.yaml +41 -0
- agent_recipes/templates/ai-slide-generator/README.md +60 -0
- agent_recipes/templates/ai-slide-generator/TEMPLATE.yaml +29 -0
- agent_recipes/templates/ai-slide-to-notes/README.md +12 -0
- agent_recipes/templates/ai-slide-to-notes/TEMPLATE.yaml +37 -0
- agent_recipes/templates/ai-social-media-generator/README.md +59 -0
- agent_recipes/templates/ai-social-media-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-sql-generator/README.md +59 -0
- agent_recipes/templates/ai-sql-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-subtitle-generator/README.md +59 -0
- agent_recipes/templates/ai-subtitle-generator/TEMPLATE.yaml +31 -0
- agent_recipes/templates/ai-test-generator/README.md +59 -0
- agent_recipes/templates/ai-test-generator/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-translation-batch/README.md +59 -0
- agent_recipes/templates/ai-translation-batch/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-url-to-markdown/README.md +14 -0
- agent_recipes/templates/ai-url-to-markdown/TEMPLATE.yaml +44 -0
- agent_recipes/templates/ai-video-chapter-generator/README.md +59 -0
- agent_recipes/templates/ai-video-chapter-generator/TEMPLATE.yaml +32 -0
- agent_recipes/templates/ai-video-compressor/README.md +59 -0
- agent_recipes/templates/ai-video-compressor/TEMPLATE.yaml +28 -0
- agent_recipes/templates/ai-video-editor/README.md +254 -0
- agent_recipes/templates/ai-video-editor/TEMPLATE.yaml +139 -0
- agent_recipes/templates/ai-video-editor/agents.yaml +36 -0
- agent_recipes/templates/ai-video-editor/requirements.txt +8 -0
- agent_recipes/templates/ai-video-editor/scripts/run.sh +10 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__init__.py +45 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__main__.py +8 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/__init__.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/cli.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/config.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/ffmpeg_probe.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/heuristics.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/llm_plan.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/models.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/pipeline.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/render.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/timeline.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/transcribe.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/__pycache__/utils.cpython-312.pyc +0 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/cli.py +343 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/config.py +102 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/ffmpeg_probe.py +92 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/heuristics.py +119 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/llm_plan.py +277 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/models.py +343 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/pipeline.py +287 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/render.py +274 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/timeline.py +278 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/transcribe.py +233 -0
- agent_recipes/templates/ai-video-editor/src/ai_video_editor/utils.py +222 -0
- agent_recipes/templates/ai-video-editor/src/input.mov +0 -0
- agent_recipes/templates/ai-video-editor/src/out.mp4 +0 -0
- agent_recipes/templates/ai-video-editor/tests/test_heuristics.py +130 -0
- agent_recipes/templates/ai-video-editor/tests/test_models.py +152 -0
- agent_recipes/templates/ai-video-editor/tests/test_timeline.py +105 -0
- agent_recipes/templates/ai-video-editor/workflow.yaml +51 -0
- agent_recipes/templates/ai-video-highlight-extractor/README.md +60 -0
- agent_recipes/templates/ai-video-highlight-extractor/TEMPLATE.yaml +33 -0
- agent_recipes/templates/ai-video-merger/recipe.yaml +40 -0
- agent_recipes/templates/ai-video-merger/tools.py +172 -0
- agent_recipes/templates/ai-video-thumbnails/README.md +16 -0
- agent_recipes/templates/ai-video-thumbnails/TEMPLATE.yaml +53 -0
- agent_recipes/templates/ai-video-to-gif/README.md +14 -0
- agent_recipes/templates/ai-video-to-gif/TEMPLATE.yaml +64 -0
- agent_recipes/templates/ai-voice-cloner/README.md +59 -0
- agent_recipes/templates/ai-voice-cloner/TEMPLATE.yaml +31 -0
- agent_recipes/templates/ai-voiceover-generator/recipe.yaml +41 -0
- agent_recipes/templates/ai-voiceover-generator/tools.py +194 -0
- agent_recipes/templates/ai-watermark-adder/README.md +59 -0
- agent_recipes/templates/ai-watermark-adder/TEMPLATE.yaml +26 -0
- agent_recipes/templates/ai-watermark-remover/README.md +60 -0
- agent_recipes/templates/ai-watermark-remover/TEMPLATE.yaml +32 -0
- agent_recipes/templates/data-transformer/README.md +75 -0
- agent_recipes/templates/data-transformer/TEMPLATE.yaml +63 -0
- agent_recipes/templates/data-transformer/agents.yaml +70 -0
- agent_recipes/templates/data-transformer/workflow.yaml +92 -0
- agent_recipes/templates/shorts-generator/README.md +61 -0
- agent_recipes/templates/shorts-generator/TEMPLATE.yaml +65 -0
- agent_recipes/templates/shorts-generator/agents.yaml +66 -0
- agent_recipes/templates/shorts-generator/workflow.yaml +86 -0
- agent_recipes/templates/transcript-generator/README.md +103 -0
- agent_recipes/templates/transcript-generator/TEMPLATE.yaml +57 -0
- agent_recipes/templates/transcript-generator/agents.yaml +62 -0
- agent_recipes/templates/transcript-generator/workflow.yaml +82 -0
- agent_recipes/templates/video-editor/README.md +70 -0
- agent_recipes/templates/video-editor/TEMPLATE.yaml +55 -0
- agent_recipes/templates/video-editor/agents.yaml +68 -0
- agent_recipes/templates/video-editor/workflow.yaml +92 -0
- agent_recipes-0.0.5.dist-info/METADATA +145 -0
- agent_recipes-0.0.5.dist-info/RECORD +269 -0
- agent_recipes-0.0.5.dist-info/WHEEL +5 -0
- agent_recipes-0.0.5.dist-info/top_level.txt +1 -0
- /236/326/177nE/243/231/214/232/265/322m/201/253/353/022C/372/321/266/b/225^=/272/017t/262/3337/310@/315wb/341pB/277z/216/330/314/004/265B/213/375/236/203/026/373/307/354z41/347#/374q/262/22589/032/276 /277/244Vh/322/017/004/224/215/004/367/377/375/335/n +0 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: ai-news-deduper
|
|
2
|
+
version: 1.0.0
|
|
3
|
+
description: Deduplicate news articles and cluster them by topic using semantic similarity
|
|
4
|
+
author: PraisonAI
|
|
5
|
+
tags:
|
|
6
|
+
- news
|
|
7
|
+
- deduplication
|
|
8
|
+
- clustering
|
|
9
|
+
- nlp
|
|
10
|
+
|
|
11
|
+
config:
|
|
12
|
+
similarity_threshold: 0.85
|
|
13
|
+
min_cluster_size: 2
|
|
14
|
+
clustering_method: semantic
|
|
15
|
+
output_format: json
|
|
16
|
+
|
|
17
|
+
input:
|
|
18
|
+
type: object
|
|
19
|
+
properties:
|
|
20
|
+
articles:
|
|
21
|
+
type: array
|
|
22
|
+
description: List of articles to deduplicate and cluster
|
|
23
|
+
|
|
24
|
+
output:
|
|
25
|
+
type: object
|
|
26
|
+
properties:
|
|
27
|
+
deduplicated_articles:
|
|
28
|
+
type: array
|
|
29
|
+
clusters:
|
|
30
|
+
type: array
|
|
31
|
+
stats:
|
|
32
|
+
type: object
|
|
33
|
+
|
|
34
|
+
requires:
|
|
35
|
+
env:
|
|
36
|
+
- OPENAI_API_KEY
|
|
37
|
+
packages:
|
|
38
|
+
- numpy
|
|
39
|
+
|
|
40
|
+
workflow:
|
|
41
|
+
agents:
|
|
42
|
+
- name: deduper
|
|
43
|
+
role: Content Deduplicator
|
|
44
|
+
goal: Remove duplicate articles and group similar content
|
|
45
|
+
tools:
|
|
46
|
+
- deduplicate_articles
|
|
47
|
+
- cluster_by_topic
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AI News Deduper Tools
|
|
3
|
+
|
|
4
|
+
Tools for deduplicating and clustering news articles:
|
|
5
|
+
- Semantic similarity detection
|
|
6
|
+
- Topic clustering
|
|
7
|
+
- Duplicate removal
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import logging
|
|
12
|
+
import os
|
|
13
|
+
from typing import Any, Dict, List, Optional
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_text_hash(text: str) -> str:
|
|
19
|
+
"""Generate a hash for text content."""
|
|
20
|
+
return hashlib.md5(text.lower().strip().encode()).hexdigest()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def get_embedding(text: str) -> List[float]:
|
|
24
|
+
"""Get embedding for text using OpenAI API."""
|
|
25
|
+
api_key = os.environ.get("OPENAI_API_KEY")
|
|
26
|
+
if not api_key:
|
|
27
|
+
raise ValueError("OPENAI_API_KEY not set")
|
|
28
|
+
|
|
29
|
+
import requests
|
|
30
|
+
|
|
31
|
+
response = requests.post(
|
|
32
|
+
"https://api.openai.com/v1/embeddings",
|
|
33
|
+
headers={
|
|
34
|
+
"Authorization": f"Bearer {api_key}",
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
},
|
|
37
|
+
json={
|
|
38
|
+
"model": "text-embedding-3-small",
|
|
39
|
+
"input": text[:8000],
|
|
40
|
+
},
|
|
41
|
+
timeout=30,
|
|
42
|
+
)
|
|
43
|
+
response.raise_for_status()
|
|
44
|
+
return response.json()["data"][0]["embedding"]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def cosine_similarity(a: List[float], b: List[float]) -> float:
|
|
48
|
+
"""Calculate cosine similarity between two vectors."""
|
|
49
|
+
import math
|
|
50
|
+
dot_product = sum(x * y for x, y in zip(a, b))
|
|
51
|
+
norm_a = math.sqrt(sum(x * x for x in a))
|
|
52
|
+
norm_b = math.sqrt(sum(x * x for x in b))
|
|
53
|
+
if norm_a == 0 or norm_b == 0:
|
|
54
|
+
return 0.0
|
|
55
|
+
return dot_product / (norm_a * norm_b)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def deduplicate_articles(
|
|
59
|
+
articles: List[Dict[str, Any]],
|
|
60
|
+
similarity_threshold: float = 0.85,
|
|
61
|
+
use_semantic: bool = True,
|
|
62
|
+
) -> Dict[str, Any]:
|
|
63
|
+
"""
|
|
64
|
+
Deduplicate articles based on title and content similarity.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
articles: List of article dictionaries
|
|
68
|
+
similarity_threshold: Threshold for considering articles as duplicates
|
|
69
|
+
use_semantic: Use semantic similarity (requires API) or hash-based
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Dictionary with deduplicated articles and stats
|
|
73
|
+
"""
|
|
74
|
+
if not articles:
|
|
75
|
+
return {"deduplicated": [], "removed": 0, "stats": {}}
|
|
76
|
+
|
|
77
|
+
seen_hashes = set()
|
|
78
|
+
deduplicated = []
|
|
79
|
+
removed_count = 0
|
|
80
|
+
|
|
81
|
+
if use_semantic:
|
|
82
|
+
# Get embeddings for all articles
|
|
83
|
+
embeddings = []
|
|
84
|
+
for article in articles:
|
|
85
|
+
text = f"{article.get('title', '')} {article.get('content', '')[:500]}"
|
|
86
|
+
try:
|
|
87
|
+
embedding = get_embedding(text)
|
|
88
|
+
embeddings.append(embedding)
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.warning(f"Error getting embedding: {e}")
|
|
91
|
+
embeddings.append(None)
|
|
92
|
+
|
|
93
|
+
# Check for duplicates using cosine similarity
|
|
94
|
+
for i, article in enumerate(articles):
|
|
95
|
+
is_duplicate = False
|
|
96
|
+
|
|
97
|
+
if embeddings[i] is not None:
|
|
98
|
+
for j in range(len(deduplicated)):
|
|
99
|
+
if embeddings[j] is not None:
|
|
100
|
+
sim = cosine_similarity(embeddings[i], embeddings[j])
|
|
101
|
+
if sim >= similarity_threshold:
|
|
102
|
+
is_duplicate = True
|
|
103
|
+
break
|
|
104
|
+
|
|
105
|
+
if not is_duplicate:
|
|
106
|
+
deduplicated.append(article)
|
|
107
|
+
else:
|
|
108
|
+
removed_count += 1
|
|
109
|
+
else:
|
|
110
|
+
# Hash-based deduplication
|
|
111
|
+
for article in articles:
|
|
112
|
+
title_hash = get_text_hash(article.get("title", ""))
|
|
113
|
+
if title_hash not in seen_hashes:
|
|
114
|
+
seen_hashes.add(title_hash)
|
|
115
|
+
deduplicated.append(article)
|
|
116
|
+
else:
|
|
117
|
+
removed_count += 1
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
"deduplicated": deduplicated,
|
|
121
|
+
"removed": removed_count,
|
|
122
|
+
"stats": {
|
|
123
|
+
"original_count": len(articles),
|
|
124
|
+
"final_count": len(deduplicated),
|
|
125
|
+
"duplicate_rate": removed_count / len(articles) if articles else 0,
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def cluster_by_topic(
|
|
131
|
+
articles: List[Dict[str, Any]],
|
|
132
|
+
min_cluster_size: int = 2,
|
|
133
|
+
num_clusters: Optional[int] = None,
|
|
134
|
+
) -> Dict[str, Any]:
|
|
135
|
+
"""
|
|
136
|
+
Cluster articles by topic using semantic similarity.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
articles: List of article dictionaries
|
|
140
|
+
min_cluster_size: Minimum articles per cluster
|
|
141
|
+
num_clusters: Number of clusters (auto-detected if None)
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
Dictionary with clusters and unclustered articles
|
|
145
|
+
"""
|
|
146
|
+
if len(articles) < 2:
|
|
147
|
+
return {"clusters": [], "unclustered": articles}
|
|
148
|
+
|
|
149
|
+
# Get embeddings
|
|
150
|
+
embeddings = []
|
|
151
|
+
valid_articles = []
|
|
152
|
+
|
|
153
|
+
for article in articles:
|
|
154
|
+
text = f"{article.get('title', '')} {article.get('content', '')[:500]}"
|
|
155
|
+
try:
|
|
156
|
+
embedding = get_embedding(text)
|
|
157
|
+
embeddings.append(embedding)
|
|
158
|
+
valid_articles.append(article)
|
|
159
|
+
except Exception as e:
|
|
160
|
+
logger.warning(f"Error getting embedding: {e}")
|
|
161
|
+
|
|
162
|
+
if len(embeddings) < 2:
|
|
163
|
+
return {"clusters": [], "unclustered": articles}
|
|
164
|
+
|
|
165
|
+
# Simple clustering: group articles with high similarity
|
|
166
|
+
clusters = []
|
|
167
|
+
used = set()
|
|
168
|
+
|
|
169
|
+
for i in range(len(valid_articles)):
|
|
170
|
+
if i in used:
|
|
171
|
+
continue
|
|
172
|
+
|
|
173
|
+
cluster = [valid_articles[i]]
|
|
174
|
+
used.add(i)
|
|
175
|
+
|
|
176
|
+
for j in range(i + 1, len(valid_articles)):
|
|
177
|
+
if j in used:
|
|
178
|
+
continue
|
|
179
|
+
|
|
180
|
+
sim = cosine_similarity(embeddings[i], embeddings[j])
|
|
181
|
+
if sim >= 0.7: # Cluster threshold
|
|
182
|
+
cluster.append(valid_articles[j])
|
|
183
|
+
used.add(j)
|
|
184
|
+
|
|
185
|
+
if len(cluster) >= min_cluster_size:
|
|
186
|
+
# Generate cluster topic from titles
|
|
187
|
+
titles = [a.get("title", "") for a in cluster]
|
|
188
|
+
clusters.append({
|
|
189
|
+
"topic": _extract_common_topic(titles),
|
|
190
|
+
"articles": cluster,
|
|
191
|
+
"size": len(cluster),
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
# Collect unclustered articles
|
|
195
|
+
unclustered = [a for i, a in enumerate(valid_articles) if i not in used]
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
"clusters": clusters,
|
|
199
|
+
"unclustered": unclustered,
|
|
200
|
+
"stats": {
|
|
201
|
+
"num_clusters": len(clusters),
|
|
202
|
+
"clustered_articles": sum(c["size"] for c in clusters),
|
|
203
|
+
"unclustered_articles": len(unclustered),
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _extract_common_topic(titles: List[str]) -> str:
|
|
209
|
+
"""Extract common topic from a list of titles."""
|
|
210
|
+
if not titles:
|
|
211
|
+
return "Unknown Topic"
|
|
212
|
+
|
|
213
|
+
# Simple approach: find common words
|
|
214
|
+
word_counts = {}
|
|
215
|
+
stop_words = {"the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
|
|
216
|
+
"have", "has", "had", "do", "does", "did", "will", "would", "could",
|
|
217
|
+
"should", "may", "might", "must", "shall", "can", "to", "of", "in",
|
|
218
|
+
"for", "on", "with", "at", "by", "from", "as", "into", "through",
|
|
219
|
+
"and", "or", "but", "if", "then", "else", "when", "where", "why",
|
|
220
|
+
"how", "all", "each", "every", "both", "few", "more", "most", "other",
|
|
221
|
+
"some", "such", "no", "nor", "not", "only", "own", "same", "so",
|
|
222
|
+
"than", "too", "very", "just", "also", "now", "new", "first", "last"}
|
|
223
|
+
|
|
224
|
+
for title in titles:
|
|
225
|
+
words = title.lower().split()
|
|
226
|
+
for word in words:
|
|
227
|
+
word = word.strip(".,!?:;\"'()[]{}").lower()
|
|
228
|
+
if len(word) > 2 and word not in stop_words:
|
|
229
|
+
word_counts[word] = word_counts.get(word, 0) + 1
|
|
230
|
+
|
|
231
|
+
# Get top words
|
|
232
|
+
sorted_words = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)
|
|
233
|
+
top_words = [w[0].title() for w in sorted_words[:3]]
|
|
234
|
+
|
|
235
|
+
return " ".join(top_words) if top_words else "Mixed Topics"
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Newsletter Generator
|
|
2
|
+
|
|
3
|
+
Generate email newsletters from content
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install agent-recipes
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## CLI Usage
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Basic usage
|
|
15
|
+
praison recipes run ai-newsletter-generator <input>
|
|
16
|
+
|
|
17
|
+
# With output directory
|
|
18
|
+
praison recipes run ai-newsletter-generator <input> --output ./output/
|
|
19
|
+
|
|
20
|
+
# Dry run (check dependencies only)
|
|
21
|
+
praison recipes run ai-newsletter-generator <input> --dry-run
|
|
22
|
+
|
|
23
|
+
# Show recipe info
|
|
24
|
+
praison recipes info ai-newsletter-generator
|
|
25
|
+
|
|
26
|
+
# Check dependencies
|
|
27
|
+
praison recipes doctor ai-newsletter-generator
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Python Usage
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
from praisonaiagents import Agent
|
|
34
|
+
from agent_recipes import load_recipe
|
|
35
|
+
|
|
36
|
+
# Load and run recipe
|
|
37
|
+
recipe = load_recipe("ai-newsletter-generator")
|
|
38
|
+
result = recipe.run(input="<your-input>")
|
|
39
|
+
print(result)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Requirements
|
|
43
|
+
|
|
44
|
+
### Packages
|
|
45
|
+
- openai
|
|
46
|
+
|
|
47
|
+
### Environment Variables
|
|
48
|
+
- OPENAI_API_KEY
|
|
49
|
+
|
|
50
|
+
### External Tools
|
|
51
|
+
- None
|
|
52
|
+
|
|
53
|
+
## Tags
|
|
54
|
+
|
|
55
|
+
`web`, `newsletter`, `email`
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
Apache-2.0
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: ai-newsletter-generator
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Generate email newsletters from content
|
|
4
|
+
author: praison
|
|
5
|
+
license: Apache-2.0
|
|
6
|
+
tags:
|
|
7
|
+
- web
|
|
8
|
+
- newsletter
|
|
9
|
+
- email
|
|
10
|
+
|
|
11
|
+
requires:
|
|
12
|
+
tools:
|
|
13
|
+
- llm_tool
|
|
14
|
+
packages:
|
|
15
|
+
- openai
|
|
16
|
+
env:
|
|
17
|
+
- OPENAI_API_KEY
|
|
18
|
+
|
|
19
|
+
cli:
|
|
20
|
+
command: praison recipes run ai-newsletter-generator
|
|
21
|
+
examples:
|
|
22
|
+
- praison recipes run ai-newsletter-generator <input>
|
|
23
|
+
- praison recipes run ai-newsletter-generator <input> --output ./output/
|
|
24
|
+
- praison recipes run ai-newsletter-generator <input> --dry-run
|
|
25
|
+
|
|
26
|
+
safety:
|
|
27
|
+
dry_run_default: false
|
|
28
|
+
overwrites_files: true
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Note Summarizer
|
|
2
|
+
|
|
3
|
+
Summarize notes and documents
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install agent-recipes
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## CLI Usage
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Basic usage
|
|
15
|
+
praison recipes run ai-note-summarizer <input>
|
|
16
|
+
|
|
17
|
+
# With output directory
|
|
18
|
+
praison recipes run ai-note-summarizer <input> --output ./output/
|
|
19
|
+
|
|
20
|
+
# Dry run (check dependencies only)
|
|
21
|
+
praison recipes run ai-note-summarizer <input> --dry-run
|
|
22
|
+
|
|
23
|
+
# Show recipe info
|
|
24
|
+
praison recipes info ai-note-summarizer
|
|
25
|
+
|
|
26
|
+
# Check dependencies
|
|
27
|
+
praison recipes doctor ai-note-summarizer
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Python Usage
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
from praisonaiagents import Agent
|
|
34
|
+
from agent_recipes import load_recipe
|
|
35
|
+
|
|
36
|
+
# Load and run recipe
|
|
37
|
+
recipe = load_recipe("ai-note-summarizer")
|
|
38
|
+
result = recipe.run(input="<your-input>")
|
|
39
|
+
print(result)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Requirements
|
|
43
|
+
|
|
44
|
+
### Packages
|
|
45
|
+
- openai
|
|
46
|
+
|
|
47
|
+
### Environment Variables
|
|
48
|
+
- OPENAI_API_KEY
|
|
49
|
+
|
|
50
|
+
### External Tools
|
|
51
|
+
- None
|
|
52
|
+
|
|
53
|
+
## Tags
|
|
54
|
+
|
|
55
|
+
`productivity`, `notes`, `summary`
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
Apache-2.0
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: ai-note-summarizer
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Summarize notes and documents
|
|
4
|
+
author: praison
|
|
5
|
+
license: Apache-2.0
|
|
6
|
+
tags:
|
|
7
|
+
- productivity
|
|
8
|
+
- notes
|
|
9
|
+
- summary
|
|
10
|
+
|
|
11
|
+
requires:
|
|
12
|
+
tools:
|
|
13
|
+
- llm_tool
|
|
14
|
+
packages:
|
|
15
|
+
- openai
|
|
16
|
+
env:
|
|
17
|
+
- OPENAI_API_KEY
|
|
18
|
+
|
|
19
|
+
cli:
|
|
20
|
+
command: praison recipes run ai-note-summarizer
|
|
21
|
+
examples:
|
|
22
|
+
- praison recipes run ai-note-summarizer <input>
|
|
23
|
+
- praison recipes run ai-note-summarizer <input> --output ./output/
|
|
24
|
+
- praison recipes run ai-note-summarizer <input> --dry-run
|
|
25
|
+
|
|
26
|
+
safety:
|
|
27
|
+
dry_run_default: false
|
|
28
|
+
overwrites_files: true
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: ai-pdf-summarizer
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Summarize PDF documents with key points extraction.
|
|
4
|
+
author: praisonai
|
|
5
|
+
license: Apache-2.0
|
|
6
|
+
tags: [pdf, summary, extraction, analysis]
|
|
7
|
+
|
|
8
|
+
requires:
|
|
9
|
+
tools: [shell_tool]
|
|
10
|
+
packages: [praisonai-tools]
|
|
11
|
+
env: [OPENAI_API_KEY]
|
|
12
|
+
external:
|
|
13
|
+
- name: pdftotext
|
|
14
|
+
check: "pdftotext -v"
|
|
15
|
+
|
|
16
|
+
config:
|
|
17
|
+
input:
|
|
18
|
+
type: string
|
|
19
|
+
required: true
|
|
20
|
+
output:
|
|
21
|
+
type: string
|
|
22
|
+
|
|
23
|
+
cli:
|
|
24
|
+
command: ai-pdf-summarizer
|
|
25
|
+
args:
|
|
26
|
+
- name: input
|
|
27
|
+
positional: true
|
|
28
|
+
required: true
|
|
29
|
+
- name: --output
|
|
30
|
+
short: -o
|
|
31
|
+
examples:
|
|
32
|
+
- "praison run ai-pdf-summarizer document.pdf"
|
|
33
|
+
|
|
34
|
+
outputs:
|
|
35
|
+
- name: summary.md
|
|
36
|
+
type: file
|
|
37
|
+
- name: key-points.json
|
|
38
|
+
type: file
|
|
39
|
+
- name: run.json
|
|
40
|
+
type: file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# AI PDF to Markdown
|
|
2
|
+
|
|
3
|
+
Convert PDF documents to clean Markdown format with extracted images.
|
|
4
|
+
|
|
5
|
+
## Input/Output
|
|
6
|
+
- **Input**: PDF file
|
|
7
|
+
- **Output**: `document.md`, `images/`, `metadata.json`, `run.json`
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
- poppler-utils (pdftotext, pdfimages)
|
|
11
|
+
- OpenAI API Key (for AI cleanup)
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
```bash
|
|
15
|
+
praison run ai-pdf-to-markdown document.pdf
|
|
16
|
+
praison run ai-pdf-to-markdown document.pdf --output ./docs/
|
|
17
|
+
praison run ai-pdf-to-markdown document.pdf --ocr # For scanned PDFs
|
|
18
|
+
praison run ai-pdf-to-markdown document.pdf --no-images
|
|
19
|
+
```
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
name: ai-pdf-to-markdown
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: |
|
|
4
|
+
Convert PDF documents to clean Markdown format with extracted images.
|
|
5
|
+
Uses AI to clean up OCR artifacts and structure content properly.
|
|
6
|
+
|
|
7
|
+
author: praisonai
|
|
8
|
+
license: Apache-2.0
|
|
9
|
+
tags: [pdf, markdown, conversion, document, ocr]
|
|
10
|
+
|
|
11
|
+
requires:
|
|
12
|
+
tools: [shell_tool]
|
|
13
|
+
packages: [praisonai-tools]
|
|
14
|
+
env: [OPENAI_API_KEY]
|
|
15
|
+
external:
|
|
16
|
+
- name: pdftotext
|
|
17
|
+
check: "pdftotext -v"
|
|
18
|
+
install_hint: "brew install poppler (macOS) or apt install poppler-utils (Linux)"
|
|
19
|
+
|
|
20
|
+
config:
|
|
21
|
+
input:
|
|
22
|
+
type: string
|
|
23
|
+
required: true
|
|
24
|
+
description: Input PDF file path
|
|
25
|
+
output:
|
|
26
|
+
type: string
|
|
27
|
+
description: Output directory
|
|
28
|
+
extract_images:
|
|
29
|
+
type: boolean
|
|
30
|
+
default: true
|
|
31
|
+
use_ocr:
|
|
32
|
+
type: boolean
|
|
33
|
+
default: false
|
|
34
|
+
|
|
35
|
+
cli:
|
|
36
|
+
command: ai-pdf-to-markdown
|
|
37
|
+
args:
|
|
38
|
+
- name: input
|
|
39
|
+
positional: true
|
|
40
|
+
required: true
|
|
41
|
+
- name: --output
|
|
42
|
+
short: -o
|
|
43
|
+
- name: --no-images
|
|
44
|
+
flag: true
|
|
45
|
+
- name: --ocr
|
|
46
|
+
flag: true
|
|
47
|
+
- name: --dry-run
|
|
48
|
+
flag: true
|
|
49
|
+
- name: --force
|
|
50
|
+
flag: true
|
|
51
|
+
examples:
|
|
52
|
+
- "praison run ai-pdf-to-markdown document.pdf"
|
|
53
|
+
- "praison run ai-pdf-to-markdown document.pdf --output ./docs/"
|
|
54
|
+
|
|
55
|
+
outputs:
|
|
56
|
+
- name: document.md
|
|
57
|
+
type: file
|
|
58
|
+
- name: images/
|
|
59
|
+
type: directory
|
|
60
|
+
- name: metadata.json
|
|
61
|
+
type: file
|
|
62
|
+
- name: run.json
|
|
63
|
+
type: file
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: ai-performance-analyzer
|
|
2
|
+
version: 1.0.0
|
|
3
|
+
description: Analyze content performance metrics from platform JSON exports
|
|
4
|
+
author: PraisonAI
|
|
5
|
+
tags:
|
|
6
|
+
- analytics
|
|
7
|
+
- performance
|
|
8
|
+
- metrics
|
|
9
|
+
- insights
|
|
10
|
+
|
|
11
|
+
config:
|
|
12
|
+
metrics:
|
|
13
|
+
- views
|
|
14
|
+
- engagement
|
|
15
|
+
- retention
|
|
16
|
+
- growth
|
|
17
|
+
comparison_period: 30
|
|
18
|
+
|
|
19
|
+
input:
|
|
20
|
+
type: object
|
|
21
|
+
properties:
|
|
22
|
+
metrics_json:
|
|
23
|
+
type: object
|
|
24
|
+
platform:
|
|
25
|
+
type: string
|
|
26
|
+
|
|
27
|
+
output:
|
|
28
|
+
type: object
|
|
29
|
+
properties:
|
|
30
|
+
analysis:
|
|
31
|
+
type: object
|
|
32
|
+
recommendations:
|
|
33
|
+
type: array
|
|
34
|
+
|
|
35
|
+
requires:
|
|
36
|
+
env:
|
|
37
|
+
- OPENAI_API_KEY
|
|
38
|
+
|
|
39
|
+
workflow:
|
|
40
|
+
agents:
|
|
41
|
+
- name: analyzer
|
|
42
|
+
role: Performance Analyst
|
|
43
|
+
tools:
|
|
44
|
+
- analyze_metrics
|
|
45
|
+
- generate_insights
|