Agent Skills by ALSEL
Anthropic ClaudeLLM・AI開発⭐ リポ 0品質スコア 50/100

data-scraper-agent

求人サイト・価格情報・ニュース・GitHub・スポーツ結果など、あらゆる公開ソースを対象に全自動でデータ収集を行うAIエージェントを構築します。スケジュール実行によるスクレイピング、無料LLM(Gemini Flash)によるデータ拡充、Notion・Google Sheets・Supabaseへの結果保存、そしてユーザーフィードバックからの学習まで対応し、すべてGitHub Actions上で無料稼働します。公開データの自動監視・収集・追跡を行いたいあらゆる用途に適しています。

description の原文を見る

构建一个全自动化的AI驱动数据收集代理,适用于任何公共来源——招聘网站、价格信息、新闻、GitHub、体育赛事等任何内容。按计划进行抓取,使用免费LLM(Gemini Flash)丰富数据,将结果存储在Notion/Sheets/Supabase中,并从用户反馈中学习。完全免费在GitHub Actions上运行。适用于用户希望自动监控、收集或跟踪任何公共数据的场景。

SKILL.md 本文

データ抽出エージェント

任意の公開データソースに対応した本番環境対応のAI駆動データ収集エージェントを構築します。 スケジュール実行し、無料LLMで結果を充実させ、データベースに保存し、時間とともに改善します。

テックスタック:Python · Gemini Flash(無料) · GitHub Actions(無料) · Notion / Sheets / Supabase

有効化するケース

  • ユーザーが公開ウェブサイトまたはAPIをスクレイプまたは監視したい場合
  • ユーザーが「...をチェックするボットを構築してほしい」「Xを監視してほしい」「...からデータを収集してほしい」と言った場合
  • ユーザーが求人情報、価格、ニュース、リポジトリ、スポーツスコア、イベント、リストを追跡したい場合
  • ユーザーがホスティング費用を支払わずにデータ収集を自動化する方法を質問した場合
  • ユーザーがユーザーの決定に基づいて時間とともにより賢くなるエージェントを望んでいる場合

コアコンセプト

3層アーキテクチャ

すべてのデータ抽出エージェントには3つの層があります:

COLLECT → ENRICH → STORE
  │           │        │
Scraper    AI (LLM)  Database
runs on    scores/   Notion /
schedule   summarises Sheets /
           & classifies Supabase

無料テックスタック

ツール理由
抽出requests + BeautifulSoupコスト無料、公開ウェブサイトの80%をカバー
JSレンダリングサイトplaywright(無料)HTML抽出が失敗したときに使用
AI充実REST API経由のGemini Flash1日あたり500リクエスト、100万トークン — 無料
保存Notion API無料層、レビュー用の優れたUI
スケジューリングGitHub Actions cron公開リポジトリなら無料
学習リポジトリ内のJSONフィードバックファイルゼロインフラ、gitで永続化

AIモデルフォールバックチェーン

配額が枯渇したときにGeminiモデル間で自動的にフォールバックするようにエージェントを構築します:

gemini-2.0-flash-lite (30 RPM) →
gemini-2.0-flash (15 RPM) →
gemini-2.5-flash (10 RPM) →
gemini-flash-lite-latest (fallback)

バッチAPI呼び出しで効率を向上

各項目に対してLLMを個別に呼び出さないでください。常にバッチ処理してください:

# BAD: 33 API calls for 33 items
for item in items:
    result = call_ai(item)  # 33 calls → hits rate limit

# GOOD: 7 API calls for 33 items (batch size 5)
for batch in chunks(items, size=5):
    results = call_ai(batch)  # 7 calls → stays within free tier

ワークフロー

ステップ 1: 目標を理解する

ユーザーに質問します:

  1. 何を収集するか: 「データソースは何ですか?URL / API / RSS / パブリックエンドポイント?」
  2. 何を抽出するか: 「どのフィールドが重要ですか?タイトル、価格、URL、日付、スコア?」
  3. どこに保存するか: 「結果はどこに保存すべきですか?Notion、Google Sheets、Supabase、またはローカルファイル?」
  4. どう充実させるか: 「AIが各項目にスコア付けしたり、要約したり、分類したり、マッチングしたりすることをお望みですか?」
  5. 実行頻度: 「どのくらいの頻度で実行する必要がありますか?毎時、毎日、毎週?」

