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,194 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AI Voiceover Generator Tools
|
|
3
|
+
|
|
4
|
+
Generate voice overs using TTS:
|
|
5
|
+
- OpenAI TTS
|
|
6
|
+
- Multiple voices
|
|
7
|
+
- Speed control
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
import os
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Dict, Optional
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def generate_voiceover(
|
|
20
|
+
text: str,
|
|
21
|
+
output_path: Optional[str] = None,
|
|
22
|
+
voice: str = "alloy",
|
|
23
|
+
model: str = "tts-1",
|
|
24
|
+
speed: float = 1.0,
|
|
25
|
+
) -> Dict[str, Any]:
|
|
26
|
+
"""
|
|
27
|
+
Generate voiceover from text using OpenAI TTS.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
text: Text to convert to speech
|
|
31
|
+
output_path: Output audio file path
|
|
32
|
+
voice: Voice to use (alloy, echo, fable, onyx, nova, shimmer)
|
|
33
|
+
model: TTS model (tts-1, tts-1-hd)
|
|
34
|
+
speed: Speech speed (0.25 to 4.0)
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
Dictionary with audio info
|
|
38
|
+
"""
|
|
39
|
+
import requests
|
|
40
|
+
|
|
41
|
+
api_key = os.environ.get("OPENAI_API_KEY")
|
|
42
|
+
if not api_key:
|
|
43
|
+
return {"error": "OPENAI_API_KEY not set"}
|
|
44
|
+
|
|
45
|
+
if not output_path:
|
|
46
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
47
|
+
output_path = f"voiceover_{timestamp}.mp3"
|
|
48
|
+
|
|
49
|
+
Path(output_path).parent.mkdir(parents=True, exist_ok=True)
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
response = requests.post(
|
|
53
|
+
"https://api.openai.com/v1/audio/speech",
|
|
54
|
+
headers={
|
|
55
|
+
"Authorization": f"Bearer {api_key}",
|
|
56
|
+
"Content-Type": "application/json",
|
|
57
|
+
},
|
|
58
|
+
json={
|
|
59
|
+
"model": model,
|
|
60
|
+
"input": text,
|
|
61
|
+
"voice": voice,
|
|
62
|
+
"speed": speed,
|
|
63
|
+
},
|
|
64
|
+
timeout=120,
|
|
65
|
+
)
|
|
66
|
+
response.raise_for_status()
|
|
67
|
+
|
|
68
|
+
with open(output_path, "wb") as f:
|
|
69
|
+
f.write(response.content)
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
"path": output_path,
|
|
73
|
+
"voice": voice,
|
|
74
|
+
"model": model,
|
|
75
|
+
"text_length": len(text),
|
|
76
|
+
"size_bytes": len(response.content),
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
except Exception as e:
|
|
80
|
+
logger.error(f"Error generating voiceover: {e}")
|
|
81
|
+
return {"error": str(e)}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def generate_speech(
|
|
85
|
+
script: str,
|
|
86
|
+
output_dir: Optional[str] = None,
|
|
87
|
+
voice: str = "alloy",
|
|
88
|
+
chunk_size: int = 4000,
|
|
89
|
+
) -> Dict[str, Any]:
|
|
90
|
+
"""
|
|
91
|
+
Generate speech from a longer script, chunking if needed.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
script: Full script text
|
|
95
|
+
output_dir: Output directory
|
|
96
|
+
voice: Voice to use
|
|
97
|
+
chunk_size: Max characters per chunk
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Dictionary with audio files
|
|
101
|
+
"""
|
|
102
|
+
output_dir = output_dir or "./voiceovers"
|
|
103
|
+
Path(output_dir).mkdir(parents=True, exist_ok=True)
|
|
104
|
+
|
|
105
|
+
# Split into chunks if needed
|
|
106
|
+
chunks = []
|
|
107
|
+
if len(script) > chunk_size:
|
|
108
|
+
words = script.split()
|
|
109
|
+
current_chunk = []
|
|
110
|
+
current_length = 0
|
|
111
|
+
|
|
112
|
+
for word in words:
|
|
113
|
+
if current_length + len(word) + 1 > chunk_size:
|
|
114
|
+
chunks.append(" ".join(current_chunk))
|
|
115
|
+
current_chunk = [word]
|
|
116
|
+
current_length = len(word)
|
|
117
|
+
else:
|
|
118
|
+
current_chunk.append(word)
|
|
119
|
+
current_length += len(word) + 1
|
|
120
|
+
|
|
121
|
+
if current_chunk:
|
|
122
|
+
chunks.append(" ".join(current_chunk))
|
|
123
|
+
else:
|
|
124
|
+
chunks = [script]
|
|
125
|
+
|
|
126
|
+
audio_files = []
|
|
127
|
+
|
|
128
|
+
for i, chunk in enumerate(chunks):
|
|
129
|
+
output_path = os.path.join(output_dir, f"speech_{i:03d}.mp3")
|
|
130
|
+
result = generate_voiceover(chunk, output_path, voice)
|
|
131
|
+
|
|
132
|
+
if "path" in result:
|
|
133
|
+
audio_files.append(result["path"])
|
|
134
|
+
else:
|
|
135
|
+
logger.warning(f"Error generating chunk {i}: {result.get('error')}")
|
|
136
|
+
|
|
137
|
+
# Concatenate if multiple files
|
|
138
|
+
if len(audio_files) > 1:
|
|
139
|
+
final_path = os.path.join(output_dir, "speech_full.mp3")
|
|
140
|
+
concat_audio(audio_files, final_path)
|
|
141
|
+
return {
|
|
142
|
+
"path": final_path,
|
|
143
|
+
"chunks": len(audio_files),
|
|
144
|
+
"chunk_files": audio_files,
|
|
145
|
+
}
|
|
146
|
+
elif audio_files:
|
|
147
|
+
return {
|
|
148
|
+
"path": audio_files[0],
|
|
149
|
+
"chunks": 1,
|
|
150
|
+
}
|
|
151
|
+
else:
|
|
152
|
+
return {"error": "No audio generated"}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def concat_audio(
|
|
156
|
+
audio_files: list,
|
|
157
|
+
output_path: str,
|
|
158
|
+
) -> Dict[str, Any]:
|
|
159
|
+
"""
|
|
160
|
+
Concatenate multiple audio files.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
audio_files: List of audio file paths
|
|
164
|
+
output_path: Output file path
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Dictionary with output info
|
|
168
|
+
"""
|
|
169
|
+
import subprocess
|
|
170
|
+
import tempfile
|
|
171
|
+
|
|
172
|
+
try:
|
|
173
|
+
with tempfile.NamedTemporaryFile(mode="w", suffix=".txt", delete=False) as f:
|
|
174
|
+
for audio in audio_files:
|
|
175
|
+
f.write(f"file '{audio}'\n")
|
|
176
|
+
concat_file = f.name
|
|
177
|
+
|
|
178
|
+
cmd = [
|
|
179
|
+
"ffmpeg", "-y",
|
|
180
|
+
"-f", "concat",
|
|
181
|
+
"-safe", "0",
|
|
182
|
+
"-i", concat_file,
|
|
183
|
+
"-c", "copy",
|
|
184
|
+
output_path
|
|
185
|
+
]
|
|
186
|
+
|
|
187
|
+
subprocess.run(cmd, capture_output=True, check=True)
|
|
188
|
+
os.unlink(concat_file)
|
|
189
|
+
|
|
190
|
+
return {"path": output_path}
|
|
191
|
+
|
|
192
|
+
except Exception as e:
|
|
193
|
+
logger.error(f"Error concatenating audio: {e}")
|
|
194
|
+
return {"error": str(e)}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Watermark Adder
|
|
2
|
+
|
|
3
|
+
Batch add watermarks/logos to images
|
|
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-watermark-adder <input>
|
|
16
|
+
|
|
17
|
+
# With output directory
|
|
18
|
+
praison recipes run ai-watermark-adder <input> --output ./output/
|
|
19
|
+
|
|
20
|
+
# Dry run (check dependencies only)
|
|
21
|
+
praison recipes run ai-watermark-adder <input> --dry-run
|
|
22
|
+
|
|
23
|
+
# Show recipe info
|
|
24
|
+
praison recipes info ai-watermark-adder
|
|
25
|
+
|
|
26
|
+
# Check dependencies
|
|
27
|
+
praison recipes doctor ai-watermark-adder
|
|
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-watermark-adder")
|
|
38
|
+
result = recipe.run(input="<your-input>")
|
|
39
|
+
print(result)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Requirements
|
|
43
|
+
|
|
44
|
+
### Packages
|
|
45
|
+
- pillow
|
|
46
|
+
|
|
47
|
+
### Environment Variables
|
|
48
|
+
- None
|
|
49
|
+
|
|
50
|
+
### External Tools
|
|
51
|
+
- None
|
|
52
|
+
|
|
53
|
+
## Tags
|
|
54
|
+
|
|
55
|
+
`image`, `watermark`, `branding`
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
Apache-2.0
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: ai-watermark-adder
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Batch add watermarks/logos to images
|
|
4
|
+
author: praison
|
|
5
|
+
license: Apache-2.0
|
|
6
|
+
tags:
|
|
7
|
+
- image
|
|
8
|
+
- watermark
|
|
9
|
+
- branding
|
|
10
|
+
|
|
11
|
+
requires:
|
|
12
|
+
tools:
|
|
13
|
+
- image_tool
|
|
14
|
+
packages:
|
|
15
|
+
- pillow
|
|
16
|
+
|
|
17
|
+
cli:
|
|
18
|
+
command: praison recipes run ai-watermark-adder
|
|
19
|
+
examples:
|
|
20
|
+
- praison recipes run ai-watermark-adder <input>
|
|
21
|
+
- praison recipes run ai-watermark-adder <input> --output ./output/
|
|
22
|
+
- praison recipes run ai-watermark-adder <input> --dry-run
|
|
23
|
+
|
|
24
|
+
safety:
|
|
25
|
+
dry_run_default: true
|
|
26
|
+
overwrites_files: true
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Watermark Remover
|
|
2
|
+
|
|
3
|
+
Remove watermarks from images (COPYRIGHT WARNING)
|
|
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-watermark-remover <input>
|
|
16
|
+
|
|
17
|
+
# With output directory
|
|
18
|
+
praison recipes run ai-watermark-remover <input> --output ./output/
|
|
19
|
+
|
|
20
|
+
# Dry run (check dependencies only)
|
|
21
|
+
praison recipes run ai-watermark-remover <input> --dry-run
|
|
22
|
+
|
|
23
|
+
# Show recipe info
|
|
24
|
+
praison recipes info ai-watermark-remover
|
|
25
|
+
|
|
26
|
+
# Check dependencies
|
|
27
|
+
praison recipes doctor ai-watermark-remover
|
|
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-watermark-remover")
|
|
38
|
+
result = recipe.run(input="<your-input>")
|
|
39
|
+
print(result)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Requirements
|
|
43
|
+
|
|
44
|
+
### Packages
|
|
45
|
+
- openai
|
|
46
|
+
- pillow
|
|
47
|
+
|
|
48
|
+
### Environment Variables
|
|
49
|
+
- OPENAI_API_KEY
|
|
50
|
+
|
|
51
|
+
### External Tools
|
|
52
|
+
- None
|
|
53
|
+
|
|
54
|
+
## Tags
|
|
55
|
+
|
|
56
|
+
`image`, `watermark`, `removal`
|
|
57
|
+
|
|
58
|
+
## License
|
|
59
|
+
|
|
60
|
+
Apache-2.0
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: ai-watermark-remover
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Remove watermarks from images (COPYRIGHT WARNING)
|
|
4
|
+
author: praison
|
|
5
|
+
license: Apache-2.0
|
|
6
|
+
tags:
|
|
7
|
+
- image
|
|
8
|
+
- watermark
|
|
9
|
+
- removal
|
|
10
|
+
|
|
11
|
+
requires:
|
|
12
|
+
tools:
|
|
13
|
+
- vision_tool
|
|
14
|
+
- image_tool
|
|
15
|
+
packages:
|
|
16
|
+
- openai
|
|
17
|
+
- pillow
|
|
18
|
+
env:
|
|
19
|
+
- OPENAI_API_KEY
|
|
20
|
+
|
|
21
|
+
cli:
|
|
22
|
+
command: praison recipes run ai-watermark-remover
|
|
23
|
+
examples:
|
|
24
|
+
- praison recipes run ai-watermark-remover <input>
|
|
25
|
+
- praison recipes run ai-watermark-remover <input> --output ./output/
|
|
26
|
+
- praison recipes run ai-watermark-remover <input> --dry-run
|
|
27
|
+
|
|
28
|
+
safety:
|
|
29
|
+
dry_run_default: true
|
|
30
|
+
overwrites_files: true
|
|
31
|
+
requires_consent: true
|
|
32
|
+
consent_message: "Only use on images you have rights to modify."
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Data Transformer
|
|
2
|
+
|
|
3
|
+
Transform data between formats with AI-assisted schema mapping.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Multi-format support**: CSV, JSON, XML, Excel
|
|
8
|
+
- **AI schema inference**: Automatic detection of data types and patterns
|
|
9
|
+
- **Smart mapping**: AI-assisted field mapping between schemas
|
|
10
|
+
- **Validation**: Optional output validation
|
|
11
|
+
|
|
12
|
+
## Requirements
|
|
13
|
+
|
|
14
|
+
- `OPENAI_API_KEY` environment variable
|
|
15
|
+
- Optional: `pandas` for data processing
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
### CLI
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Basic transformation
|
|
23
|
+
praisonai run data-transformer ./data.csv -o ./output.json
|
|
24
|
+
|
|
25
|
+
# With target schema
|
|
26
|
+
praisonai run data-transformer ./legacy.xml -o ./modern.json --schema ./schema.json
|
|
27
|
+
|
|
28
|
+
# Natural language schema
|
|
29
|
+
praisonai run data-transformer ./data.csv -o ./output.json --schema "Salesforce Contact format"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Python API
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
from praisonaiagents import Workflow
|
|
36
|
+
|
|
37
|
+
workflow = Workflow.from_template(
|
|
38
|
+
"data-transformer",
|
|
39
|
+
config={
|
|
40
|
+
"input": "./data.csv",
|
|
41
|
+
"output": "./output.json",
|
|
42
|
+
"target_schema": "Salesforce Contact format",
|
|
43
|
+
"validation": True
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
result = workflow.run()
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Supported Formats
|
|
50
|
+
|
|
51
|
+
### Input
|
|
52
|
+
- CSV (comma, tab, pipe delimited)
|
|
53
|
+
- JSON (objects, arrays)
|
|
54
|
+
- XML
|
|
55
|
+
- Excel (.xlsx, .xls)
|
|
56
|
+
|
|
57
|
+
### Output
|
|
58
|
+
- JSON
|
|
59
|
+
- CSV
|
|
60
|
+
- XML
|
|
61
|
+
- Excel
|
|
62
|
+
|
|
63
|
+
## Configuration
|
|
64
|
+
|
|
65
|
+
| Parameter | Type | Default | Description |
|
|
66
|
+
|-----------|------|---------|-------------|
|
|
67
|
+
| `input` | string | required | Input file path |
|
|
68
|
+
| `output` | string | required | Output file path |
|
|
69
|
+
| `target_schema` | string | auto | Target schema file or description |
|
|
70
|
+
| `validation` | boolean | true | Validate output against schema |
|
|
71
|
+
| `sample_size` | integer | 100 | Rows to sample for inference |
|
|
72
|
+
|
|
73
|
+
## License
|
|
74
|
+
|
|
75
|
+
Apache-2.0
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
name: data-transformer
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Transform data between formats with AI-assisted schema mapping
|
|
4
|
+
author: praisonai
|
|
5
|
+
license: Apache-2.0
|
|
6
|
+
tags: [data, etl, transform, csv, json, xml, schema]
|
|
7
|
+
|
|
8
|
+
requires:
|
|
9
|
+
tools: [csv_tool, json_tool, file_tool]
|
|
10
|
+
packages: [pandas]
|
|
11
|
+
env: [OPENAI_API_KEY]
|
|
12
|
+
|
|
13
|
+
workflow: workflow.yaml
|
|
14
|
+
agents: agents.yaml
|
|
15
|
+
|
|
16
|
+
config:
|
|
17
|
+
input:
|
|
18
|
+
type: string
|
|
19
|
+
required: true
|
|
20
|
+
description: Input file (CSV, JSON, XML, Excel)
|
|
21
|
+
output:
|
|
22
|
+
type: string
|
|
23
|
+
required: true
|
|
24
|
+
description: Output file path
|
|
25
|
+
target_schema:
|
|
26
|
+
type: string
|
|
27
|
+
description: Target schema file or description
|
|
28
|
+
validation:
|
|
29
|
+
type: boolean
|
|
30
|
+
default: true
|
|
31
|
+
description: Validate output against schema
|
|
32
|
+
sample_size:
|
|
33
|
+
type: integer
|
|
34
|
+
default: 100
|
|
35
|
+
description: Rows to sample for schema inference
|
|
36
|
+
|
|
37
|
+
defaults:
|
|
38
|
+
validation: true
|
|
39
|
+
sample_size: 100
|
|
40
|
+
|
|
41
|
+
cli:
|
|
42
|
+
command: transform
|
|
43
|
+
args:
|
|
44
|
+
- name: input
|
|
45
|
+
positional: true
|
|
46
|
+
description: Input file (CSV, JSON, XML, Excel)
|
|
47
|
+
- name: --output
|
|
48
|
+
short: -o
|
|
49
|
+
required: true
|
|
50
|
+
description: Output file path
|
|
51
|
+
- name: --schema
|
|
52
|
+
short: -s
|
|
53
|
+
description: Target schema file or description
|
|
54
|
+
- name: --no-validate
|
|
55
|
+
flag: true
|
|
56
|
+
description: Skip validation step
|
|
57
|
+
- name: --sample
|
|
58
|
+
default: 100
|
|
59
|
+
description: Sample size for schema inference
|
|
60
|
+
examples:
|
|
61
|
+
- praisonai run data-transformer ./data.csv -o ./output.json
|
|
62
|
+
- praisonai run data-transformer ./legacy.xml -o ./modern.json --schema ./schema.json
|
|
63
|
+
- praisonai run data-transformer ./data.csv -o ./output.json --schema "Salesforce Contact format"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
agents:
|
|
2
|
+
schema_inferrer:
|
|
3
|
+
name: SchemaInferrer
|
|
4
|
+
role: Data Analyst
|
|
5
|
+
goal: Infer source data schema
|
|
6
|
+
backstory: |
|
|
7
|
+
I am an expert at analyzing data files and understanding their structure.
|
|
8
|
+
I can detect patterns, data types, and quality issues in any format.
|
|
9
|
+
instructions: |
|
|
10
|
+
Analyze the input file and infer its schema:
|
|
11
|
+
- Detect file format (CSV, JSON, XML, Excel)
|
|
12
|
+
- Identify column names and data types
|
|
13
|
+
- Detect patterns (dates, emails, phones, etc.)
|
|
14
|
+
- Note any data quality issues
|
|
15
|
+
Return a structured schema definition.
|
|
16
|
+
tools: [csv_tool, json_tool, file_tool]
|
|
17
|
+
verbose: true
|
|
18
|
+
|
|
19
|
+
mapper:
|
|
20
|
+
name: SchemaMapper
|
|
21
|
+
role: Data Engineer
|
|
22
|
+
goal: Create field mappings between schemas
|
|
23
|
+
backstory: |
|
|
24
|
+
I specialize in data integration and schema mapping. I understand
|
|
25
|
+
how to match fields between different data models and identify
|
|
26
|
+
the transformations needed.
|
|
27
|
+
instructions: |
|
|
28
|
+
Map source fields to target schema:
|
|
29
|
+
- Match by name similarity
|
|
30
|
+
- Match by data type compatibility
|
|
31
|
+
- Match by sample value patterns
|
|
32
|
+
- Flag ambiguous mappings for review
|
|
33
|
+
- Suggest transformations needed
|
|
34
|
+
Return a mapping specification.
|
|
35
|
+
verbose: true
|
|
36
|
+
|
|
37
|
+
transformer:
|
|
38
|
+
name: DataTransformer
|
|
39
|
+
role: ETL Engineer
|
|
40
|
+
goal: Execute data transformation
|
|
41
|
+
backstory: |
|
|
42
|
+
I am an ETL specialist who can transform data between any formats.
|
|
43
|
+
I handle type conversions, formatting, and data quality issues
|
|
44
|
+
while maintaining data integrity.
|
|
45
|
+
instructions: |
|
|
46
|
+
Transform data according to mapping:
|
|
47
|
+
- Read source data
|
|
48
|
+
- Apply field mappings
|
|
49
|
+
- Execute transformations
|
|
50
|
+
- Handle null values and defaults
|
|
51
|
+
- Write to output format
|
|
52
|
+
tools: [csv_tool, json_tool, file_tool]
|
|
53
|
+
verbose: true
|
|
54
|
+
|
|
55
|
+
validator:
|
|
56
|
+
name: DataValidator
|
|
57
|
+
role: QA Engineer
|
|
58
|
+
goal: Validate transformed data
|
|
59
|
+
backstory: |
|
|
60
|
+
I am a data quality specialist who ensures transformed data
|
|
61
|
+
meets all requirements and constraints. I catch issues before
|
|
62
|
+
they cause problems downstream.
|
|
63
|
+
instructions: |
|
|
64
|
+
Validate the transformed data:
|
|
65
|
+
- Schema compliance check
|
|
66
|
+
- Data type correctness
|
|
67
|
+
- Required field presence
|
|
68
|
+
- Value range constraints
|
|
69
|
+
Return validation report.
|
|
70
|
+
verbose: true
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
name: Data Transformer
|
|
2
|
+
description: Transform data between formats with AI-assisted schema mapping
|
|
3
|
+
|
|
4
|
+
workflow:
|
|
5
|
+
verbose: true
|
|
6
|
+
stream: true
|
|
7
|
+
|
|
8
|
+
variables:
|
|
9
|
+
input: "{{input}}"
|
|
10
|
+
output: "{{output}}"
|
|
11
|
+
target_schema: "{{target_schema}}"
|
|
12
|
+
validation: "{{validation}}"
|
|
13
|
+
sample_size: "{{sample_size}}"
|
|
14
|
+
|
|
15
|
+
agents:
|
|
16
|
+
schema_inferrer:
|
|
17
|
+
name: SchemaInferrer
|
|
18
|
+
role: Data Analyst
|
|
19
|
+
goal: Infer source data schema
|
|
20
|
+
instructions: |
|
|
21
|
+
Analyze the input file and infer its schema:
|
|
22
|
+
- Detect file format (CSV, JSON, XML, Excel)
|
|
23
|
+
- Sample {{sample_size}} rows for analysis
|
|
24
|
+
- Identify column names and data types
|
|
25
|
+
- Detect patterns (dates, emails, phones, etc.)
|
|
26
|
+
- Note any data quality issues
|
|
27
|
+
Return a structured schema definition.
|
|
28
|
+
tools: [csv_tool, json_tool, file_tool]
|
|
29
|
+
|
|
30
|
+
mapper:
|
|
31
|
+
name: SchemaMapper
|
|
32
|
+
role: Data Engineer
|
|
33
|
+
goal: Create field mappings between schemas
|
|
34
|
+
instructions: |
|
|
35
|
+
Map source fields to target schema:
|
|
36
|
+
- Match by name similarity
|
|
37
|
+
- Match by data type compatibility
|
|
38
|
+
- Match by sample value patterns
|
|
39
|
+
- Flag ambiguous mappings for review
|
|
40
|
+
- Suggest transformations needed
|
|
41
|
+
Return a mapping specification.
|
|
42
|
+
|
|
43
|
+
transformer:
|
|
44
|
+
name: DataTransformer
|
|
45
|
+
role: ETL Engineer
|
|
46
|
+
goal: Execute data transformation
|
|
47
|
+
instructions: |
|
|
48
|
+
Transform data according to mapping:
|
|
49
|
+
- Read source data
|
|
50
|
+
- Apply field mappings
|
|
51
|
+
- Execute transformations (type conversion, formatting)
|
|
52
|
+
- Handle null values and defaults
|
|
53
|
+
- Write to output format
|
|
54
|
+
tools: [csv_tool, json_tool, file_tool]
|
|
55
|
+
|
|
56
|
+
validator:
|
|
57
|
+
name: DataValidator
|
|
58
|
+
role: QA Engineer
|
|
59
|
+
goal: Validate transformed data
|
|
60
|
+
instructions: |
|
|
61
|
+
Validate the transformed data:
|
|
62
|
+
- Schema compliance check
|
|
63
|
+
- Data type correctness
|
|
64
|
+
- Required field presence
|
|
65
|
+
- Value range constraints
|
|
66
|
+
- Referential integrity (if applicable)
|
|
67
|
+
Return validation report.
|
|
68
|
+
|
|
69
|
+
steps:
|
|
70
|
+
- name: infer_schema
|
|
71
|
+
agent: schema_inferrer
|
|
72
|
+
action: "Analyze source file and infer schema: {{input}}"
|
|
73
|
+
output_variable: source_schema
|
|
74
|
+
|
|
75
|
+
- name: create_mapping
|
|
76
|
+
agent: mapper
|
|
77
|
+
action: "Create mapping to target: {{target_schema}}"
|
|
78
|
+
context_from: [infer_schema]
|
|
79
|
+
output_variable: field_mapping
|
|
80
|
+
|
|
81
|
+
- name: transform
|
|
82
|
+
agent: transformer
|
|
83
|
+
action: "Transform data and write to: {{output}}"
|
|
84
|
+
context_from: [create_mapping]
|
|
85
|
+
output_variable: transform_result
|
|
86
|
+
|
|
87
|
+
- name: validate
|
|
88
|
+
agent: validator
|
|
89
|
+
action: "Validate output against schema"
|
|
90
|
+
context_from: [transform]
|
|
91
|
+
condition: "{{validation}}"
|
|
92
|
+
output_variable: validation_report
|