{"id":"bf546a2b-101a-4942-bd32-d7a8f4ff061e","shortId":"Hj96fN","kind":"skill","title":"llm-app-patterns","tagline":"Production-ready patterns for building LLM applications, inspired by [Dify](https://github.com/langgenius/dify) and industry best practices.","description":"# 🤖 LLM Application Patterns\n\n> Production-ready patterns for building LLM applications, inspired by [Dify](https://github.com/langgenius/dify) and industry best practices.\n\n## When to Use This Skill\n\nUse this skill when:\n\n- Designing LLM-powered applications\n- Implementing RAG (Retrieval-Augmented Generation)\n- Building AI agents with tools\n- Setting up LLMOps monitoring\n- Choosing between agent architectures\n\n---\n\n## 1. RAG Pipeline Architecture\n\n### Overview\n\nRAG (Retrieval-Augmented Generation) grounds LLM responses in your data.\n\n```\n┌─────────────┐     ┌─────────────┐     ┌─────────────┐\n│   Ingest    │────▶│   Retrieve  │────▶│   Generate  │\n│  Documents  │     │   Context   │     │   Response  │\n└─────────────┘     └─────────────┘     └─────────────┘\n      │                   │                   │\n      ▼                   ▼                   ▼\n ┌─────────┐       ┌───────────┐       ┌───────────┐\n │ Chunking│       │  Vector   │       │    LLM    │\n │Embedding│       │  Search   │       │  + Context│\n └─────────┘       └───────────┘       └───────────┘\n```\n\n### 1.1 Document Ingestion\n\n```python\n# Chunking strategies\nclass ChunkingStrategy:\n    # Fixed-size chunks (simple but may break context)\n    FIXED_SIZE = \"fixed_size\"  # e.g., 512 tokens\n\n    # Semantic chunking (preserves meaning)\n    SEMANTIC = \"semantic\"      # Split on paragraphs/sections\n\n    # Recursive splitting (tries multiple separators)\n    RECURSIVE = \"recursive\"    # [\"\\n\\n\", \"\\n\", \" \", \"\"]\n\n    # Document-aware (respects structure)\n    DOCUMENT_AWARE = \"document_aware\"  # Headers, lists, etc.\n\n# Recommended settings\nCHUNK_CONFIG = {\n    \"chunk_size\": 512,       # tokens\n    \"chunk_overlap\": 50,     # token overlap between chunks\n    \"separators\": [\"\\n\\n\", \"\\n\", \". \", \" \"],\n}\n```\n\n### 1.2 Embedding & Storage\n\n```python\n# Vector database selection\nVECTOR_DB_OPTIONS = {\n    \"pinecone\": {\n        \"use_case\": \"Production, managed service\",\n        \"scale\": \"Billions of vectors\",\n        \"features\": [\"Hybrid search\", \"Metadata filtering\"]\n    },\n    \"weaviate\": {\n        \"use_case\": \"Self-hosted, multi-modal\",\n        \"scale\": \"Millions of vectors\",\n        \"features\": [\"GraphQL API\", \"Modules\"]\n    },\n    \"chromadb\": {\n        \"use_case\": \"Development, prototyping\",\n        \"scale\": \"Thousands of vectors\",\n        \"features\": [\"Simple API\", \"In-memory option\"]\n    },\n    \"pgvector\": {\n        \"use_case\": \"Existing Postgres infrastructure\",\n        \"scale\": \"Millions of vectors\",\n        \"features\": [\"SQL integration\", \"ACID compliance\"]\n    }\n}\n\n# Embedding model selection\nEMBEDDING_MODELS = {\n    \"openai/text-embedding-3-small\": {\n        \"dimensions\": 1536,\n        \"cost\": \"$0.02/1M tokens\",\n        \"quality\": \"Good for most use cases\"\n    },\n    \"openai/text-embedding-3-large\": {\n        \"dimensions\": 3072,\n        \"cost\": \"$0.13/1M tokens\",\n        \"quality\": \"Best for complex queries\"\n    },\n    \"local/bge-large\": {\n        \"dimensions\": 1024,\n        \"cost\": \"Free (compute only)\",\n        \"quality\": \"Comparable to OpenAI small\"\n    }\n}\n```\n\n### 1.3 Retrieval Strategies\n\n```python\n# Basic semantic search\ndef semantic_search(query: str, top_k: int = 5):\n    query_embedding = embed(query)\n    results = vector_db.similarity_search(\n        query_embedding,\n        top_k=top_k\n    )\n    return results\n\n# Hybrid search (semantic + keyword)\ndef hybrid_search(query: str, top_k: int = 5, alpha: float = 0.5):\n    \"\"\"\n    alpha=1.0: Pure semantic\n    alpha=0.0: Pure keyword (BM25)\n    alpha=0.5: Balanced\n    \"\"\"\n    semantic_results = vector_db.similarity_search(query)\n    keyword_results = bm25_search(query)\n\n    # Reciprocal Rank Fusion\n    return rrf_merge(semantic_results, keyword_results, alpha)\n\n# Multi-query retrieval\ndef multi_query_retrieval(query: str):\n    \"\"\"Generate multiple query variations for better recall\"\"\"\n    queries = llm.generate_query_variations(query, n=3)\n    all_results = []\n    for q in queries:\n        all_results.extend(semantic_search(q))\n    return deduplicate(all_results)\n\n# Contextual compression\ndef compressed_retrieval(query: str):\n    \"\"\"Retrieve then compress to relevant parts only\"\"\"\n    docs = semantic_search(query, top_k=10)\n    compressed = llm.extract_relevant_parts(docs, query)\n    return compressed\n```\n\n### 1.4 Generation with Context\n\n```python\nRAG_PROMPT_TEMPLATE = \"\"\"\nAnswer the user's question based ONLY on the following context.\nIf the context doesn't contain enough information, say \"I don't have enough information to answer that.\"\n\nContext:\n{context}\n\nQuestion: {question}\n\nAnswer:\"\"\"\n\ndef generate_with_rag(question: str):\n    # Retrieve\n    context_docs = hybrid_search(question, top_k=5)\n    context = \"\\n\\n\".join([doc.content for doc in context_docs])\n\n    # Generate\n    prompt = RAG_PROMPT_TEMPLATE.format(\n        context=context,\n        question=question\n    )\n\n    response = llm.generate(prompt)\n\n    # Return with citations\n    return {\n        \"answer\": response,\n        \"sources\": [doc.metadata for doc in context_docs]\n    }\n```\n\n---\n\n## 2. Agent Architectures\n\n### 2.1 ReAct Pattern (Reasoning + Acting)\n\n```\nThought: I need to search for information about X\nAction: search(\"X\")\nObservation: [search results]\nThought: Based on the results, I should...\nAction: calculate(...)\nObservation: [calculation result]\nThought: I now have enough information\nAction: final_answer(\"The answer is...\")\n```\n\n```python\nREACT_PROMPT = \"\"\"\nYou are an AI assistant that can use tools to answer questions.\n\nAvailable tools:\n{tools_description}\n\nUse this format:\nThought: [your reasoning about what to do next]\nAction: [tool_name(arguments)]\nObservation: [tool result - this will be filled in]\n... (repeat Thought/Action/Observation as needed)\nThought: I have enough information to answer\nFinal Answer: [your final response]\n\nQuestion: {question}\n\"\"\"\n\nclass ReActAgent:\n    def __init__(self, tools: list, llm):\n        self.tools = {t.name: t for t in tools}\n        self.llm = llm\n        self.max_iterations = 10\n\n    def run(self, question: str) -> str:\n        prompt = REACT_PROMPT.format(\n            tools_description=self._format_tools(),\n            question=question\n        )\n\n        for _ in range(self.max_iterations):\n            response = self.llm.generate(prompt)\n\n            if \"Final Answer:\" in response:\n                return self._extract_final_answer(response)\n\n            action = self._parse_action(response)\n            observation = self._execute_tool(action)\n            prompt += f\"\\nObservation: {observation}\\n\"\n\n        return \"Max iterations reached\"\n```\n\n### 2.2 Function Calling Pattern\n\n```python\n# Define tools as functions with schemas\nTOOLS = [\n    {\n        \"name\": \"search_web\",\n        \"description\": \"Search the web for current information\",\n        \"parameters\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"query\": {\n                    \"type\": \"string\",\n                    \"description\": \"Search query\"\n                }\n            },\n            \"required\": [\"query\"]\n        }\n    },\n    {\n        \"name\": \"calculate\",\n        \"description\": \"Perform mathematical calculations\",\n        \"parameters\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"expression\": {\n                    \"type\": \"string\",\n                    \"description\": \"Math expression to evaluate\"\n                }\n            },\n            \"required\": [\"expression\"]\n        }\n    }\n]\n\nclass FunctionCallingAgent:\n    def run(self, question: str) -> str:\n        messages = [{\"role\": \"user\", \"content\": question}]\n\n        while True:\n            response = self.llm.chat(\n                messages=messages,\n                tools=TOOLS,\n                tool_choice=\"auto\"\n            )\n\n            if response.tool_calls:\n                for tool_call in response.tool_calls:\n                    result = self._execute_tool(\n                        tool_call.name,\n                        tool_call.arguments\n                    )\n                    messages.append({\n                        \"role\": \"tool\",\n                        \"tool_call_id\": tool_call.id,\n                        \"content\": str(result)\n                    })\n            else:\n                return response.content\n```\n\n### 2.3 Plan-and-Execute Pattern\n\n```python\nclass PlanAndExecuteAgent:\n    \"\"\"\n    1. Create a plan (list of steps)\n    2. Execute each step\n    3. Replan if needed\n    \"\"\"\n\n    def run(self, task: str) -> str:\n        # Planning phase\n        plan = self.planner.create_plan(task)\n        # Returns: [\"Step 1: ...\", \"Step 2: ...\", ...]\n\n        results = []\n        for step in plan:\n            # Execute each step\n            result = self.executor.execute(step, context=results)\n            results.append(result)\n\n            # Check if replan needed\n            if self._needs_replan(task, results):\n                new_plan = self.planner.replan(\n                    task,\n                    completed=results,\n                    remaining=plan[len(results):]\n                )\n                plan = new_plan\n\n        # Synthesize final answer\n        return self.synthesizer.summarize(task, results)\n```\n\n### 2.4 Multi-Agent Collaboration\n\n```python\nclass AgentTeam:\n    \"\"\"\n    Specialized agents collaborating on complex tasks\n    \"\"\"\n\n    def __init__(self):\n        self.agents = {\n            \"researcher\": ResearchAgent(),\n            \"analyst\": AnalystAgent(),\n            \"writer\": WriterAgent(),\n            \"critic\": CriticAgent()\n        }\n        self.coordinator = CoordinatorAgent()\n\n    def solve(self, task: str) -> str:\n        # Coordinator assigns subtasks\n        assignments = self.coordinator.decompose(task)\n\n        results = {}\n        for assignment in assignments:\n            agent = self.agents[assignment.agent]\n            result = agent.execute(\n                assignment.subtask,\n                context=results\n            )\n            results[assignment.id] = result\n\n        # Critic reviews\n        critique = self.agents[\"critic\"].review(results)\n\n        if critique.needs_revision:\n            # Iterate with feedback\n            return self.solve_with_feedback(task, results, critique)\n\n        return self.coordinator.synthesize(results)\n```\n\n---\n\n## 3. Prompt IDE Patterns\n\n### 3.1 Prompt Templates with Variables\n\n```python\nclass PromptTemplate:\n    def __init__(self, template: str, variables: list[str]):\n        self.template = template\n        self.variables = variables\n\n    def format(self, **kwargs) -> str:\n        # Validate all variables provided\n        missing = set(self.variables) - set(kwargs.keys())\n        if missing:\n            raise ValueError(f\"Missing variables: {missing}\")\n\n        return self.template.format(**kwargs)\n\n    def with_examples(self, examples: list[dict]) -> str:\n        \"\"\"Add few-shot examples\"\"\"\n        example_text = \"\\n\\n\".join([\n            f\"Input: {ex['input']}\\nOutput: {ex['output']}\"\n            for ex in examples\n        ])\n        return f\"{example_text}\\n\\n{self.template}\"\n\n# Usage\nsummarizer = PromptTemplate(\n    template=\"Summarize the following text in {style} style:\\n\\n{text}\",\n    variables=[\"style\", \"text\"]\n)\n\nprompt = summarizer.format(\n    style=\"professional\",\n    text=\"Long article content...\"\n)\n```\n\n### 3.2 Prompt Versioning & A/B Testing\n\n```python\nclass PromptRegistry:\n    def __init__(self, db):\n        self.db = db\n\n    def register(self, name: str, template: str, version: str):\n        \"\"\"Store prompt with version\"\"\"\n        self.db.save({\n            \"name\": name,\n            \"template\": template,\n            \"version\": version,\n            \"created_at\": datetime.now(),\n            \"metrics\": {}\n        })\n\n    def get(self, name: str, version: str = \"latest\") -> str:\n        \"\"\"Retrieve specific version\"\"\"\n        return self.db.get(name, version)\n\n    def ab_test(self, name: str, user_id: str) -> str:\n        \"\"\"Return variant based on user bucket\"\"\"\n        variants = self.db.get_all_versions(name)\n        bucket = hash(user_id) % len(variants)\n        return variants[bucket]\n\n    def record_outcome(self, prompt_id: str, outcome: dict):\n        \"\"\"Track prompt performance\"\"\"\n        self.db.update_metrics(prompt_id, outcome)\n```\n\n### 3.3 Prompt Chaining\n\n```python\nclass PromptChain:\n    \"\"\"\n    Chain prompts together, passing output as input to next\n    \"\"\"\n\n    def __init__(self, steps: list[dict]):\n        self.steps = steps\n\n    def run(self, initial_input: str) -> dict:\n        context = {\"input\": initial_input}\n        results = []\n\n        for step in self.steps:\n            prompt = step[\"prompt\"].format(**context)\n            output = llm.generate(prompt)\n\n            # Parse output if needed\n            if step.get(\"parser\"):\n                output = step\"parser\"\n\n            context[step[\"output_key\"]] = output\n            results.append({\n                \"step\": step[\"name\"],\n                \"output\": output\n            })\n\n        return {\n            \"final_output\": context[self.steps[-1][\"output_key\"]],\n            \"intermediate_results\": results\n        }\n\n# Example: Research → Analyze → Summarize\nchain = PromptChain([\n    {\n        \"name\": \"research\",\n        \"prompt\": \"Research the topic: {input}\",\n        \"output_key\": \"research\"\n    },\n    {\n        \"name\": \"analyze\",\n        \"prompt\": \"Analyze these findings:\\n{research}\",\n        \"output_key\": \"analysis\"\n    },\n    {\n        \"name\": \"summarize\",\n        \"prompt\": \"Summarize this analysis in 3 bullet points:\\n{analysis}\",\n        \"output_key\": \"summary\"\n    }\n])\n```\n\n---\n\n## 4. LLMOps & Observability\n\n### 4.1 Metrics to Track\n\n```python\nLLM_METRICS = {\n    # Performance\n    \"latency_p50\": \"50th percentile response time\",\n    \"latency_p99\": \"99th percentile response time\",\n    \"tokens_per_second\": \"Generation speed\",\n\n    # Quality\n    \"user_satisfaction\": \"Thumbs up/down ratio\",\n    \"task_completion\": \"% tasks completed successfully\",\n    \"hallucination_rate\": \"% responses with factual errors\",\n\n    # Cost\n    \"cost_per_request\": \"Average $ per API call\",\n    \"tokens_per_request\": \"Average tokens used\",\n    \"cache_hit_rate\": \"% requests served from cache\",\n\n    # Reliability\n    \"error_rate\": \"% failed requests\",\n    \"timeout_rate\": \"% requests that timed out\",\n    \"retry_rate\": \"% requests needing retry\"\n}\n```\n\n### 4.2 Logging & Tracing\n\n```python\nimport logging\nfrom opentelemetry import trace\n\ntracer = trace.get_tracer(__name__)\n\nclass LLMLogger:\n    def log_request(self, request_id: str, data: dict):\n        \"\"\"Log LLM request for debugging and analysis\"\"\"\n        log_entry = {\n            \"request_id\": request_id,\n            \"timestamp\": datetime.now().isoformat(),\n            \"model\": data[\"model\"],\n            \"prompt\": data[\"prompt\"][:500],  # Truncate for storage\n            \"prompt_tokens\": data[\"prompt_tokens\"],\n            \"temperature\": data.get(\"temperature\", 1.0),\n            \"user_id\": data.get(\"user_id\"),\n        }\n        logging.info(f\"LLM_REQUEST: {json.dumps(log_entry)}\")\n\n    def log_response(self, request_id: str, data: dict):\n        \"\"\"Log LLM response\"\"\"\n        log_entry = {\n            \"request_id\": request_id,\n            \"completion_tokens\": data[\"completion_tokens\"],\n            \"total_tokens\": data[\"total_tokens\"],\n            \"latency_ms\": data[\"latency_ms\"],\n            \"finish_reason\": data[\"finish_reason\"],\n            \"cost_usd\": self._calculate_cost(data),\n        }\n        logging.info(f\"LLM_RESPONSE: {json.dumps(log_entry)}\")\n\n# Distributed tracing\n@tracer.start_as_current_span(\"llm_call\")\ndef call_llm(prompt: str) -> str:\n    span = trace.get_current_span()\n    span.set_attribute(\"prompt.length\", len(prompt))\n\n    response = llm.generate(prompt)\n\n    span.set_attribute(\"response.length\", len(response))\n    span.set_attribute(\"tokens.total\", response.usage.total_tokens)\n\n    return response.content\n```\n\n### 4.3 Evaluation Framework\n\n```python\nclass LLMEvaluator:\n    \"\"\"\n    Evaluate LLM outputs for quality\n    \"\"\"\n\n    def evaluate_response(self,\n                          question: str,\n                          response: str,\n                          ground_truth: str = None) -> dict:\n        scores = {}\n\n        # Relevance: Does it answer the question?\n        scores[\"relevance\"] = self._score_relevance(question, response)\n\n        # Coherence: Is it well-structured?\n        scores[\"coherence\"] = self._score_coherence(response)\n\n        # Groundedness: Is it based on provided context?\n        scores[\"groundedness\"] = self._score_groundedness(response)\n\n        # Accuracy: Does it match ground truth?\n        if ground_truth:\n            scores[\"accuracy\"] = self._score_accuracy(response, ground_truth)\n\n        # Harmfulness: Is it safe?\n        scores[\"safety\"] = self._score_safety(response)\n\n        return scores\n\n    def run_benchmark(self, test_cases: list[dict]) -> dict:\n        \"\"\"Run evaluation on test set\"\"\"\n        results = []\n        for case in test_cases:\n            response = llm.generate(case[\"prompt\"])\n            scores = self.evaluate_response(\n                question=case[\"prompt\"],\n                response=response,\n                ground_truth=case.get(\"expected\")\n            )\n            results.append(scores)\n\n        return self._aggregate_scores(results)\n```\n\n---\n\n## 5. Production Patterns\n\n### 5.1 Caching Strategy\n\n```python\nimport hashlib\nfrom functools import lru_cache\n\nclass LLMCache:\n    def __init__(self, redis_client, ttl_seconds=3600):\n        self.redis = redis_client\n        self.ttl = ttl_seconds\n\n    def _cache_key(self, prompt: str, model: str, **kwargs) -> str:\n        \"\"\"Generate deterministic cache key\"\"\"\n        content = f\"{model}:{prompt}:{json.dumps(kwargs, sort_keys=True)}\"\n        return hashlib.sha256(content.encode()).hexdigest()\n\n    def get_or_generate(self, prompt: str, model: str, **kwargs) -> str:\n        key = self._cache_key(prompt, model, **kwargs)\n\n        # Check cache\n        cached = self.redis.get(key)\n        if cached:\n            return cached.decode()\n\n        # Generate\n        response = llm.generate(prompt, model=model, **kwargs)\n\n        # Cache (only cache deterministic outputs)\n        if kwargs.get(\"temperature\", 1.0) == 0:\n            self.redis.setex(key, self.ttl, response)\n\n        return response\n```\n\n### 5.2 Rate Limiting & Retry\n\n```python\nimport time\nfrom tenacity import retry, wait_exponential, stop_after_attempt\n\nclass RateLimiter:\n    def __init__(self, requests_per_minute: int):\n        self.rpm = requests_per_minute\n        self.timestamps = []\n\n    def acquire(self):\n        \"\"\"Wait if rate limit would be exceeded\"\"\"\n        now = time.time()\n\n        # Remove old timestamps\n        self.timestamps = [t for t in self.timestamps if now - t < 60]\n\n        if len(self.timestamps) >= self.rpm:\n            sleep_time = 60 - (now - self.timestamps[0])\n            time.sleep(sleep_time)\n\n        self.timestamps.append(time.time())\n\n# Retry with exponential backoff\n@retry(\n    wait=wait_exponential(multiplier=1, min=4, max=60),\n    stop=stop_after_attempt(5)\n)\ndef call_llm_with_retry(prompt: str) -> str:\n    try:\n        return llm.generate(prompt)\n    except RateLimitError:\n        raise  # Will trigger retry\n    except APIError as e:\n        if e.status_code >= 500:\n            raise  # Retry server errors\n        raise  # Don't retry client errors\n```\n\n### 5.3 Fallback Strategy\n\n```python\nclass LLMWithFallback:\n    def __init__(self, primary: str, fallbacks: list[str]):\n        self.primary = primary\n        self.fallbacks = fallbacks\n\n    def generate(self, prompt: str, **kwargs) -> str:\n        models = [self.primary] + self.fallbacks\n\n        for model in models:\n            try:\n                return llm.generate(prompt, model=model, **kwargs)\n            except (RateLimitError, APIError) as e:\n                logging.warning(f\"Model {model} failed: {e}\")\n                continue\n\n        raise AllModelsFailedError(\"All models exhausted\")\n\n# Usage\nllm_client = LLMWithFallback(\n    primary=\"gpt-4-turbo\",\n    fallbacks=[\"gpt-3.5-turbo\", \"claude-3-sonnet\"]\n)\n```\n\n---\n\n## Architecture Decision Matrix\n\n| Pattern              | Use When         | Complexity | Cost      |\n| :------------------- | :--------------- | :--------- | :-------- |\n| **Simple RAG**       | FAQ, docs search | Low        | Low       |\n| **Hybrid RAG**       | Mixed queries    | Medium     | Medium    |\n| **ReAct Agent**      | Multi-step tasks | Medium     | Medium    |\n| **Function Calling** | Structured tools | Low        | Low       |\n| **Plan-Execute**     | Complex tasks    | High       | High      |\n| **Multi-Agent**      | Research tasks   | Very High  | Very High |\n\n---\n\n## Resources\n\n- [Dify Platform](https://github.com/langgenius/dify)\n- [LangChain Docs](https://python.langchain.com/)\n- [LlamaIndex](https://www.llamaindex.ai/)\n- [Anthropic Cookbook](https://github.com/anthropics/anthropic-cookbook)\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["llm","app","patterns","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-llm-app-patterns","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/llm-app-patterns","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34726 github stars · SKILL.md body (21,302 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T12:51:10.614Z","embedding":null,"createdAt":"2026-04-18T21:40:03.489Z","updatedAt":"2026-04-23T12:51:10.614Z","lastSeenAt":"2026-04-23T12:51:10.614Z","tsv":"'-1':1253 '-3':1964 '-3.5':1961 '-4':1957 '/)':2027,2031 '/1m':262,275 '/anthropics/anthropic-cookbook)':2036 '/langgenius/dify)':18,39,2022 '0':1763,1834 '0.0':346 '0.02':261 '0.13':274 '0.5':340,351 '1':77,815,844,1849 '1.0':342,1442,1762 '1.1':105 '1.2':179 '1.3':294 '1.4':441 '10':432,657 '1024':284 '1536':259 '2':531,822,846 '2.1':534 '2.2':702 '2.3':806 '2.4':890 '3':397,826,969,1293 '3.1':973 '3.2':1079 '3.3':1180 '3072':272 '3600':1688 '4':1301,1851 '4.1':1304 '4.2':1383 '4.3':1542 '5':309,337,497,1665,1858 '5.1':1668 '5.2':1770 '5.3':1895 '50':170 '500':1430,1884 '50th':1314 '512':127,166 '60':1824,1831,1853 '99th':1320 'a/b':1082 'ab':1134 'accuraci':1599,1609 'acid':250 'acquir':1801 'act':538 'action':548,561,572,608,687,692 'add':1026 'agent':66,75,532,893,899,935,1988,2010 'agent.execute':939 'agentteam':897 'ai':65,584 'all_results.extend':404 'allmodelsfailederror':1947 'alpha':338,341,345,350,373 'analysi':1285,1291,1297,1414 'analyst':910 'analystag':911 'analyz':1261,1276,1278 'answer':449,476,482,522,574,576,591,630,632,681,885,1570 'anthrop':2032 'api':219,232,1352 'apierror':1878,1936 'app':3 'applic':12,24,33,57 'architectur':76,80,533,1966 'argument':611 'articl':1077 'ask':2070 'assign':925,927,932,934 'assignment.agent':937 'assignment.id':944 'assignment.subtask':940 'assist':585 'attempt':1785,1857 'attribut':1523,1531,1536 'augment':62,85 'auto':779 'avail':593 'averag':1350,1357 'awar':150,154,156 'backoff':1843 'balanc':352 'base':454,555,1145,1591 'basic':298 'benchmark':1626 'best':21,42,278 'better':389 'billion':196 'bm25':349,360 'boundari':2078 'break':120 'bucket':1148,1154,1162 'build':10,31,64 'bullet':1294 'cach':1360,1366,1669,1678,1696,1707,1739,1740,1744,1754,1756 'cached.decode':1746 'calcul':562,564,737,741 'call':704,782,785,788,797,1353,1511,1513,1860,1996 'case':191,206,223,239,269,1629,1640,1643,1646,1652 'case.get':1658 'chain':1182,1186,1263 'check':862,1738 'choic':778 'choos':73 'chromadb':221 'chunk':99,109,116,130,162,164,168,174 'chunkingstrategi':112 'citat':520 'clarif':2072 'class':111,638,756,813,896,979,1085,1184,1397,1546,1679,1786,1899 'claud':1963 'clear':2045 'client':1685,1691,1893,1953 'code':1883 'coher':1578,1585 'collabor':894,900 'compar':290 'complet':874,1336,1338,1473,1476 'complex':280,902,1972,2004 'complianc':251 'compress':413,415,421,433,440 'comput':287 'config':163 'contain':465 'content':767,800,1078,1709 'content.encode':1720 'context':97,104,121,444,459,462,478,479,490,498,506,511,512,529,858,941,1210,1223,1237,1251,1594 'contextu':412 'continu':1945 'cookbook':2033 'coordin':924 'coordinatorag':917 'cost':260,273,285,1346,1347,1493,1973 'creat':816,1113 'criteria':2081 'critic':914,946,950 'criticag':915 'critiqu':948,965 'critique.needs':954 'current':722,1508,1520 'data':92,1406,1425,1428,1436,1462,1475,1480,1485,1490,1496 'data.get':1440,1445 'databas':184 'datetime.now':1115,1422 'db':187,1090,1092 'debug':1412 'decis':1967 'dedupl':409 'def':301,329,378,414,483,640,658,758,830,904,918,981,993,1018,1087,1093,1117,1133,1163,1195,1203,1399,1455,1512,1553,1624,1681,1695,1722,1788,1800,1859,1901,1913 'defin':707 'describ':2049 'descript':596,667,717,731,738,749 'design':53 'determinist':1706,1757 'develop':224 'dict':1024,1171,1200,1209,1407,1463,1565,1631,1632 'difi':15,36,2018 'dimens':258,271,283 'distribut':1504 'doc':426,437,491,504,507,527,530,1977,2024 'doc.content':502 'doc.metadata':525 'document':96,106,149,153,155 'document-awar':148 'doesn':463 'e':1880,1938,1944 'e.g':126 'e.status':1882 'els':803 'emb':312 'embed':102,180,252,255,311,318 'enough':466,473,570,627 'entri':1416,1454,1468,1503 'environ':2061 'environment-specif':2060 'error':1345,1368,1888,1894 'etc':159 'evalu':753,1543,1548,1554,1634 'ex':1038,1041,1044 'exampl':1020,1022,1030,1031,1046,1049,1259 'exceed':1809 'except':1871,1877,1934 'execut':810,823,852,2003 'exhaust':1950 'exist':240 'expect':1659 'expert':2066 'exponenti':1782,1842,1847 'express':746,751,755 'f':694,1011,1036,1048,1449,1498,1710,1940 'factual':1344 'fail':1370,1943 'fallback':1896,1906,1912,1959 'faq':1976 'featur':199,217,230,247 'feedback':958,962 'few-shot':1027 'fill':618 'filter':203 'final':573,631,634,680,884,1249 'find':1280 'finish':1488,1491 'fix':114,122,124 'fixed-s':113 'float':339 'follow':458,1060 'format':599,994,1222 'framework':1544 'free':286 'function':703,710,1995 'functioncallingag':757 'functool':1675 'fusion':365 'generat':63,86,95,384,442,484,508,1327,1705,1725,1747,1914 'get':1118,1723 'github.com':17,38,2021,2035 'github.com/anthropics/anthropic-cookbook)':2034 'github.com/langgenius/dify)':16,37,2020 'good':265 'gpt':1956,1960 'graphql':218 'ground':87,1561,1603,1606,1612,1656 'grounded':1588,1596 'hallucin':1340 'harm':1614 'hash':1155 'hashlib':1673 'hashlib.sha256':1719 'header':157 'hexdigest':1721 'high':2006,2007,2014,2016 'hit':1361 'host':209 'hybrid':200,325,330,492,1981 'id':798,1140,1157,1168,1178,1404,1418,1420,1444,1447,1460,1470,1472 'ide':971 'implement':58 'import':1387,1391,1672,1676,1775,1779 'in-memori':233 'industri':20,41 'inform':467,474,545,571,628,723 'infrastructur':242 'ingest':93,107 'init':641,905,982,1088,1196,1682,1789,1902 'initi':1206,1212 'input':1037,1039,1192,1207,1211,1213,1271,2075 'inspir':13,34 'int':308,336,1794 'integr':249 'intermedi':1256 'isoformat':1423 'iter':656,675,700,956 'join':501,1035 'json.dumps':1452,1501,1713 'k':307,320,322,335,431,496 'key':1240,1255,1273,1284,1299,1697,1708,1716,1733,1742,1765 'keyword':328,348,358,371 'kwarg':996,1017,1703,1714,1731,1737,1753,1918,1933 'kwargs.get':1760 'kwargs.keys':1006 'langchain':2023 'latenc':1312,1318,1483,1486 'latest':1124 'len':878,1158,1525,1533,1826 'limit':1772,1806,2037 'list':158,644,819,987,1023,1199,1630,1907 'llamaindex':2028 'llm':2,11,23,32,55,88,101,645,654,1309,1409,1450,1465,1499,1510,1514,1549,1861,1952 'llm-app-pattern':1 'llm-power':54 'llm.extract':434 'llm.generate':392,516,1225,1528,1645,1749,1869,1929 'llmcach':1680 'llmevalu':1547 'llmlogger':1398 'llmop':71,1302 'llmwithfallback':1900,1954 'local/bge-large':282 'log':1384,1388,1400,1408,1415,1453,1456,1464,1467,1502 'logging.info':1448,1497 'logging.warning':1939 'long':1076 'low':1979,1980,1999,2000 'lru':1677 'manag':193 'match':1602,2046 'math':750 'mathemat':740 'matrix':1968 'max':699,1852 'may':119 'mean':132 'medium':1985,1986,1993,1994 'memori':235 'merg':368 'messag':764,773,774 'messages.append':793 'metadata':202 'metric':1116,1176,1305,1310 'million':214,244 'min':1850 'minut':1793,1798 'miss':1002,1008,1012,1014,2083 'mix':1983 'modal':212 'model':253,256,1424,1426,1701,1711,1729,1736,1751,1752,1920,1924,1926,1931,1932,1941,1942,1949 'modul':220 'monitor':72 'ms':1484,1487 'multi':211,375,379,892,1990,2009 'multi-ag':891,2008 'multi-mod':210 'multi-queri':374 'multi-step':1989 'multipl':141,385 'multipli':1848 'n':145,146,147,176,177,178,396,499,500,697,1033,1034,1051,1052,1065,1066,1281,1296 'name':610,714,736,1096,1107,1108,1120,1131,1137,1153,1245,1265,1275,1286,1396 'need':541,623,829,865,1230,1381 'new':870,881 'next':607,1194 'nobserv':695 'none':1564 'noutput':1040 'object':726,744 'observ':551,563,612,690,696,1303 'old':1813 'openai':292 'openai/text-embedding-3-large':270 'openai/text-embedding-3-small':257 'opentelemetri':1390 'option':188,236 'outcom':1165,1170,1179 'output':1042,1190,1224,1228,1234,1239,1241,1246,1247,1250,1254,1272,1283,1298,1550,1758,2055 'overlap':169,172 'overview':81 'p50':1313 'p99':1319 'paragraphs/sections':137 'paramet':724,742 'pars':1227 'parser':1233,1236 'part':424,436 'pass':1189 'pattern':4,8,25,29,536,705,811,972,1667,1969 'per':1325,1348,1351,1355,1792,1797 'percentil':1315,1321 'perform':739,1174,1311 'permiss':2076 'pgvector':237 'phase':837 'pinecon':189 'pipelin':79 'plan':808,818,836,838,840,851,871,877,880,882,2002 'plan-and-execut':807 'plan-execut':2001 'planandexecuteag':814 'platform':2019 'point':1295 'postgr':241 'power':56 'practic':22,43 'preserv':131 'primari':1904,1910,1955 'product':6,27,192,1666 'production-readi':5,26 'profession':1074 'prompt':447,509,517,580,664,678,693,970,974,1071,1080,1103,1167,1173,1177,1181,1187,1219,1221,1226,1267,1277,1288,1427,1429,1434,1437,1515,1526,1529,1647,1653,1699,1712,1727,1735,1750,1864,1870,1916,1930 'prompt.length':1524 'promptchain':1185,1264 'promptregistri':1086 'prompttempl':980,1056 'properti':727,745 'prototyp':225 'provid':1001,1593 'pure':343,347 'python':108,182,297,445,578,706,812,895,978,1084,1183,1308,1386,1545,1671,1774,1898 'python.langchain.com':2026 'python.langchain.com/)':2025 'q':401,407 'qualiti':264,277,289,1329,1552 'queri':281,304,310,313,317,332,357,362,376,380,382,386,391,393,395,403,417,429,438,728,733,735,1984 'question':453,480,481,487,494,513,514,592,636,637,661,669,670,761,768,1557,1572,1576,1651 'rag':59,78,82,446,486,1975,1982 'rag_prompt_template.format':510 'rais':1009,1873,1885,1889,1946 'rang':673 'rank':364 'rate':1341,1362,1369,1373,1379,1771,1805 'ratelimit':1787 'ratelimiterror':1872,1935 'ratio':1334 'reach':701 'react':535,579,1987 'react_prompt.format':665 'reactag':639 'readi':7,28 'reason':537,602,1489,1492 'recal':390 'reciproc':363 'recommend':160 'record':1164 'recurs':138,143,144 'redi':1684,1690 'regist':1094 'relev':423,435,1567,1574 'reliabl':1367 'remain':876 'remov':1812 'repeat':620 'replan':827,864 'request':1349,1356,1363,1371,1374,1380,1401,1403,1410,1417,1419,1451,1459,1469,1471,1791,1796 'requir':734,754,2074 'research':908,1260,1266,1268,1274,1282,2011 'researchag':909 'resourc':2017 'respect':151 'respons':89,98,515,523,635,676,683,686,689,771,1316,1322,1342,1457,1466,1500,1527,1534,1555,1559,1577,1587,1598,1611,1621,1644,1650,1654,1655,1748,1767,1769 'response.content':805,1541 'response.length':1532 'response.tool':781,787 'response.usage.total':1538 'result':314,324,354,359,370,372,399,411,553,558,565,614,789,802,847,855,859,861,869,875,879,889,930,938,942,943,945,952,964,968,1214,1257,1258,1638,1664 'results.append':860,1242,1660 'retri':1378,1382,1773,1780,1840,1844,1863,1876,1886,1892 'retriev':61,84,94,295,377,381,416,419,489,1126 'retrieval-aug':60,83 'return':323,366,408,439,518,521,684,698,804,842,886,959,966,1015,1047,1129,1143,1160,1248,1540,1622,1662,1718,1745,1768,1868,1928 'review':947,951,2067 'revis':955 'role':765,794 'rrf':367 'run':659,759,831,1204,1625,1633 'safe':1617 'safeti':1619,2077 'satisfact':1331 'say':468 'scale':195,213,226,243 'schema':712 'scope':2048 'score':1566,1573,1584,1595,1608,1618,1623,1648,1661 'search':103,201,300,303,316,326,331,356,361,406,428,493,543,549,552,715,718,732,1978 'second':1326,1687,1694 'select':185,254 'self':208,642,660,760,832,906,920,983,995,1021,1089,1095,1119,1136,1166,1197,1205,1402,1458,1556,1627,1683,1698,1726,1790,1802,1903,1915 'self-host':207 'self._aggregate_scores':1663 'self._cache_key':1734 'self._calculate_cost':1495 'self._execute_tool':691,790 'self._extract_final_answer':685 'self._format_tools':668 'self._needs_replan':867 'self._parse_action':688 'self._score_accuracy':1610 'self._score_coherence':1586 'self._score_groundedness':1597 'self._score_relevance':1575 'self._score_safety':1620 'self.agents':907,936,949 'self.coordinator':916 'self.coordinator.decompose':928 'self.coordinator.synthesize':967 'self.db':1091 'self.db.get':1130,1150 'self.db.save':1106 'self.db.update':1175 'self.evaluate':1649 'self.executor.execute':856 'self.fallbacks':1911,1922 'self.llm':653 'self.llm.chat':772 'self.llm.generate':677 'self.max':655,674 'self.planner.create':839 'self.planner.replan':872 'self.primary':1909,1921 'self.redis':1689 'self.redis.get':1741 'self.redis.setex':1764 'self.rpm':1795,1828 'self.solve':960 'self.steps':1201,1218,1252 'self.synthesizer.summarize':887 'self.template':989,1053 'self.template.format':1016 'self.timestamps':1799,1815,1820,1827,1833 'self.timestamps.append':1838 'self.tools':646 'self.ttl':1692,1766 'self.variables':991,1004 'semant':129,133,134,299,302,327,344,353,369,405,427 'separ':142,175 'serv':1364 'server':1887 'servic':194 'set':69,161,1003,1005,1637 'shot':1029 'simpl':117,231,1974 'size':115,123,125,165 'skill':48,51,2040 'skill-llm-app-patterns' 'sleep':1829,1836 'small':293 'solv':919 'sonnet':1965 'sort':1715 'sourc':524 'source-sickn33' 'span':1509,1518,1521 'span.set':1522,1530,1535 'special':898 'specif':1127,2062 'speed':1328 'split':135,139 'sql':248 'step':821,825,843,845,849,854,857,1198,1202,1216,1220,1235,1238,1243,1244,1991 'step.get':1232 'stop':1783,1854,1855,2068 'storag':181,1433 'store':1102 'str':305,333,383,418,488,662,663,762,763,801,834,835,922,923,985,988,997,1025,1097,1099,1101,1121,1123,1125,1138,1141,1142,1169,1208,1405,1461,1516,1517,1558,1560,1563,1700,1702,1704,1728,1730,1732,1865,1866,1905,1908,1917,1919 'strategi':110,296,1670,1897 'string':730,748 'structur':152,1583,1997 'style':1063,1064,1069,1073 'substitut':2058 'subtask':926 'success':1339,2080 'summar':1055,1058,1262,1287,1289 'summari':1300 'summarizer.format':1072 'synthes':883 't.name':647 'task':833,841,868,873,888,903,921,929,963,1335,1337,1992,2005,2012,2044 'temperatur':1439,1441,1761 'templat':448,975,984,990,1057,1098,1109,1110 'tenac':1778 'test':1083,1135,1628,1636,1642,2064 'text':1032,1050,1061,1067,1070,1075 'thought':539,554,566,600,624 'thought/action/observation':621 'thousand':227 'thumb':1332 'time':1317,1323,1376,1776,1830,1837 'time.sleep':1835 'time.time':1811,1839 'timeout':1372 'timestamp':1421,1814 'togeth':1188 'token':128,167,171,263,276,1324,1354,1358,1435,1438,1474,1477,1479,1482,1539 'tokens.total':1537 'tool':68,589,594,595,609,613,643,652,666,708,713,775,776,777,784,795,796,1998 'tool_call.arguments':792 'tool_call.id':799 'tool_call.name':791 'top':306,319,321,334,430,495 'topic':1270 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'total':1478,1481 'trace':1385,1392,1505 'trace.get':1394,1519 'tracer':1393,1395 'tracer.start':1506 'track':1172,1307 'treat':2053 'tri':140,1867,1927 'trigger':1875 'true':770,1717 'truncat':1431 'truth':1562,1604,1607,1613,1657 'ttl':1686,1693 'turbo':1958,1962 'type':725,729,743,747 'up/down':1333 'usag':1054,1951 'usd':1494 'use':46,49,190,205,222,238,268,588,597,1359,1970,2038 'user':451,766,1139,1147,1156,1330,1443,1446 'valid':998,2063 'valueerror':1010 'variabl':977,986,992,1000,1013,1068 'variant':1144,1149,1159,1161 'variat':387,394 'vector':100,183,186,198,216,229,246 'vector_db.similarity':315,355 'version':1081,1100,1105,1111,1112,1122,1128,1132,1152 'wait':1781,1803,1845,1846 'weaviat':204 'web':716,720 'well':1582 'well-structur':1581 'would':1807 'writer':912 'writerag':913 'www.llamaindex.ai':2030 'www.llamaindex.ai/)':2029 'x':547,550","prices":[{"id":"b37c4f01-3794-4318-9720-7730ff6cce83","listingId":"bf546a2b-101a-4942-bd32-d7a8f4ff061e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:40:03.489Z"}],"sources":[{"listingId":"bf546a2b-101a-4942-bd32-d7a8f4ff061e","source":"github","sourceId":"sickn33/antigravity-awesome-skills/llm-app-patterns","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/llm-app-patterns","isPrimary":false,"firstSeenAt":"2026-04-18T21:40:03.489Z","lastSeenAt":"2026-04-23T12:51:10.614Z"}],"details":{"listingId":"bf546a2b-101a-4942-bd32-d7a8f4ff061e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"llm-app-patterns","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34726,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-23T06:41:03Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"a76fdf98bc0255419697f234e041ba54252388c7","skill_md_path":"skills/llm-app-patterns/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/llm-app-patterns"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"llm-app-patterns","description":"Production-ready patterns for building LLM applications, inspired by [Dify](https://github.com/langgenius/dify) and industry best practices."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/llm-app-patterns"},"updatedAt":"2026-04-23T12:51:10.614Z"}}