一般的なプロンプト例:

  • 求人ウェブサイト → 履歴書との関連性でスコア付け
  • 商品価格 → 値下がり時にアラート
  • GitHubリポジトリ → 新しいリリースを要約
  • ニュースフィード → テーマ+感情で分類
  • スポーツ結果 → 統計をトラッカーに抽出
  • イベントカレンダー → 興味別にフィルタリング

ステップ 2: エージェントアーキテクチャを設計

ユーザーのために次のディレクトリ構造を生成します:

my-agent/
├── config.yaml              # ユーザーがこのファイルをカスタマイズ(キーワード、フィルタ、設定)
├── profile/
│   └── context.md           # AI が使用するユーザーコンテキスト(履歴書、興味、基準)
├── scraper/
│   ├── __init__.py
│   ├── main.py              # オーケストレーター:抽出 → 充実 → 保存
│   ├── filters.py           # ルールベースの事前フィルタ(AI処理前の高速処理)
│   └── sources/
│       ├── __init__.py
│       └── source_name.py   # 各データソースにつき1ファイル
├── ai/
│   ├── __init__.py
│   ├── client.py            # Gemini REST クライアント、モデルフォールバック付き
│   ├── pipeline.py          # バッチAI分析
│   ├── jd_fetcher.py        # URLから完全なコンテンツを取得(オプション)
│   └── memory.py            # ユーザーフィードバックから学習
├── storage/
│   ├── __init__.py
│   └── notion_sync.py       # または sheets_sync.py / supabase_sync.py
├── data/
│   └── feedback.json        # ユーザーの決定履歴(自動更新)
├── .env.example
├── setup.py                 # 1回限りのデータベース/スキーマ作成
├── enrich_existing.py       # 古い行にAIスコアをバックフィル
├── requirements.txt
└── .github/
    └── workflows/
        └── scraper.yml      # GitHub Actions スケジュール実行

ステップ 3: スクレイパーソースを構築

任意のデータソースのテンプレート:

# scraper/sources/my_source.py
"""
[Source Name] — scrapes [what] from [where].
Method: [REST API / HTML scraping / RSS feed]
"""
import requests
from bs4 import BeautifulSoup
from datetime import datetime, timezone
from scraper.filters import is_relevant

HEADERS = {
    "User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)",
}


def fetch() -> list[dict]:
    """
    Returns a list of items with consistent schema.
    Each item must have at minimum: name, url, date_found.
    """
    results = []

    # ---- REST API source ----
    resp = requests.get("https://api.example.com/items", headers=HEADERS, timeout=15)
    if resp.status_code == 200:
        for item in resp.json().get("results", []):
            if not is_relevant(item.get("title", "")):
                continue
            results.append(_normalise(item))

    return results


def _normalise(raw: dict) -> dict:
    """Convert raw API/HTML data to the standard schema."""
    return {
        "name": raw.get("title", ""),
        "url": raw.get("link", ""),
        "source": "MySource",
        "date_found": datetime.now(timezone.utc).date().isoformat(),
        # add domain-specific fields here
    }

HTMLスクレイピングパターン:

soup = BeautifulSoup(resp.text, "lxml")
for card in soup.select("[class*='listing']"):
    title = card.select_one("h2, h3").get_text(strip=True)
    link = card.select_one("a")["href"]
    if not link.startswith("http"):
        link = f"https://example.com{link}"

RSSフィードパターン:

import xml.etree.ElementTree as ET
root = ET.fromstring(resp.text)
for item in root.findall(".//item"):
    title = item.findtext("title", "")
    link = item.findtext("link", "")

ステップ 4: Gemini AIクライアントを構築

# ai/client.py
import os, json, time, requests

_last_call = 0.0

MODEL_FALLBACK = [
    "gemini-2.0-flash-lite",
    "gemini-2.0-flash",
    "gemini-2.5-flash",
    "gemini-flash-lite-latest",
]


