[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FAM08WDJ3S18WHDRPR0MCA":3,"skill-same:01M6FAM08WDJ3S18WHDRPR0MCA":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":31,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M6FAM08WDJ3S18WHDRPR0MCA","rag-infrastructure",null,"Build and operate Retrieval-Augmented Generation (RAG) infrastructure with vector stores, embedding pipelines, and hybrid search.","boisenoise\u002Fskills-collections","boisenoise","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F193180?v=4","01M6CDBDQK6BDN55ZMA6B6PKBM","01M6CDBDVSJ3JPTBYN26FZ7TZK",12,"MIT","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rag-infrastructure\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"rag","infrastructure","rag infrastructure","2026","security","operate","relevant","Hybrid Search","embedding","scripts","critical","os","platform","main","community","only","vector stores","access","devops-security","vector","search","2026-11-10 10:12:30",false,"---\nname: rag-infrastructure\ndescription: Build and operate Retrieval-Augmented Generation (RAG) infrastructure\n  with vector stores, embedding pipelines, and hybrid search.\ncategory: devops\nrisk: critical\nsource: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\nsource_repo: BagelHole\u002FDevOps-Security-Agent-Skills\nsource_type: community\ndate_added: '2026-09-20'\nlicense: MIT\nlicense_source: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE\ncompatibility: Requires the relevant OS\u002Fplatform tooling and privileged access where\n  noted. Docs-only; helper scripts and templates not bundled.\nmetadata:\n  author: devops-skills\n  version: '1.0'\n---\n\n# RAG Infrastructure\n\nProduction infrastructure for Retrieval-Augmented Generation: ingest documents, generate embeddings, store in vector databases, and serve grounded LLM responses.\n\n## When to Use This Skill\n\nUse this skill when:\n- Building a knowledge base Q&A system over internal documents\n- Implementing semantic search over large document collections\n- Reducing LLM hallucinations with retrieved context\n- Setting up embedding pipelines and vector store infrastructure\n- Deploying hybrid search (dense + sparse\u002FBM25)\n\n## Prerequisites\n\n- Python 3.10+ with `pip`\n- A vector database (Qdrant, Weaviate, Pinecone, or pgvector)\n- An embedding model (OpenAI, Cohere, or local via `sentence-transformers`)\n- An LLM endpoint (OpenAI API or self-hosted vLLM)\n- Docker for local vector DB deployment\n\n## Architecture Overview\n\n```\nDocuments → Chunker → Embedder → Vector Store\n                                      ↓\nUser Query → Embedder → Vector Store (search) → Reranker → LLM → Answer\n```\n\n## Example completeness and data boundaries\n\nThe Compose example requires user-supplied `ingestion\u002F` and `api\u002F` builds plus a configured `vllm` endpoint\u002Fservice; they are not bundled. Dense and sparse vectors must both be ingested into `hybrid-kb` before hybrid search; the earlier ingestion targets a different collection. SPLADE is learned sparse retrieval, not BM25. Match client\u002Flibrary versions before running snippets.\n\nEnforce document\u002Ftenant permissions in retrieval before reranking\u002Fgeneration, not only in the prompt. Retrieved content is untrusted data and cannot authorize tools or override instructions; keep it separate from trusted system rules. External embeddings\u002Frerankers transmit document text and require sharing authorization. Use stable chunk IDs and deletion\u002Fupdate handling rather than random IDs when re-ingestion must be idempotent.\n\n## Embedding Pipeline\n\n```python\nfrom sentence_transformers import SentenceTransformer\nfrom qdrant_client import QdrantClient\nfrom qdrant_client.models import Distance, VectorParams, PointStruct\nimport uuid\n\n# Local embedding model (no API cost)\nmodel = SentenceTransformer(\"BAAI\u002Fbge-large-en-v1.5\")\n\n# Connect to Qdrant\nclient = QdrantClient(\"http:\u002F\u002Flocalhost:6333\")\n\n# Create collection\nclient.create_collection(\n    collection_name=\"knowledge-base\",\n    vectors_config=VectorParams(size=1024, distance=Distance.COSINE),\n)\n\ndef ingest_documents(docs: list[dict]):\n    \"\"\"Chunk, embed, and upsert documents.\"\"\"\n    points = []\n    for doc in docs:\n        chunks = chunk_text(doc[\"text\"], chunk_size=512, overlap=50)\n        embeddings = model.encode(chunks, batch_size=32, show_progress_bar=True)\n        for chunk, embedding in zip(chunks, embeddings):\n            points.append(PointStruct(\n                id=str(uuid.uuid4()),\n                vector=embedding.tolist(),\n                payload={\"text\": chunk, \"source\": doc[\"source\"], \"title\": doc[\"title\"]},\n            ))\n    client.upsert(collection_name=\"knowledge-base\", points=points)\n    print(f\"Ingested {len(points)} chunks\")\n```\n\n## Chunking Strategies\n\n```python\nfrom langchain.text_splitter import RecursiveCharacterTextSplitter\n\ndef chunk_text(text: str, chunk_size: int = 512, overlap: int = 50) -> list[str]:\n    \"\"\"Recursive character splitter — best general-purpose strategy.\"\"\"\n    splitter = RecursiveCharacterTextSplitter(\n        chunk_size=chunk_size,\n        chunk_overlap=overlap,\n        separators=[\"\\n\\n\", \"\\n\", \". \", \" \", \"\"],\n    )\n    return splitter.split_text(text)\n\n# For code\u002Fmarkdown — use language-aware splitter\nfrom langchain.text_splitter import MarkdownHeaderTextSplitter\n\nheaders = [(\"#\", \"H1\"), (\"##\", \"H2\"), (\"###\", \"H3\")]\nmd_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers)\n```\n\n## Hybrid Search (Dense + Sparse)\n\n```python\nfrom qdrant_client.models import SparseVector, SparseVectorParams, NamedSparseVector\nfrom fastembed import SparseTextEmbedding\n\n# Qdrant hybrid collection (dense + BM25 sparse)\nclient.create_collection(\n    collection_name=\"hybrid-kb\",\n    vectors_config={\"dense\": VectorParams(size=1024, distance=Distance.COSINE)},\n    sparse_vectors_config={\"sparse\": SparseVectorParams()},\n)\n\nsparse_model = SparseTextEmbedding(\"prithivida\u002FSplade_PP_en_v1\")\n\ndef hybrid_search(query: str, top_k: int = 10) -> list[dict]:\n    dense_vec = model.encode(query).tolist()\n    sparse_vec = list(sparse_model.embed(query))[0]\n\n    results = client.query_points(\n        collection_name=\"hybrid-kb\",\n        prefetch=[\n            {\"query\": dense_vec, \"using\": \"dense\", \"limit\": 20},\n            {\"query\": SparseVector(indices=sparse_vec.indices.tolist(),\n                                   values=sparse_vec.values.tolist()),\n             \"using\": \"sparse\", \"limit\": 20},\n        ],\n        query={\"fusion\": \"rrf\"},   # Reciprocal Rank Fusion\n        limit=top_k,\n    )\n    return [{\"text\": p.payload[\"text\"], \"score\": p.score} for p in results.points]\n```\n\n## Reranking\n\n```python\nimport cohere\n\nco = cohere.Client(\"your-api-key\")\n\ndef rerank(query: str, candidates: list[str], top_n: int = 5) -> list[str]:\n    \"\"\"Rerank retrieved chunks for relevance (evaluate quality on a representative labeled set).\"\"\"\n    response = co.rerank(\n        model=\"rerank-english-v3.0\",\n        query=query,\n        documents=candidates,\n        top_n=top_n,\n    )\n    return [candidates[r.index] for r in response.results]\n\n# Alternative: local reranker (no API cost)\nfrom sentence_transformers import CrossEncoder\nreranker = CrossEncoder(\"cross-encoder\u002Fms-marco-MiniLM-L-6-v2\")\n\ndef local_rerank(query: str, candidates: list[str], top_n: int = 5) -> list[str]:\n    pairs = [[query, c] for c in candidates]\n    scores = reranker.predict(pairs)\n    ranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)\n    return [text for text, _ in ranked[:top_n]]\n```\n\n## RAG Query Pipeline\n\n```python\nimport os\nfrom openai import OpenAI\n\nllm = OpenAI(base_url=\"http:\u002F\u002Flocalhost:8000\u002Fv1\", api_key=os.environ[\"LOCAL_LLM_API_KEY\"])  # Configure actual endpoint authentication.\n\ndef rag_query(user_question: str) -> str:\n    # 1. Retrieve\n    candidates = hybrid_search(user_question, top_k=20)\n    texts = [c[\"text\"] for c in candidates]\n\n    # 2. Rerank\n    top_chunks = local_rerank(user_question, texts, top_n=5)\n\n    # 3. Generate\n    context = \"\\n\\n---\\n\\n\".join(top_chunks)\n    response = llm.chat.completions.create(\n        model=\"meta-llama\u002FLlama-3.1-8B-Instruct\",\n        messages=[\n            {\"role\": \"system\", \"content\": (\n                \"Answer the question using only the provided context. \"\n                \"If the answer isn't in the context, say so.\\n\\nContext:\\n\" + context\n            )},\n            {\"role\": \"user\", \"content\": user_question},\n        ],\n        temperature=0.1,\n        max_tokens=1024,\n    )\n    return response.choices[0].message.content\n```\n\n## Docker Compose: Full RAG Stack\n\n```yaml\nservices:\n  qdrant:\n    image: qdrant\u002Fqdrant:latest\n    volumes:\n      - qdrant-data:\u002Fqdrant\u002Fstorage\n    ports:\n      - \"127.0.0.1:6333:6333\"\n    restart: unless-stopped\n\n  redis:\n    image: redis:7-alpine\n    volumes:\n      - redis-data:\u002Fdata\n    restart: unless-stopped\n\n  ingestion-worker:\n    build: .\u002Fingestion\n    environment:\n      - QDRANT_URL=http:\u002F\u002Fqdrant:6333\n      - REDIS_URL=redis:\u002F\u002Fredis:6379\n    depends_on: [qdrant, redis]\n    restart: unless-stopped\n\n  rag-api:\n    build: .\u002Fapi\n    ports:\n      - \"8080:8080\"\n    environment:\n      - QDRANT_URL=http:\u002F\u002Fqdrant:6333\n      - LLM_BASE_URL=http:\u002F\u002Fvllm:8000\u002Fv1\n    depends_on: [qdrant]\n    restart: unless-stopped\n\nvolumes:\n  qdrant-data:\n  redis-data:\n```\n\n## Common Issues\n\n| Issue | Cause | Fix |\n|-------|-------|-----|\n| Poor retrieval quality | Chunk size too large | Try 256–512 tokens; overlap 10–15% |\n| LLM ignores retrieved context | Context too long | Rerank and keep top 3–5 chunks |\n| Slow ingestion | Sequential embedding | Use `batch_size=64` and async upserts |\n| Stale documents | No re-ingestion pipeline | Track `doc_hash`; re-embed on change |\n| High embedding costs | All chunks re-embedded | Cache embeddings with hash-based dedup |\n\n## Best Practices\n\n- Use `BAAI\u002Fbge-large-en-v1.5` or `nomic-embed-text` for strong free embeddings.\n- Always rerank before passing to LLM — 5 precise chunks beat 20 noisy ones.\n- Store source metadata (URL, page, section) in vector payloads for citations.\n- Use namespace\u002Ftenant isolation in the vector store for multi-tenant RAG.\n- Evaluate with RAGAS metrics: faithfulness, answer relevancy, context precision.\n\n## Related Skills\n\n- vector-database-ops (`vector-database-ops`) - Qdrant\u002FWeaviate management\n- vllm-server (`vllm-server`) - Self-hosted LLM endpoint\n- ollama-stack (`ollama-stack`) - Local LLM for development\n- ai-pipeline-orchestration (`ai-pipeline-orchestration`) - Ingestion pipelines\n\n## Limitations\n\n- Infrastructure commands can disrupt services: confirm target host\u002Fscope and have backups\u002Fsnapshots before mutating state.\n- Docs-only import: upstream scripts and templates not bundled.\n\n","# RAG Infrastructure\n\nProduction infrastructure for Retrieval-Augmented Generation: ingest documents, generate embeddings, store in vector databases, and serve grounded LLM responses.\n\n## When to Use This Skill\n\nUse this skill when:\n- Building a knowledge base Q&A system over internal documents\n- Implementing semantic search over large document collections\n- Reducing LLM hallucinations with retrieved context\n- Setting up embedding pipelines and vector store infrastructure\n- Deploying hybrid search (dense + sparse\u002FBM25)\n\n## Prerequisites\n\n- Python 3.10+ with `pip`\n- A vector database (Qdrant, Weaviate, Pinecone, or pgvector)\n- An embedding model (OpenAI, Cohere, or local via `sentence-transformers`)\n- An LLM endpoint (OpenAI API or self-hosted vLLM)\n- Docker for local vector DB deployment\n\n## Architecture Overview\n\n```\nDocuments → Chunker → Embedder → Vector Store\n                                      ↓\nUser Query → Embedder → Vector Store (search) → Reranker → LLM → Answer\n```\n\n## Example completeness and data boundaries\n\nThe Compose example requires user-supplied `ingestion\u002F` and `api\u002F` builds plus a configured `vllm` endpoint\u002Fservice; they are not bundled. Dense and sparse vectors must both be ingested into `hybrid-kb` before hybrid search; the earlier ingestion targets a different collection. SPLADE is learned sparse retrieval, not BM25. Match client\u002Flibrary versions before running snippets.\n\nEnforce document\u002Ftenant permissions in retrieval before reranking\u002Fgeneration, not only in the prompt. Retrieved content is untrusted data and cannot authorize tools or override instructions; keep it separate from trusted system rules. External embeddings\u002Frerankers transmit document text and require sharing authorization. Use stable chunk IDs and deletion\u002Fupdate handling rather than random IDs when re-ingestion must be idempotent.\n\n## Embedding Pipeline\n\n```python\nfrom sentence_transformers import SentenceTransformer\nfrom qdrant_client import QdrantClient\nfrom qdrant_client.models import Distance, VectorParams, PointStruct\nimport uuid\n\n# Local embedding model (no API cost)\nmodel = SentenceTransformer(\"BAAI\u002Fbge-large-en-v1.5\")\n\n# Connect to Qdrant\nclient = QdrantClient(\"http:\u002F\u002Flocalhost:6333\")\n\n# Create collection\nclient.create_collection(\n    collection_name=\"knowledge-base\",\n    vectors_config=VectorParams(size=1024, distance=Distance.COSINE),\n)\n\ndef ingest_documents(docs: list[dict]):\n    \"\"\"Chunk, embed, and upsert documents.\"\"\"\n    points = []\n    for doc in docs:\n        chunks = chunk_text(doc[\"text\"], chunk_size=512, overlap=50)\n        embeddings = model.encode(chunks, batch_size=32, show_progress_bar=True)\n        for chunk, embedding in zip(chunks, embeddings):\n            points.append(PointStruct(\n                id=str(uuid.uuid4()),\n                vector=embedding.tolist(),\n                payload={\"text\": chunk, \"source\": doc[\"source\"], \"title\": doc[\"title\"]},\n            ))\n    client.upsert(collection_name=\"knowledge-base\", points=points)\n    print(f\"Ingested {len(points)} chunks\")\n```\n\n## Chunking Strategies\n\n```python\nfrom langchain.text_splitter import RecursiveCharacterTextSplitter\n\ndef chunk_text(text: str, chunk_size: int = 512, overlap: int = 50) -> list[str]:\n    \"\"\"Recursive character splitter — best general-purpose strategy.\"\"\"\n    splitter = RecursiveCharacterTextSplitter(\n        chunk_size=chunk_size,\n        chunk_overlap=overlap,\n        separators=[\"\\n\\n\", \"\\n\", \". \", \" \", \"\"],\n    )\n    return splitter.split_text(text)\n\n# For code\u002Fmarkdown — use language-aware splitter\nfrom langchain.text_splitter import MarkdownHeaderTextSplitter\n\nheaders = [(\"#\", \"H1\"), (\"##\", \"H2\"), (\"###\", \"H3\")]\nmd_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers)\n```\n\n## Hybrid Search (Dense + Sparse)\n\n```python\nfrom qdrant_client.models import SparseVector, SparseVectorParams, NamedSparseVector\nfrom fastembed import SparseTextEmbedding\n\n# Qdrant hybrid collection (dense + BM25 sparse)\nclient.create_collection(\n    collection_name=\"hybrid-kb\",\n    vectors_config={\"dense\": VectorParams(size=1024, distance=Distance.COSINE)},\n    sparse_vectors_config={\"sparse\": SparseVectorParams()},\n)\n\nsparse_model = SparseTextEmbedding(\"prithivida\u002FSplade_PP_en_v1\")\n\ndef hybrid_search(query: str, top_k: int = 10) -> list[dict]:\n    dense_vec = model.encode(query).tolist()\n    sparse_vec = list(sparse_model.embed(query))[0]\n\n    results = client.query_points(\n        collection_name=\"hybrid-kb\",\n        prefetch=[\n            {\"query\": dense_vec, \"using\": \"dense\", \"limit\": 20},\n            {\"query\": SparseVector(indices=sparse_vec.indices.tolist(),\n                                   values=sparse_vec.values.tolist()),\n             \"using\": \"sparse\", \"limit\": 20},\n        ],\n        query={\"fusion\": \"rrf\"},   # Reciprocal Rank Fusion\n        limit=top_k,\n    )\n    return [{\"text\": p.payload[\"text\"], \"score\": p.score} for p in results.points]\n```\n\n## Reranking\n\n```python\nimport cohere\n\nco = cohere.Client(\"your-api-key\")\n\ndef rerank(query: str, candidates: list[str], top_n: int = 5) -> list[str]:\n    \"\"\"Rerank retrieved chunks for relevance (evaluate quality on a representative labeled set).\"\"\"\n    response = co.rerank(\n        model=\"rerank-english-v3.0\",\n        query=query,\n        documents=candidates,\n        top_n=top_n,\n    )\n    return [candidates[r.index] for r in response.results]\n\n# Alternative: local reranker (no API cost)\nfrom sentence_transformers import CrossEncoder\nreranker = CrossEncoder(\"cross-encoder\u002Fms-marco-MiniLM-L-6-v2\")\n\ndef local_rerank(query: str, candidates: list[str], top_n: int = 5) -> list[str]:\n    pairs = [[query, c] for c in candidates]\n    scores = reranker.predict(pairs)\n    ranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)\n    return [text for text, _ in ranked[:top_n]]\n```\n\n## RAG Query Pipeline\n\n```python\nimport os\nfrom openai import OpenAI\n\nllm = OpenAI(base_url=\"http:\u002F\u002Flocalhost:8000\u002Fv1\", api_key=os.environ[\"LOCAL_LLM_API_KEY\"])  # Configure actual endpoint authentication.\n\ndef rag_query(user_question: str) -> str:\n    # 1. Retrieve\n    candidates = hybrid_search(user_question, top_k=20)\n    texts = [c[\"text\"] for c in candidates]\n\n    # 2. Rerank\n    top_chunks = local_rerank(user_question, texts, top_n=5)\n\n    # 3. Generate\n    context = \"\\n\\n---\\n\\n\".join(top_chunks)\n    response = llm.chat.completions.create(\n        model=\"meta-llama\u002FLlama-3.1-8B-Instruct\",\n        messages=[\n            {\"role\": \"system\", \"content\": (\n                \"Answer the question using only the provided context. \"\n                \"If the answer isn't in the context, say so.\\n\\nContext:\\n\" + context\n            )},\n            {\"role\": \"user\", \"content\": user_question},\n        ],\n        temperature=0.1,\n        max_tokens=1024,\n    )\n    return response.choices[0].message.content\n```\n\n## Docker Compose: Full RAG Stack\n\n```yaml\nservices:\n  qdrant:\n    image: qdrant\u002Fqdrant:latest\n    volumes:\n      - qdrant-data:\u002Fqdrant\u002Fstorage\n    ports:\n      - \"127.0.0.1:6333:6333\"\n    restart: unless-stopped\n\n  redis:\n    image: redis:7-alpine\n    volumes:\n      - redis-data:\u002Fdata\n    restart: unless-stopped\n\n  ingestion-worker:\n    build: .\u002Fingestion\n    environment:\n      - QDRANT_URL=http:\u002F\u002Fqdrant:6333\n      - REDIS_URL=redis:\u002F\u002Fredis:6379\n    depends_on: [qdrant, redis]\n    restart: unless-stopped\n\n  rag-api:\n    build: .\u002Fapi\n    ports:\n      - \"8080:8080\"\n    environment:\n      - QDRANT_URL=http:\u002F\u002Fqdrant:6333\n      - LLM_BASE_URL=http:\u002F\u002Fvllm:8000\u002Fv1\n    depends_on: [qdrant]\n    restart: unless-stopped\n\nvolumes:\n  qdrant-data:\n  redis-data:\n```\n\n## Common Issues\n\n| Issue | Cause | Fix |\n|-------|-------|-----|\n| Poor retrieval quality | Chunk size too large | Try 256–512 tokens; overlap 10–15% |\n| LLM ignores retrieved context | Context too long | Rerank and keep top 3–5 chunks |\n| Slow ingestion | Sequential embedding | Use `batch_size=64` and async upserts |\n| Stale documents | No re-ingestion pipeline | Track `doc_hash`; re-embed on change |\n| High embedding costs | All chunks re-embedded | Cache embeddings with hash-based dedup |\n\n## Best Practices\n\n- Use `BAAI\u002Fbge-large-en-v1.5` or `nomic-embed-text` for strong free embeddings.\n- Always rerank before passing to LLM — 5 precise chunks beat 20 noisy ones.\n- Store source metadata (URL, page, section) in vector payloads for citations.\n- Use namespace\u002Ftenant isolation in the vector store for multi-tenant RAG.\n- Evaluate with RAGAS metrics: faithfulness, answer relevancy, context precision.\n\n## Related Skills\n\n- vector-database-ops (`vector-database-ops`) - Qdrant\u002FWeaviate management\n- vllm-server (`vllm-server`) - Self-hosted LLM endpoint\n- ollama-stack (`ollama-stack`) - Local LLM for development\n- ai-pipeline-orchestration (`ai-pipeline-orchestration`) - Ingestion pipelines\n\n## Limitations\n\n- Infrastructure commands can disrupt services: confirm target host\u002Fscope and have backups\u002Fsnapshots before mutating state.\n- Docs-only import: upstream scripts and templates not bundled.\n\n",{"name":5,"risk":28,"source":44,"license":14,"category":45,"metadata":46,"date_added":49,"description":7,"source_repo":50,"source_type":32,"compatibility":51,"license_source":52},"https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills","devops",{"author":47,"version":48},"devops-skills","1.0","2026-09-20","BagelHole\u002FDevOps-Security-Agent-Skills","Requires the relevant OS\u002Fplatform tooling and privileged access where noted. Docs-only; helper scripts and templates not bundled.","https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE","7bf2279c8a65758319526a721d5c4b75683aec9c","skills\u002Fantigravity-rag-infrastructure",3,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections","https:\u002F\u002Fgithub.com\u002Fboisenoise","2026-11-10 14:20:15",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add boisenoise\u002Fskills-collections --skill rag-infrastructure",{"tool":65,"command":66},"bunx","bunx skills add boisenoise\u002Fskills-collections --skill rag-infrastructure",{"tool":68,"command":69},"pnpm","pnpm dlx skills add boisenoise\u002Fskills-collections --skill rag-infrastructure","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rag-infrastructure\u002FSKILL.md",true,[],[74,98,126,152,171,194],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":78,"licenseFileUrl":79,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":39},"01M6WNH92BHVFXHGPDZCPJ0AG0","web-access","Use Treg for public web or platform data only when existing search, browser and connected tools cannot cover the task, with explicit cost and data boundaries.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FSKILL.md",[],[83,35,84,85,86,87,38,88,89,90,91,33,92,93,30,28,94,95,96,97,21],"web","web access","official","development","browser","data","Tools","read","fetch","youtube","free tools","free","cover","normal","when",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":78,"licenseFileUrl":102,"sourceHtmlUrl":103,"categories":104,"keywords":110,"publishedAt":39},"01M6WNF9XAYAB2CZDDJBAKNM93","treg","Use the Treg CLI or MCP catalog to discover, price and call authorized external tools with team-scoped credentials and a user-approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FSKILL.md",[105],{"categoryNo":106,"categoryName":107,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[100,111,112,113,85,86,114,89,115,116,117,118,119,120,121,28,122,123,124,125,21],"MCP","cli","github","license","Budget","credentials","team","catalog","use","call","discover","external tools","with","scoped","blob",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":78,"licenseFileUrl":130,"sourceHtmlUrl":131,"categories":132,"keywords":138,"publishedAt":39},"01M6WN93MEAZ4E41DYAHJRPHQT","recruit","Turn a job description into an evidence-linked candidate shortlist through Treg, with job-related ranking and optional authorized business contact enrichment.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FSKILL.md",[133],{"categoryNo":134,"categoryName":135,"taxonomyType":136,"taxonomyTypeDesc":137},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[128,113,85,114,139,140,141,142,143,144,28,145,146,147,123,148,149,150,151,125,100,21],"https","email","enrichment","business","evidence","phone","ranking","post","job description","for","person","candidate","reason",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":78,"licenseFileUrl":156,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":39},"01M6WN8R5RXSMHM9B4D9FAFX42","rea-growth","Analyze a company’s public growth and content through Treg, distinguish observations from hypotheses, and produce an evidence-linked playbook within an approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FSKILL.md",[],[160,161,162,113,85,114,163,164,139,165,115,166,167,168,143,28,169,170,125,100,21],"growth","rea","rea growth","produce","content","playbook","marketing","analyze","public","observations","company",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":78,"licenseFileUrl":175,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":39},"01M6WN2EVE3RQRGWAKBT4S7YT2","make-ugc","Create original AI UGC-style product videos through Treg: research hooks, approve a licensed presenter and voice, generate clips, add captions and report costs.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FSKILL.md",[],[179,180,113,181,85,182,114,183,184,185,186,187,28,188,189,190,191,192,193,125],"make","make ugc","research","create","Video","Captions","ads","short","hooks","head","style","niche","trending","talking-head","approve",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":78,"licenseFileUrl":198,"sourceHtmlUrl":199,"categories":200,"keywords":201,"publishedAt":39},"01M6WN10ARAA63Y8K1YNGXJ2RM","lead-signals","Find and qualify public buying signals through Treg, rank fitting business accounts and optionally enrich authorized business contact information.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FSKILL.md",[],[202,203,204,113,85,114,205,206,142,207,208,28,209,210,211,212,213,214,215,125],"signals","lead","lead signals","how","find","ready","as","how to","qualify","people","information","enrich","changes","funding"]