def generate(prompt: str, model: str = "", rate_limit: float = 7.0) -> dict:
    """Call Gemini with auto-fallback on 429. Returns parsed JSON or {}."""
    global _last_call

    api_key = os.environ.get("GEMINI_API_KEY", "")
    if not api_key:
        return {}

    elapsed = time.time() - _last_call
    if elapsed < rate_limit:
        time.sleep(rate_limit - elapsed)

    models = [model] + [m for m in MODEL_FALLBACK if m != model] if model else MODEL_FALLBACK
    _last_call = time.time()

    for m in models:
        url = f"https://generativelanguage.googleapis.com/v1beta/models/{m}:generateContent?key={api_key}"
        payload = {
            "contents": [{"parts": [{"text": prompt}]}],
            "generationConfig": {
                "responseMimeType": "application/json",
                "temperature": 0.3,
                "maxOutputTokens": 2048,
            },
        }
        try:
            resp = requests.post(url, json=payload, timeout=30)
            if resp.status_code == 200:
                return _parse(resp)
            if resp.status_code in (429, 404):
                time.sleep(1)
                continue
            return {}
        except requests.RequestException:
            return {}

    return {}


def _parse(resp) -> dict:
    try:
        text = (
            resp.json()
            .get("candidates", [{}])[0]
            .get("content", {})
            .get("parts", [{}])[0]
            .get("text", "")
            .strip()
        )
        if text.startswith("```"):
            text = text.split("\n", 1)[-1].rsplit("```", 1)[0]
        return json.loads(text)
    except (json.JSONDecodeError, KeyError):
        return {}

ステップ 5: AIパイプラインを構築(バッチ)

# ai/pipeline.py
import json
import yaml
from pathlib import Path
from ai.client import generate

def analyse_batch(items: list[dict], context: str = "", preference_prompt: str = "") -> list[dict]:
    """Analyse items in batches. Returns items enriched with AI fields."""
    config = yaml.safe_load((Path(__file__).parent.parent / "config.yaml").read_text())
    model = config.get("ai", {}).get("model", "gemini-2.5-flash")
    rate_limit = config.get("ai", {}).get("rate_limit_seconds", 7.0)
    min_score = config.get("ai", {}).get("min_score", 0)
    batch_size = config.get("ai", {}).get("batch_size", 5)

    batches = [items[i:i + batch_size] for i in range(0, len(items), batch_size)]
    print(f"  [AI] {len(items)} items → {len(batches)} API calls")

    enriched = []
    for i, batch in enumerate(batches):
        print(f"  [AI] Batch {i + 1}/{len(batches)}...")
        prompt = _build_prompt(batch, context, preference_prompt, config)
        result = generate(prompt, model=model, rate_limit=rate_limit)

        analyses = result.get("analyses", [])
        for j, item in enumerate(batch):
            ai = analyses[j] if j < len(analyses) else {}
            if ai:
                score = max(0, min(100, int(ai.get("score", 0))))
                if min_score and score < min_score:
                    continue
                enriched.append({**item, "ai_score": score, "ai_summary": ai.get("summary", ""), "ai_notes": ai.get("notes", "")})
            else:
                enriched.append(item)

    return enriched


def _build_prompt(batch, context, preference_prompt, config):
    priorities = config.get("priorities", [])
    items_text = "\n\n".join(
        f"Item {i+1}: {json.dumps({k: v for k, v in item.items() if not k.startswith('_')})}"
        for i, item in enumerate(batch)
    )

    return f"""Analyse these {len(batch)} items and return a JSON object.

# Items
{items_text}

# User Context
{context[:800] if context else "Not provided"}

# User Priorities
{chr(10).join(f"- {p}" for p in priorities)}

{preference_prompt}

# Instructions
Return: {{"analyses": [{{"score": <0-100>, "summary": "<2 sentences>", "notes": "<why this matches or doesn't>"}} for each item in order]}}
Be concise. Score 90+=excellent match, 70-89=good, 50-69=ok, <50=weak."""

ステップ 6: フィードバック学習システムを構築

# ai/memory.py
"""Learn from user decisions to improve future scoring."""
import json
from pathlib import Path

FEEDBACK_PATH = Path(__file__).parent.parent / "data" / "feedback.json"


def load_feedback() -> dict:
    if FEEDBACK_PATH.exists():
        try:
            return json.loads(FEEDBACK_PATH.read_text())
        except (json.JSONDecodeError, OSError):
            pass
    return {"positive": [], "negative": []}


def save_feedback(fb: dict):
    FEEDBACK_PATH.parent.mkdir(parents=True, exist_ok=True)
    FEEDBACK_PATH.write_text(json.dumps(fb, indent=2))


def build_preference_prompt(feedback: dict, max_examples: int = 15) -> str:
    """Convert feedback history into a prompt bias section."""
    lines = []
    if feedback.get("positive"):
        lines.append("# Items the user LIKED (positive signal):")
        for e in feedback["positive"][-max_examples:]:
            lines.append(f"- {e}")
    if feedback.get("negative"):
        lines.append("\n# Items the user SKIPPED/REJECTED (negative signal):")
        for e in feedback["negative"][-max_examples:]:
            lines.append(f"- {e}")
    if lines:
        lines.append("\nUse these patterns to bias scoring on new items.")
    return "\n".join(lines)

ストレージレイヤーとの統合: 実行後に毎回、データベースから正/負のステータスを持つ項目をクエリし、抽出されたパターンで save_feedback() を呼び出します。


ステップ 7: ストレージを構築(Notionの例)

# storage/notion_sync.py
import os
from notion_client import Client
from notion_client.errors import APIResponseError

_client = None

def get_client():
    global _client
    if _client is None:
        _client = Client(auth=os.environ["NOTION_TOKEN"])
    return _client

def get_existing_urls(db_id: str) -> set[str]:
    """Fetch all URLs already stored — used for deduplication."""
    client, seen, cursor = get_client(), set(), None
    while True:
        resp = client.databases.query(database_id=db_id, page_size=100, **{"start_cursor": cursor} if cursor else {})
        for page in resp["results"]:
            url = page["properties"].get("URL", {}).get("url", "")
            if url: seen.add(url)
        if not resp["has_more"]: break
        cursor = resp["next_cursor"]
    return seen

def push_item(db_id: str, item: dict) -> bool:
    """Push one item to Notion. Returns True on success."""
    props = {
        "Name": {"title": [{"text": {"content": item.get("name", "")[:100]}}]},
        "URL": {"url": item.get("url")},
        "Source": {"select": {"name": item.get("source", "Unknown")}},
        "Date Found": {"date": {"start": item.get("date_found")}},
        "Status": {"select": {"name": "New"}},
    }
    # AI fields
    if item.get("ai_score") is not None:
        props["AI Score"] = {"number": item["ai_score"]}
    if item.get("ai_summary"):
        props["Summary"] = {"rich_text": [{"text": {"content": item["ai_summary"][:2000]}}]}
    if item.get("ai_notes"):
        props["Notes"] = {"rich_text": [{"text": {"content": item["ai_notes"][:2000]}}]}

    try:
        get_client().pages.create(parent={"database_id": db_id}, properties=props)
        return True
    except APIResponseError as e:
        print(f"[notion] Push failed: {e}")
        return False

def sync(db_id: str, items: list[dict]) -> tuple[int, int]:
    existing = get_existing_urls(db_id)
    added = skipped = 0
    for item in items:
        if item.get("url") in existing:
            skipped += 1; continue
        if push_item(db_id, item):
            added += 1; existing.add(item["url"])
        else:
            skipped += 1
    return added, skipped

ステップ 8: main.py でオーケストレーション

# scraper/main.py
import os, sys, yaml
from pathlib import Path
from dotenv import load_dotenv

load_dotenv()

from scraper.sources import my_source          # add your sources

# NOTE: This example uses Notion. If storage.provider is "sheets" or "supabase",
# replace this import with storage.sheets_sync or storage.supabase_sync and update
# the env var and sync() call accordingly.
from storage.notion_sync import sync

SOURCES = [
    ("My Source", my_source.fetch),
]

def ai_enabled():
    return bool(os.environ.get("GEMINI_API_KEY"))

def main():
    config = yaml.safe_load((Path(__file__).parent.parent / "config.yaml").read_text())
    provider = config.get("storage", {}).get("provider", "notion")

    # Resolve the storage target identifier from env based on provider
    if provider == "notion":
        db_id = os.environ.get("NOTION_DATABASE_ID")
        if not db_id:
            print("ERROR: NOTION_DATABASE_ID not set"); sys.exit(1)
    else:
        # Extend here for sheets (SHEET_ID) or supabase (SUPABASE_TABLE) etc.
        print(f"ERROR: provider '{provider}' not yet wired in main.py"); sys.exit(1)

    config = yaml.safe_load((Path(__file__).parent.parent / "config.yaml").read_text())
    all_items = []

    for name, fetch_fn in SOURCES:
        try:
            items = fetch_fn()
            print(f"[{name}] {len(items)} items")
            all_items.extend(items)
        except Exception as e:
            print(f"[{name}] FAILED: {e}")

    # Deduplicate by URL
    seen, deduped = set(), []
    for item in all_items:
        if (url := item.get("url", "")) and url not in seen:
            seen.add(url); deduped.append(item)

    print(f"Unique items: {len(deduped)}")

    if ai_enabled() and deduped:
        from ai.memory import load_feedback, build_preference_prompt
        from ai.pipeline import analyse_batch

        # load_feedback() reads data/feedback.json written by your feedback sync script.
        # To keep it current, implement a separate feedback_sync.py that queries your
        # storage provider for items with positive/negative statuses and calls save_feedback().
        feedback = load_feedback()
        preference = build_preference_prompt(feedback)
        context_path = Path(__file__).parent.parent / "profile" / "context.md"
        context = context_path.read_text() if context_path.exists() else ""
        deduped = analyse_batch(deduped, context=context, preference_prompt=preference)
    else:
        print("[AI] Skipped — GEMINI_API_KEY not set")

    added, skipped = sync(db_id, deduped)
    print(f"Done — {added} new, {skipped} existing")

if __name__ == "__main__":
    main()

ステップ 9: GitHub Actionsワークフロー

# .github/workflows/scraper.yml
name: Data Scraper Agent

on:
  schedule:
    - cron: "0 */3 * * *"  # every 3 hours — adjust to your needs
  workflow_dispatch:        # allow manual trigger

permissions:
  contents: write   # required for the feedback-history commit step

jobs:
  scrape:
    runs-on: ubuntu-latest
    timeout-minutes: 20

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: "3.11"
          cache: "pip"

      - run: pip install -r requirements.txt

      # Uncomment if Playwright is enabled in requirements.txt
      # - name: Install Playwright browsers
      #   run: python -m playwright install chromium --with-deps

      - name: Run agent
        env:
          NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
          NOTION_DATABASE_ID: ${{ secrets.NOTION_DATABASE_ID }}
          GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
        run: python -m scraper.main

      - name: Commit feedback history
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add data/feedback.json || true
          git diff --cached --quiet || git commit -m "chore: update feedback history"
          git push

ステップ 10: config.yaml テンプレート

# Customise this file — no code changes needed

# What to collect (pre-filter before AI)
filters:
  required_keywords: []      # item must contain at least one
  blocked_keywords: []       # item must not contain any

# Your priorities — AI uses these for scoring
priorities:
  - "example priority 1"
  - "example priority 2"

# Storage
storage:
  provider: "notion"         # notion | sheets | supabase | sqlite

# Feedback learning
feedback:
  positive_statuses: ["Saved", "Applied", "Interested"]
  negative_statuses: ["Skip", "Rejected", "Not relevant"]

# AI settings
ai:
  enabled: true
  model: "gemini-2.5-flash"
  min_score: 0               # filter out items below this score
  rate_limit_seconds: 7      # seconds between API calls
  batch_size: 5              # items per API call

一般的なスクレイピングパターン

パターン 1: REST API(最も簡単)

resp = requests.get(url, params={"q": query}, headers=HEADERS, timeout=15)
items = resp.json().get("results", [])

パターン 2: HTMLスクレイピング

soup = BeautifulSoup(resp.text, "lxml")
for card in soup.select(".listing-card"):
    title = card.select_one("h2").get_text(strip=True)
    href = card.select_one("a")["href"]

パターン 3: RSSフィード

import xml.etree.ElementTree as ET
root = ET.fromstring(resp.text)
for item in root.findall(".//item"):
    title = item.findtext("title", "")
    link = item.findtext("link", "")
    pub_date = item.findtext("pubDate", "")

パターン 4: ページネーション API

page = 1
while True:
    resp = requests.get(url, params={"page": page, "limit": 50}, timeout=15)
    data = resp.json()
    items = data.get("results", [])
    if not items:
        break
    for item in items:
        results.append(_normalise(item))
    if not data.get("has_more"):
        break
    page += 1

パターン 5: JSレンダリングページ(Playwright)

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto(url)
    page.wait_for_selector(".listing")
    html = page.content()
    browser.close()

soup = BeautifulSoup(html, "lxml")

避けるべきアンチパターン

アンチパターン問題修正方法
項目ごとに1回LLMを呼び出すすぐにレート制限に達する1回の呼び出しで5つの項目をバッチ処理
コード内にキーワードをハードコード再利用不可すべての設定を config.yaml に移動
レート制限なしでスクレイピングIPがブロックされるリクエスト間に time.sleep(1) を追加
コード内にシークレットを保存セキュリティリスク常に .env + GitHub Secrets を使用
重複排除なし重複行が蓄積プッシュ前に常にURLをチェック
robots.txt を無視法的/倫理的リスククローラーのルールに従う。可能なら公開API使用
JS レンダリングサイトで requests を使用空のレスポンスPlaywright を使用するか、基礎となるAPI を探す
maxOutputTokens が低すぎるJSONが切断、パースエラーバッチレスポンスに2048以上を使用

無料層制限リファレンス

サービス無料制限典型的な使用
Gemini Flash Lite30 RPM、1500 RPD3時間ごと約56リクエスト/日
Gemini 2.0 Flash15 RPM、1500 RPD良好なフォールバックオプション
Gemini 2.5 Flash10 RPM、500 RPD慎重に使用
GitHub Actions無制限(公開リポジトリ)約20分/日
Notion API無制限約200ライト/日
Supabase500MB DB、2GB転送ほとんどのエージェントに適切
Google Sheets API300リクエスト/分小規模なエージェント向け

要件テンプレート

requests==2.31.0
beautifulsoup4==4.12.3
lxml==5.1.0
python-dotenv==1.0.1
pyyaml==6.0.2
notion-client==2.2.1   # Notion を使用する場合
# playwright==1.40.0   # JS レンダリングサイト用、コメントを解除

品質チェックリスト

エージェントを完了としてマークする前に:

  • [ ] config.yaml がすべてのユーザー向け設定を制御 — ハードコード値なし
  • [ ] profile/context.md がAIマッチング用のユーザー固有コンテキストを保存
  • [ ] 保存プッシュ前にURLで重複排除
  • [ ] Geminiクライアントにモデルフォールバックチェーン(4モデル)がある
  • [ ] バッチサイズ ≤ API呼び出しあたり5項目
  • [ ] maxOutputTokens ≥ 2048
  • [ ] .env.gitignore に含まれている
  • [ ] 起動用に .env.example が提供されている
  • [ ] setup.py が初回実行時にDBスキーマを作成
  • [ ] enrich_existing.py が古い行のAIスコアをバックフィル
  • [ ] GitHub Actions ワークフローが実行後に feedback.json をコミット
  • [ ] README が以下をカバー:5分以内のセットアップ、必須キー、カスタマイズ

実世界の例

"Hacker News でAI スタートアップの資金調達ニュースを監視するエージェントを構築してほしい"
"3つのe-コマースサイトから商品価格をスクレイプし、値下がり時にアラートを出す"
"'llm' または 'agents' でタグ付けされた新しい GitHub リポジトリを追跡 — 各リポジトリの要約を生成"
"LinkedIn と Cutshort から Chief Operations Officer の職務記述書をNotionに収集"
"自社について言及している subreddit の投稿を監視 — 感情分類を実施"
"毎日 arXiv から関心のあるトピックの新しいアカデミック論文をスクレイプ"
"スポーツイベントの結果を追跡し、Google Sheets で動的に更新されるスプレッドシートを維持"
"不動産物件監視機を構築 — 新規物件が 1000万ルピア以下の場合はアラート"

リファレンス実装

このアーキテクチャを使用して構築された完全に機能するエージェントは、4つ以上のデータソースをスクレイプし、 Gemini 呼び出しをバッチ処理し、Notion に保存された「応募済み」/「却下」の決定から学習し、 GitHub Actions 上で 100% 無料で実行されます。上記のステップ 1~9 に従って、独自のエージェントを構築してください。

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
affaan-m
リポジトリ
affaan-m/everything-claude-code
ライセンス
MIT
最終更新
不明

Source: https://github.com/affaan-m/everything-claude-code / ライセンス: MIT

関連スキル

OpenAILLM・AI開発⭐ リポ 6,054

agent-browser

AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。

by JimmyLv
汎用LLM・AI開発⭐ リポ 1,982

anyskill

AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。

by LeoYeAI
汎用LLM・AI開発⭐ リポ 1,982

engram

AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。

by LeoYeAI
汎用LLM・AI開発⭐ リポ 21,584

skyvern

AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。

by Skyvern-AI
汎用LLM・AI開発⭐ リポ 1,149

pinchbench

PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。

by pinchbench
汎用LLM・AI開発⭐ リポ 4,693

openui

OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。

by thesysdev
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: affaan-m · affaan-m/everything-claude-code · ライセンス: MIT