[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70D21RDF7D1KFEB377WGV4W":3,"skill-same:01M70D21RDF7D1KFEB377WGV4W":81},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":26,"linkOnly":27,"markdownContent":28,"markdownBody":29,"frontMatter":30,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":6,"ownerHtmlUrl":36,"ownerBlogUrl":6,"ownerDescription":37,"updatedAt":38,"install":39,"resources":52},"01M70D21RDF7D1KFEB377WGV4W","dspy-ruby",null,"This skill should be used when working with DSPy.rb, a Ruby framework for building type-safe, composable LLM applications. Use this when implementing predictable AI features, creating LLM signatures and modules, configuring language model providers (OpenAI, Google Gemini, Ollama), building agent systems with tools, optimizing prompts, or testing LLM-powered functionality in Ruby applications.","CristoVentures\u002FLocalCents","CristoVentures","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F276110764?v=4","01M70CMDH1JD36S1T7SZFWWW3S","01M70CMDHMF8TH5N0YPJHYSD8Y",2,"MIT","https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fdspy-ruby\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[],"2026-11-10 10:12:30",false,"---\nname: dspy-ruby\ndescription: This skill should be used when working with DSPy.rb, a Ruby framework for building type-safe, composable LLM applications. Use this when implementing predictable AI features, creating LLM signatures and modules, configuring language model providers (OpenAI, Google Gemini, Ollama), building agent systems with tools, optimizing prompts, or testing LLM-powered functionality in Ruby applications.\n---\n\n# DSPy.rb Expert\n\n## Overview\n\nDSPy.rb is a Ruby framework that enables developers to **program LLMs, not prompt them**. Instead of manually crafting prompts, define application requirements through type-safe, composable modules that can be tested, optimized, and version-controlled like regular code.\n\nThis skill provides comprehensive guidance on:\n- Creating type-safe signatures for LLM operations\n- Building composable modules and workflows\n- Configuring multiple LLM providers\n- Implementing agents with tools\n- Testing and optimizing LLM applications\n- Production deployment patterns\n\n## Core Capabilities\n\n### 1. Type-Safe Signatures\n\nCreate input\u002Foutput contracts for LLM operations with runtime type checking.\n\n**When to use**: Defining any LLM task, from simple classification to complex analysis.\n\n**Quick reference**:\n```ruby\nclass EmailClassificationSignature \u003C DSPy::Signature\n  description \"Classify customer support emails\"\n\n  input do\n    const :email_subject, String\n    const :email_body, String\n  end\n\n  output do\n    const :category, T.enum([\"Technical\", \"Billing\", \"General\"])\n    const :priority, T.enum([\"Low\", \"Medium\", \"High\"])\n  end\nend\n```\n\n**Templates**: See `assets\u002Fsignature-template.rb` for comprehensive examples including:\n- Basic signatures with multiple field types\n- Vision signatures for multimodal tasks\n- Sentiment analysis signatures\n- Code generation signatures\n\n**Best practices**:\n- Always provide clear, specific descriptions\n- Use enums for constrained outputs\n- Include field descriptions with `desc:` parameter\n- Prefer specific types over generic String when possible\n\n**Full documentation**: See `references\u002Fcore-concepts.md` sections on Signatures and Type Safety.\n\n### 2. Composable Modules\n\nBuild reusable, chainable modules that encapsulate LLM operations.\n\n**When to use**: Implementing any LLM-powered feature, especially complex multi-step workflows.\n\n**Quick reference**:\n```ruby\nclass EmailProcessor \u003C DSPy::Module\n  def initialize\n    super\n    @classifier = DSPy::Predict.new(EmailClassificationSignature)\n  end\n\n  def forward(email_subject:, email_body:)\n    @classifier.forward(\n      email_subject: email_subject,\n      email_body: email_body\n    )\n  end\nend\n```\n\n**Templates**: See `assets\u002Fmodule-template.rb` for comprehensive examples including:\n- Basic modules with single predictors\n- Multi-step pipelines that chain modules\n- Modules with conditional logic\n- Error handling and retry patterns\n- Stateful modules with history\n- Caching implementations\n\n**Module composition**: Chain modules together to create complex workflows:\n```ruby\nclass Pipeline \u003C DSPy::Module\n  def initialize\n    super\n    @step1 = Classifier.new\n    @step2 = Analyzer.new\n    @step3 = Responder.new\n  end\n\n  def forward(input)\n    result1 = @step1.forward(input)\n    result2 = @step2.forward(result1)\n    @step3.forward(result2)\n  end\nend\n```\n\n**Full documentation**: See `references\u002Fcore-concepts.md` sections on Modules and Module Composition.\n\n### 3. Multiple Predictor Types\n\nChoose the right predictor for your task:\n\n**Predict**: Basic LLM inference with type-safe inputs\u002Foutputs\n```ruby\npredictor = DSPy::Predict.new(TaskSignature)\nresult = predictor.forward(input: \"data\")\n```\n\n**ChainOfThought**: Adds automatic reasoning for improved accuracy\n```ruby\npredictor = DSPy::ChainOfThought.new(TaskSignature)\nresult = predictor.forward(input: \"data\")\n# Returns: { reasoning: \"...\", output: \"...\" }\n```\n\n**ReAct**: Tool-using agents with iterative reasoning\n```ruby\npredictor = DSPy::ReAct.new(\n  TaskSignature,\n  tools: [SearchTool.new, CalculatorTool.new],\n  max_iterations: 5\n)\n```\n\n**CodeAct**: Dynamic code generation (requires `dspy-code_act` gem)\n```ruby\npredictor = DSPy::CodeAct.new(TaskSignature)\nresult = predictor.forward(task: \"Calculate factorial of 5\")\n```\n\n**When to use each**:\n- **Predict**: Simple tasks, classification, extraction\n- **ChainOfThought**: Complex reasoning, analysis, multi-step thinking\n- **ReAct**: Tasks requiring external tools (search, calculation, API calls)\n- **CodeAct**: Tasks best solved with generated code\n\n**Full documentation**: See `references\u002Fcore-concepts.md` section on Predictors.\n\n### 4. LLM Provider Configuration\n\nSupport for OpenAI, Google Gemini, Ollama, and OpenRouter.\n\n**Quick configuration examples**:\n```ruby\n# OpenAI\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n    api_key: ENV['OPENAI_API_KEY'])\nend\n\n# Google Gemini (Advanced)\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('google\u002Fgemini-1.5-pro-latest',\n    api_key: ENV['GOOGLE_API_KEY'])\nend\n\n# Google Gemini\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('gemini\u002Fgemini-1.5-pro',\n    api_key: ENV['GOOGLE_API_KEY'])\nend\n\n# Local Ollama (free, private)\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('ollama\u002Fllama3.1')\nend\n```\n\n**Templates**: See `assets\u002Fconfig-template.rb` for comprehensive examples including:\n- Environment-based configuration\n- Multi-model setups for different tasks\n- Configuration with observability (OpenTelemetry, Langfuse)\n- Retry logic and fallback strategies\n- Budget tracking\n- Rails initializer patterns\n\n**Provider compatibility matrix**:\n\n| Feature | OpenAI | Google Gemini | Ollama |\n|---------|--------|-----------|--------|\n| Structured Output | ✅ | ✅ | ✅ |\n| Vision (Images) | ✅ | ✅ | ⚠️ Limited |\n| Image URLs | ✅ | ❌ | ❌ |\n| Tool Calling | ✅ | ✅ | Varies |\n\n**Cost optimization strategy**:\n- Development: Ollama (free) or gpt-4o-mini (cheap)\n- Testing: gpt-4o-mini with temperature=0.0\n- Production simple tasks: gpt-4o-mini, gemini-flash, gemini-1.5-flash\n- Production complex tasks: gpt-4o, gemini-1.5-pro, gemini-1.5-pro\n\n**Full documentation**: See `references\u002Fproviders.md` for all configuration options, provider-specific features, and troubleshooting.\n\n### 5. Multimodal & Vision Support\n\nProcess images alongside text using the unified `DSPy::Image` interface.\n\n**Quick reference**:\n```ruby\nclass VisionSignature \u003C DSPy::Signature\n  description \"Analyze image and answer questions\"\n\n  input do\n    const :image, DSPy::Image\n    const :question, String\n  end\n\n  output do\n    const :answer, String\n  end\nend\n\npredictor = DSPy::Predict.new(VisionSignature)\nresult = predictor.forward(\n  image: DSPy::Image.from_file(\"path\u002Fto\u002Fimage.jpg\"),\n  question: \"What objects are visible?\"\n)\n```\n\n**Image loading methods**:\n```ruby\n# From file\nDSPy::Image.from_file(\"path\u002Fto\u002Fimage.jpg\")\n\n# From URL (OpenAI only)\nDSPy::Image.from_url(\"https:\u002F\u002Fexample.com\u002Fimage.jpg\")\n\n# From base64\nDSPy::Image.from_base64(base64_data, mime_type: \"image\u002Fjpeg\")\n```\n\n**Provider support**:\n- OpenAI: Full support including URLs\n- Google Gemini: Base64 or file loading only\n- Ollama: Limited multimodal depending on model\n\n**Full documentation**: See `references\u002Fcore-concepts.md` section on Multimodal Support.\n\n### 6. Testing LLM Applications\n\nWrite standard RSpec tests for LLM logic.\n\n**Quick reference**:\n```ruby\nRSpec.describe EmailClassifier do\n  before do\n    DSPy.configure do |c|\n      c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n        api_key: ENV['OPENAI_API_KEY'])\n    end\n  end\n\n  it 'classifies technical emails correctly' do\n    classifier = EmailClassifier.new\n    result = classifier.forward(\n      email_subject: \"Can't log in\",\n      email_body: \"Unable to access account\"\n    )\n\n    expect(result[:category]).to eq('Technical')\n    expect(result[:priority]).to be_in(['High', 'Medium', 'Low'])\n  end\nend\n```\n\n**Testing patterns**:\n- Mock LLM responses for unit tests\n- Use VCR for deterministic API testing\n- Test type safety and validation\n- Test edge cases (empty inputs, special characters, long texts)\n- Integration test complete workflows\n\n**Full documentation**: See `references\u002Foptimization.md` section on Testing.\n\n### 7. Optimization & Improvement\n\nAutomatically improve prompts and modules using optimization techniques.\n\n**MIPROv2 optimization**:\n```ruby\nrequire 'dspy\u002Fmipro'\n\n# Define evaluation metric\ndef accuracy_metric(example, prediction)\n  example[:expected_output][:category] == prediction[:category] ? 1.0 : 0.0\nend\n\n# Prepare training data\ntraining_examples = [\n  {\n    input: { email_subject: \"...\", email_body: \"...\" },\n    expected_output: { category: 'Technical' }\n  },\n  # More examples...\n]\n\n# Run optimization\noptimizer = DSPy::MIPROv2.new(\n  metric: method(:accuracy_metric),\n  num_candidates: 10\n)\n\noptimized_module = optimizer.compile(\n  EmailClassifier.new,\n  trainset: training_examples\n)\n```\n\n**A\u002FB testing different approaches**:\n```ruby\n# Test ChainOfThought vs ReAct\napproach_a_score = evaluate_approach(ChainOfThoughtModule, test_set)\napproach_b_score = evaluate_approach(ReActModule, test_set)\n```\n\n**Full documentation**: See `references\u002Foptimization.md` section on Optimization.\n\n### 8. Observability & Monitoring\n\nTrack performance, token usage, and behavior in production.\n\n**OpenTelemetry integration**:\n```ruby\nrequire 'opentelemetry\u002Fsdk'\n\nOpenTelemetry::SDK.configure do |c|\n  c.service_name = 'my-dspy-app'\n  c.use_all\nend\n\n# DSPy automatically creates traces\n```\n\n**Langfuse tracing**:\n```ruby\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n    api_key: ENV['OPENAI_API_KEY'])\n\n  c.langfuse = {\n    public_key: ENV['LANGFUSE_PUBLIC_KEY'],\n    secret_key: ENV['LANGFUSE_SECRET_KEY']\n  }\nend\n```\n\n**Custom monitoring**:\n- Token tracking\n- Performance monitoring\n- Error rate tracking\n- Custom logging\n\n**Full documentation**: See `references\u002Foptimization.md` section on Observability.\n\n## Quick Start Workflow\n\n### For New Projects\n\n1. **Install DSPy.rb and provider gems**:\n```bash\ngem install dspy dspy-openai  # or dspy-gemini\n```\n\n2. **Configure LLM provider** (see `assets\u002Fconfig-template.rb`):\n```ruby\nrequire 'dspy'\n\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n    api_key: ENV['OPENAI_API_KEY'])\nend\n```\n\n3. **Create a signature** (see `assets\u002Fsignature-template.rb`):\n```ruby\nclass MySignature \u003C DSPy::Signature\n  description \"Clear description of task\"\n\n  input do\n    const :input_field, String, desc: \"Description\"\n  end\n\n  output do\n    const :output_field, String, desc: \"Description\"\n  end\nend\n```\n\n4. **Create a module** (see `assets\u002Fmodule-template.rb`):\n```ruby\nclass MyModule \u003C DSPy::Module\n  def initialize\n    super\n    @predictor = DSPy::Predict.new(MySignature)\n  end\n\n  def forward(input_field:)\n    @predictor.forward(input_field: input_field)\n  end\nend\n```\n\n5. **Use the module**:\n```ruby\nmodule_instance = MyModule.new\nresult = module_instance.forward(input_field: \"test\")\nputs result[:output_field]\n```\n\n6. **Add tests** (see `references\u002Foptimization.md`):\n```ruby\nRSpec.describe MyModule do\n  it 'produces expected output' do\n    result = MyModule.new.forward(input_field: \"test\")\n    expect(result[:output_field]).to be_a(String)\n  end\nend\n```\n\n### For Rails Applications\n\n1. **Add to Gemfile**:\n```ruby\ngem 'dspy'\ngem 'dspy-openai'  # or other provider\n```\n\n2. **Create initializer** at `config\u002Finitializers\u002Fdspy.rb` (see `assets\u002Fconfig-template.rb` for full example):\n```ruby\nrequire 'dspy'\n\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n    api_key: ENV['OPENAI_API_KEY'])\nend\n```\n\n3. **Create modules in** `app\u002Fllm\u002F` directory:\n```ruby\n# app\u002Fllm\u002Femail_classifier.rb\nclass EmailClassifier \u003C DSPy::Module\n  # Implementation here\nend\n```\n\n4. **Use in controllers\u002Fservices**:\n```ruby\nclass EmailsController \u003C ApplicationController\n  def classify\n    classifier = EmailClassifier.new\n    result = classifier.forward(\n      email_subject: params[:subject],\n      email_body: params[:body]\n    )\n    render json: result\n  end\nend\n```\n\n## Common Patterns\n\n### Pattern: Multi-Step Analysis Pipeline\n\n```ruby\nclass AnalysisPipeline \u003C DSPy::Module\n  def initialize\n    super\n    @extract = DSPy::Predict.new(ExtractSignature)\n    @analyze = DSPy::ChainOfThought.new(AnalyzeSignature)\n    @summarize = DSPy::Predict.new(SummarizeSignature)\n  end\n\n  def forward(text:)\n    extracted = @extract.forward(text: text)\n    analyzed = @analyze.forward(data: extracted[:data])\n    @summarize.forward(analysis: analyzed[:result])\n  end\nend\n```\n\n### Pattern: Agent with Tools\n\n```ruby\nclass ResearchAgent \u003C DSPy::Module\n  def initialize\n    super\n    @agent = DSPy::ReAct.new(\n      ResearchSignature,\n      tools: [\n        WebSearchTool.new,\n        DatabaseQueryTool.new,\n        SummarizerTool.new\n      ],\n      max_iterations: 10\n    )\n  end\n\n  def forward(question:)\n    @agent.forward(question: question)\n  end\nend\n\nclass WebSearchTool \u003C DSPy::Tool\n  def call(query:)\n    results = perform_search(query)\n    { results: results }\n  end\nend\n```\n\n### Pattern: Conditional Routing\n\n```ruby\nclass SmartRouter \u003C DSPy::Module\n  def initialize\n    super\n    @classifier = DSPy::Predict.new(ClassifySignature)\n    @simple_handler = SimpleModule.new\n    @complex_handler = ComplexModule.new\n  end\n\n  def forward(input:)\n    classification = @classifier.forward(text: input)\n\n    if classification[:complexity] == 'Simple'\n      @simple_handler.forward(input: input)\n    else\n      @complex_handler.forward(input: input)\n    end\n  end\nend\n```\n\n### Pattern: Retry with Fallback\n\n```ruby\nclass RobustModule \u003C DSPy::Module\n  MAX_RETRIES = 3\n\n  def forward(input, retry_count: 0)\n    begin\n      @predictor.forward(input)\n    rescue DSPy::ValidationError => e\n      if retry_count \u003C MAX_RETRIES\n        sleep(2 ** retry_count)\n        forward(input, retry_count: retry_count + 1)\n      else\n        # Fallback to default or raise\n        raise\n      end\n    end\n  end\nend\n```\n\n## Resources\n\nThis skill includes comprehensive reference materials and templates:\n\n### References (load as needed for detailed information)\n\n- [core-concepts.md](.\u002Freferences\u002Fcore-concepts.md): Complete guide to signatures, modules, predictors, multimodal support, and best practices\n- [providers.md](.\u002Freferences\u002Fproviders.md): All LLM provider configurations, compatibility matrix, cost optimization, and troubleshooting\n- [optimization.md](.\u002Freferences\u002Foptimization.md): Testing patterns, optimization techniques, observability setup, and monitoring\n\n### Assets (templates for quick starts)\n\n- [signature-template.rb](.\u002Fassets\u002Fsignature-template.rb): Examples of signatures including basic, vision, sentiment analysis, and code generation\n- [module-template.rb](.\u002Fassets\u002Fmodule-template.rb): Module patterns including pipelines, agents, error handling, caching, and state management\n- [config-template.rb](.\u002Fassets\u002Fconfig-template.rb): Configuration examples for all providers, environments, observability, and production patterns\n\n## When to Use This Skill\n\nTrigger this skill when:\n- Implementing LLM-powered features in Ruby applications\n- Creating type-safe interfaces for AI operations\n- Building agent systems with tool usage\n- Setting up or troubleshooting LLM providers\n- Optimizing prompts and improving accuracy\n- Testing LLM functionality\n- Adding observability to AI applications\n- Converting from manual prompt engineering to programmatic approach\n- Debugging DSPy.rb code or configuration issues\n","# DSPy.rb Expert\n\n## Overview\n\nDSPy.rb is a Ruby framework that enables developers to **program LLMs, not prompt them**. Instead of manually crafting prompts, define application requirements through type-safe, composable modules that can be tested, optimized, and version-controlled like regular code.\n\nThis skill provides comprehensive guidance on:\n- Creating type-safe signatures for LLM operations\n- Building composable modules and workflows\n- Configuring multiple LLM providers\n- Implementing agents with tools\n- Testing and optimizing LLM applications\n- Production deployment patterns\n\n## Core Capabilities\n\n### 1. Type-Safe Signatures\n\nCreate input\u002Foutput contracts for LLM operations with runtime type checking.\n\n**When to use**: Defining any LLM task, from simple classification to complex analysis.\n\n**Quick reference**:\n```ruby\nclass EmailClassificationSignature \u003C DSPy::Signature\n  description \"Classify customer support emails\"\n\n  input do\n    const :email_subject, String\n    const :email_body, String\n  end\n\n  output do\n    const :category, T.enum([\"Technical\", \"Billing\", \"General\"])\n    const :priority, T.enum([\"Low\", \"Medium\", \"High\"])\n  end\nend\n```\n\n**Templates**: See `assets\u002Fsignature-template.rb` for comprehensive examples including:\n- Basic signatures with multiple field types\n- Vision signatures for multimodal tasks\n- Sentiment analysis signatures\n- Code generation signatures\n\n**Best practices**:\n- Always provide clear, specific descriptions\n- Use enums for constrained outputs\n- Include field descriptions with `desc:` parameter\n- Prefer specific types over generic String when possible\n\n**Full documentation**: See `references\u002Fcore-concepts.md` sections on Signatures and Type Safety.\n\n### 2. Composable Modules\n\nBuild reusable, chainable modules that encapsulate LLM operations.\n\n**When to use**: Implementing any LLM-powered feature, especially complex multi-step workflows.\n\n**Quick reference**:\n```ruby\nclass EmailProcessor \u003C DSPy::Module\n  def initialize\n    super\n    @classifier = DSPy::Predict.new(EmailClassificationSignature)\n  end\n\n  def forward(email_subject:, email_body:)\n    @classifier.forward(\n      email_subject: email_subject,\n      email_body: email_body\n    )\n  end\nend\n```\n\n**Templates**: See `assets\u002Fmodule-template.rb` for comprehensive examples including:\n- Basic modules with single predictors\n- Multi-step pipelines that chain modules\n- Modules with conditional logic\n- Error handling and retry patterns\n- Stateful modules with history\n- Caching implementations\n\n**Module composition**: Chain modules together to create complex workflows:\n```ruby\nclass Pipeline \u003C DSPy::Module\n  def initialize\n    super\n    @step1 = Classifier.new\n    @step2 = Analyzer.new\n    @step3 = Responder.new\n  end\n\n  def forward(input)\n    result1 = @step1.forward(input)\n    result2 = @step2.forward(result1)\n    @step3.forward(result2)\n  end\nend\n```\n\n**Full documentation**: See `references\u002Fcore-concepts.md` sections on Modules and Module Composition.\n\n### 3. Multiple Predictor Types\n\nChoose the right predictor for your task:\n\n**Predict**: Basic LLM inference with type-safe inputs\u002Foutputs\n```ruby\npredictor = DSPy::Predict.new(TaskSignature)\nresult = predictor.forward(input: \"data\")\n```\n\n**ChainOfThought**: Adds automatic reasoning for improved accuracy\n```ruby\npredictor = DSPy::ChainOfThought.new(TaskSignature)\nresult = predictor.forward(input: \"data\")\n# Returns: { reasoning: \"...\", output: \"...\" }\n```\n\n**ReAct**: Tool-using agents with iterative reasoning\n```ruby\npredictor = DSPy::ReAct.new(\n  TaskSignature,\n  tools: [SearchTool.new, CalculatorTool.new],\n  max_iterations: 5\n)\n```\n\n**CodeAct**: Dynamic code generation (requires `dspy-code_act` gem)\n```ruby\npredictor = DSPy::CodeAct.new(TaskSignature)\nresult = predictor.forward(task: \"Calculate factorial of 5\")\n```\n\n**When to use each**:\n- **Predict**: Simple tasks, classification, extraction\n- **ChainOfThought**: Complex reasoning, analysis, multi-step thinking\n- **ReAct**: Tasks requiring external tools (search, calculation, API calls)\n- **CodeAct**: Tasks best solved with generated code\n\n**Full documentation**: See `references\u002Fcore-concepts.md` section on Predictors.\n\n### 4. LLM Provider Configuration\n\nSupport for OpenAI, Google Gemini, Ollama, and OpenRouter.\n\n**Quick configuration examples**:\n```ruby\n# OpenAI\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n    api_key: ENV['OPENAI_API_KEY'])\nend\n\n# Google Gemini (Advanced)\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('google\u002Fgemini-1.5-pro-latest',\n    api_key: ENV['GOOGLE_API_KEY'])\nend\n\n# Google Gemini\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('gemini\u002Fgemini-1.5-pro',\n    api_key: ENV['GOOGLE_API_KEY'])\nend\n\n# Local Ollama (free, private)\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('ollama\u002Fllama3.1')\nend\n```\n\n**Templates**: See `assets\u002Fconfig-template.rb` for comprehensive examples including:\n- Environment-based configuration\n- Multi-model setups for different tasks\n- Configuration with observability (OpenTelemetry, Langfuse)\n- Retry logic and fallback strategies\n- Budget tracking\n- Rails initializer patterns\n\n**Provider compatibility matrix**:\n\n| Feature | OpenAI | Google Gemini | Ollama |\n|---------|--------|-----------|--------|\n| Structured Output | ✅ | ✅ | ✅ |\n| Vision (Images) | ✅ | ✅ | ⚠️ Limited |\n| Image URLs | ✅ | ❌ | ❌ |\n| Tool Calling | ✅ | ✅ | Varies |\n\n**Cost optimization strategy**:\n- Development: Ollama (free) or gpt-4o-mini (cheap)\n- Testing: gpt-4o-mini with temperature=0.0\n- Production simple tasks: gpt-4o-mini, gemini-flash, gemini-1.5-flash\n- Production complex tasks: gpt-4o, gemini-1.5-pro, gemini-1.5-pro\n\n**Full documentation**: See `references\u002Fproviders.md` for all configuration options, provider-specific features, and troubleshooting.\n\n### 5. Multimodal & Vision Support\n\nProcess images alongside text using the unified `DSPy::Image` interface.\n\n**Quick reference**:\n```ruby\nclass VisionSignature \u003C DSPy::Signature\n  description \"Analyze image and answer questions\"\n\n  input do\n    const :image, DSPy::Image\n    const :question, String\n  end\n\n  output do\n    const :answer, String\n  end\nend\n\npredictor = DSPy::Predict.new(VisionSignature)\nresult = predictor.forward(\n  image: DSPy::Image.from_file(\"path\u002Fto\u002Fimage.jpg\"),\n  question: \"What objects are visible?\"\n)\n```\n\n**Image loading methods**:\n```ruby\n# From file\nDSPy::Image.from_file(\"path\u002Fto\u002Fimage.jpg\")\n\n# From URL (OpenAI only)\nDSPy::Image.from_url(\"https:\u002F\u002Fexample.com\u002Fimage.jpg\")\n\n# From base64\nDSPy::Image.from_base64(base64_data, mime_type: \"image\u002Fjpeg\")\n```\n\n**Provider support**:\n- OpenAI: Full support including URLs\n- Google Gemini: Base64 or file loading only\n- Ollama: Limited multimodal depending on model\n\n**Full documentation**: See `references\u002Fcore-concepts.md` section on Multimodal Support.\n\n### 6. Testing LLM Applications\n\nWrite standard RSpec tests for LLM logic.\n\n**Quick reference**:\n```ruby\nRSpec.describe EmailClassifier do\n  before do\n    DSPy.configure do |c|\n      c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n        api_key: ENV['OPENAI_API_KEY'])\n    end\n  end\n\n  it 'classifies technical emails correctly' do\n    classifier = EmailClassifier.new\n    result = classifier.forward(\n      email_subject: \"Can't log in\",\n      email_body: \"Unable to access account\"\n    )\n\n    expect(result[:category]).to eq('Technical')\n    expect(result[:priority]).to be_in(['High', 'Medium', 'Low'])\n  end\nend\n```\n\n**Testing patterns**:\n- Mock LLM responses for unit tests\n- Use VCR for deterministic API testing\n- Test type safety and validation\n- Test edge cases (empty inputs, special characters, long texts)\n- Integration test complete workflows\n\n**Full documentation**: See `references\u002Foptimization.md` section on Testing.\n\n### 7. Optimization & Improvement\n\nAutomatically improve prompts and modules using optimization techniques.\n\n**MIPROv2 optimization**:\n```ruby\nrequire 'dspy\u002Fmipro'\n\n# Define evaluation metric\ndef accuracy_metric(example, prediction)\n  example[:expected_output][:category] == prediction[:category] ? 1.0 : 0.0\nend\n\n# Prepare training data\ntraining_examples = [\n  {\n    input: { email_subject: \"...\", email_body: \"...\" },\n    expected_output: { category: 'Technical' }\n  },\n  # More examples...\n]\n\n# Run optimization\noptimizer = DSPy::MIPROv2.new(\n  metric: method(:accuracy_metric),\n  num_candidates: 10\n)\n\noptimized_module = optimizer.compile(\n  EmailClassifier.new,\n  trainset: training_examples\n)\n```\n\n**A\u002FB testing different approaches**:\n```ruby\n# Test ChainOfThought vs ReAct\napproach_a_score = evaluate_approach(ChainOfThoughtModule, test_set)\napproach_b_score = evaluate_approach(ReActModule, test_set)\n```\n\n**Full documentation**: See `references\u002Foptimization.md` section on Optimization.\n\n### 8. Observability & Monitoring\n\nTrack performance, token usage, and behavior in production.\n\n**OpenTelemetry integration**:\n```ruby\nrequire 'opentelemetry\u002Fsdk'\n\nOpenTelemetry::SDK.configure do |c|\n  c.service_name = 'my-dspy-app'\n  c.use_all\nend\n\n# DSPy automatically creates traces\n```\n\n**Langfuse tracing**:\n```ruby\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n    api_key: ENV['OPENAI_API_KEY'])\n\n  c.langfuse = {\n    public_key: ENV['LANGFUSE_PUBLIC_KEY'],\n    secret_key: ENV['LANGFUSE_SECRET_KEY']\n  }\nend\n```\n\n**Custom monitoring**:\n- Token tracking\n- Performance monitoring\n- Error rate tracking\n- Custom logging\n\n**Full documentation**: See `references\u002Foptimization.md` section on Observability.\n\n## Quick Start Workflow\n\n### For New Projects\n\n1. **Install DSPy.rb and provider gems**:\n```bash\ngem install dspy dspy-openai  # or dspy-gemini\n```\n\n2. **Configure LLM provider** (see `assets\u002Fconfig-template.rb`):\n```ruby\nrequire 'dspy'\n\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n    api_key: ENV['OPENAI_API_KEY'])\nend\n```\n\n3. **Create a signature** (see `assets\u002Fsignature-template.rb`):\n```ruby\nclass MySignature \u003C DSPy::Signature\n  description \"Clear description of task\"\n\n  input do\n    const :input_field, String, desc: \"Description\"\n  end\n\n  output do\n    const :output_field, String, desc: \"Description\"\n  end\nend\n```\n\n4. **Create a module** (see `assets\u002Fmodule-template.rb`):\n```ruby\nclass MyModule \u003C DSPy::Module\n  def initialize\n    super\n    @predictor = DSPy::Predict.new(MySignature)\n  end\n\n  def forward(input_field:)\n    @predictor.forward(input_field: input_field)\n  end\nend\n```\n\n5. **Use the module**:\n```ruby\nmodule_instance = MyModule.new\nresult = module_instance.forward(input_field: \"test\")\nputs result[:output_field]\n```\n\n6. **Add tests** (see `references\u002Foptimization.md`):\n```ruby\nRSpec.describe MyModule do\n  it 'produces expected output' do\n    result = MyModule.new.forward(input_field: \"test\")\n    expect(result[:output_field]).to be_a(String)\n  end\nend\n```\n\n### For Rails Applications\n\n1. **Add to Gemfile**:\n```ruby\ngem 'dspy'\ngem 'dspy-openai'  # or other provider\n```\n\n2. **Create initializer** at `config\u002Finitializers\u002Fdspy.rb` (see `assets\u002Fconfig-template.rb` for full example):\n```ruby\nrequire 'dspy'\n\nDSPy.configure do |c|\n  c.lm = DSPy::LM.new('openai\u002Fgpt-4o-mini',\n    api_key: ENV['OPENAI_API_KEY'])\nend\n```\n\n3. **Create modules in** `app\u002Fllm\u002F` directory:\n```ruby\n# app\u002Fllm\u002Femail_classifier.rb\nclass EmailClassifier \u003C DSPy::Module\n  # Implementation here\nend\n```\n\n4. **Use in controllers\u002Fservices**:\n```ruby\nclass EmailsController \u003C ApplicationController\n  def classify\n    classifier = EmailClassifier.new\n    result = classifier.forward(\n      email_subject: params[:subject],\n      email_body: params[:body]\n    )\n    render json: result\n  end\nend\n```\n\n## Common Patterns\n\n### Pattern: Multi-Step Analysis Pipeline\n\n```ruby\nclass AnalysisPipeline \u003C DSPy::Module\n  def initialize\n    super\n    @extract = DSPy::Predict.new(ExtractSignature)\n    @analyze = DSPy::ChainOfThought.new(AnalyzeSignature)\n    @summarize = DSPy::Predict.new(SummarizeSignature)\n  end\n\n  def forward(text:)\n    extracted = @extract.forward(text: text)\n    analyzed = @analyze.forward(data: extracted[:data])\n    @summarize.forward(analysis: analyzed[:result])\n  end\nend\n```\n\n### Pattern: Agent with Tools\n\n```ruby\nclass ResearchAgent \u003C DSPy::Module\n  def initialize\n    super\n    @agent = DSPy::ReAct.new(\n      ResearchSignature,\n      tools: [\n        WebSearchTool.new,\n        DatabaseQueryTool.new,\n        SummarizerTool.new\n      ],\n      max_iterations: 10\n    )\n  end\n\n  def forward(question:)\n    @agent.forward(question: question)\n  end\nend\n\nclass WebSearchTool \u003C DSPy::Tool\n  def call(query:)\n    results = perform_search(query)\n    { results: results }\n  end\nend\n```\n\n### Pattern: Conditional Routing\n\n```ruby\nclass SmartRouter \u003C DSPy::Module\n  def initialize\n    super\n    @classifier = DSPy::Predict.new(ClassifySignature)\n    @simple_handler = SimpleModule.new\n    @complex_handler = ComplexModule.new\n  end\n\n  def forward(input:)\n    classification = @classifier.forward(text: input)\n\n    if classification[:complexity] == 'Simple'\n      @simple_handler.forward(input: input)\n    else\n      @complex_handler.forward(input: input)\n    end\n  end\nend\n```\n\n### Pattern: Retry with Fallback\n\n```ruby\nclass RobustModule \u003C DSPy::Module\n  MAX_RETRIES = 3\n\n  def forward(input, retry_count: 0)\n    begin\n      @predictor.forward(input)\n    rescue DSPy::ValidationError => e\n      if retry_count \u003C MAX_RETRIES\n        sleep(2 ** retry_count)\n        forward(input, retry_count: retry_count + 1)\n      else\n        # Fallback to default or raise\n        raise\n      end\n    end\n  end\nend\n```\n\n## Resources\n\nThis skill includes comprehensive reference materials and templates:\n\n### References (load as needed for detailed information)\n\n- [core-concepts.md](.\u002Freferences\u002Fcore-concepts.md): Complete guide to signatures, modules, predictors, multimodal support, and best practices\n- [providers.md](.\u002Freferences\u002Fproviders.md): All LLM provider configurations, compatibility matrix, cost optimization, and troubleshooting\n- [optimization.md](.\u002Freferences\u002Foptimization.md): Testing patterns, optimization techniques, observability setup, and monitoring\n\n### Assets (templates for quick starts)\n\n- [signature-template.rb](.\u002Fassets\u002Fsignature-template.rb): Examples of signatures including basic, vision, sentiment analysis, and code generation\n- [module-template.rb](.\u002Fassets\u002Fmodule-template.rb): Module patterns including pipelines, agents, error handling, caching, and state management\n- [config-template.rb](.\u002Fassets\u002Fconfig-template.rb): Configuration examples for all providers, environments, observability, and production patterns\n\n## When to Use This Skill\n\nTrigger this skill when:\n- Implementing LLM-powered features in Ruby applications\n- Creating type-safe interfaces for AI operations\n- Building agent systems with tool usage\n- Setting up or troubleshooting LLM providers\n- Optimizing prompts and improving accuracy\n- Testing LLM functionality\n- Adding observability to AI applications\n- Converting from manual prompt engineering to programmatic approach\n- Debugging DSPy.rb code or configuration issues\n",{"name":5,"description":7},"main","b918d4b720e7a3fc662a573d80bb61589fbbc8e3",".agent\u002Fskills\u002Fdspy-ruby",0,"https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents","https:\u002F\u002Fgithub.com\u002FCristoVentures","Building reliable, open-source AI infrastructure for the modern developer.","2026-04-15 07:54:13",{"source":8,"skillName":5,"commands":40,"prompt":50,"zipAvailable":51},[41,44,47],{"tool":42,"command":43},"npx","npx skills add CristoVentures\u002FLocalCents --skill dspy-ruby",{"tool":45,"command":46},"bunx","bunx skills add CristoVentures\u002FLocalCents --skill dspy-ruby",{"tool":48,"command":49},"pnpm","pnpm dlx skills add CristoVentures\u002FLocalCents --skill dspy-ruby","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fdspy-ruby\u002FSKILL.md",true,[53,59,63,67,73,77],{"path":54,"resourceType":55,"resourceTypeDesc":56,"sizeBytes":57,"sourceHtmlUrl":58},"assets\u002Fconfig-template.rb","SCRIPT","脚本",10243,"https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fdspy-ruby\u002Fassets\u002Fconfig-template.rb",{"path":60,"resourceType":55,"resourceTypeDesc":56,"sizeBytes":61,"sourceHtmlUrl":62},"assets\u002Fmodule-template.rb",7658,"https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fdspy-ruby\u002Fassets\u002Fmodule-template.rb",{"path":64,"resourceType":55,"resourceTypeDesc":56,"sizeBytes":65,"sourceHtmlUrl":66},"assets\u002Fsignature-template.rb",4838,"https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fdspy-ruby\u002Fassets\u002Fsignature-template.rb",{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fcore-concepts.md","REFERENCE","参考文档",6301,"https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fdspy-ruby\u002Freferences\u002Fcore-concepts.md",{"path":74,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Foptimization.md",14272,"https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fdspy-ruby\u002Freferences\u002Foptimization.md",{"path":78,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fproviders.md",7088,"https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fdspy-ruby\u002Freferences\u002Fproviders.md",[82,93,120,147,170,197],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":90,"publishedAt":26},"01M70DDHCGXVWEM1YMHRPR69MY","test-agent","A test agent","https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Ftest-agent\u002FSKILL.md",[88,89],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[91,92],"test","test agent",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":26},"01M70DDA21EWWEPKF6JTDJ9ACR","spec-flow-analyzer","Use this agent when you have a specification, plan, feature description, or technical document that needs user flow analysis and gap identification. This agent should be used proactively when:\\n\\n\u003Cexample>\\nContext: The user has just finished drafting a specification for OAuth implementation.\\nuser: \"Here's the OAuth spec for our new integration:\\n[OAuth spec details]\"\\nassistant: \"Let me use the spec-flow-analyzer agent to analyze this OAuth specification for user flows and missing elements.\"\\n\u003Ccommentary>\\nSince the user has provided a specification document, use the Task tool to launch the spec-flow-analyzer agent to identify all user flows, edge cases, and missing clarifications.\\n\u003C\u002Fcommentary>\\n\u003C\u002Fexample>\\n\\n\u003Cexample>\\nContext: The user is planning a new social sharing feature.\\nuser: \"I'm thinking we should add social sharing to posts. Users can share to Twitter, Facebook, and LinkedIn.\"\\nassistant: \"This sounds like a feature specification that would benefit from flow analysis. Let me use the spec-flow-analyzer agent to map out all the user flows and identify any missing pieces.\"\\n\u003Ccommentary>\\nThe user is describing a new feature. Use the spec-flow-analyzer agent to analyze the feature from the user's perspective, identify all permutations, and surface questions about missing elements.\\n\u003C\u002Fcommentary>\\n\u003C\u002Fexample>\\n\\n\u003Cexample>\\nContext: The user has created a plan for a new onboarding flow.\\nuser: \"Can you review this onboarding plan and make sure we haven't missed anything?\"\\nassistant: \"I'll use the spec-flow-analyzer agent to thoroughly analyze this onboarding plan from the user's perspective.\"\\n\u003Ccommentary>\\nThe user is explicitly asking for review of a plan. Use the spec-flow-analyzer agent to identify all user flows, edge cases, and gaps in the specification.\\n\u003C\u002Fcommentary>\\n\u003C\u002Fexample>\\n\\nCall this agent when:\\n- A user presents a feature specification, plan, or requirements document\\n- A user asks to review or validate a design or implementation plan\\n- A user describes a new feature or integration that needs flow analysis\\n- After initial planning sessions to validate completeness\\n- Before implementation begins on complex user-facing features\\n- When stakeholders need clarity on user journeys and edge cases","https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fspec-flow-analyzer\u002FSKILL.md",[],[100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119],"spec flow analyzer","flow","spec","analyzer","user journeys","thinking","posts","flows","social","design","implementation plan","map","when","you","analysis","drafting","specification","review","analyze","sure",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":129,"publishedAt":26},"01M70DD02EJ8NFH6A81KG70DMB","security-sentinel","Use this agent when you need to perform security audits, vulnerability assessments, or security reviews of code. This includes checking for common security vulnerabilities, validating input handling, reviewing authentication\u002Fauthorization implementations, scanning for hardcoded secrets, and ensuring OWASP compliance. \u003Cexample>Context: The user wants to ensure their newly implemented API endpoints are secure before deployment.\\nuser: \"I've just finished implementing the user authentication endpoints. Can you check them for security issues?\"\\nassistant: \"I'll use the security-sentinel agent to perform a comprehensive security review of your authentication endpoints.\"\\n\u003Ccommentary>Since the user is asking for a security review of authentication code, use the security-sentinel agent to scan for vulnerabilities and ensure secure implementation.\u003C\u002Fcommentary>\u003C\u002Fexample> \u003Cexample>Context: The user is concerned about potential SQL injection vulnerabilities in their database queries.\\nuser: \"I'm worried about SQL injection in our search functionality. Can you review it?\"\\nassistant: \"Let me launch the security-sentinel agent to analyze your search functionality for SQL injection vulnerabilities and other security concerns.\"\\n\u003Ccommentary>The user explicitly wants a security review focused on SQL injection, which is a core responsibility of the security-sentinel agent.\u003C\u002Fcommentary>\u003C\u002Fexample> \u003Cexample>Context: After implementing a new feature, the user wants to ensure no sensitive data is exposed.\\nuser: \"I've added the payment processing module. Please check if any sensitive data might be exposed.\"\\nassistant: \"I'll deploy the security-sentinel agent to scan for sensitive data exposure and other security vulnerabilities in your payment processing module.\"\\n\u003Ccommentary>Payment processing involves sensitive data, making this a perfect use case for the security-sentinel agent to identify potential data exposure risks.\u003C\u002Fcommentary>\u003C\u002Fexample>","https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fsecurity-sentinel\u002FSKILL.md",[126],{"categoryNo":127,"categoryName":128,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",[130,131,132,133,134,135,136,137,138,139,140,141,142,112,113,143,144,145,146,117],"security sentinel","security","sentinel","common security","reviews","which","processing","search","authentication","issues","implementing","database queries","database","code","vulnerability","api","common",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":156,"publishedAt":26},"01M70DCJKEDJKJF1FA3T2SYBZC","repo-research-analyst","Use this agent when you need to conduct thorough research on a repository's structure, documentation, and patterns. This includes analyzing architecture files, examining GitHub issues for patterns, reviewing contribution guidelines, checking for templates, and searching codebases for implementation patterns. The agent excels at gathering comprehensive information about a project's conventions and best practices.\\n\\nExamples:\\n- \u003Cexample>\\n  Context: User wants to understand a new repository's structure and conventions before contributing.\\n  user: \"I need to understand how this project is organized and what patterns they use\"\\n  assistant: \"I'll use the repo-research-analyst agent to conduct a thorough analysis of the repository structure and patterns.\"\\n  \u003Ccommentary>\\n  Since the user needs comprehensive repository research, use the repo-research-analyst agent to examine all aspects of the project.\\n  \u003C\u002Fcommentary>\\n\u003C\u002Fexample>\\n- \u003Cexample>\\n  Context: User is preparing to create a GitHub issue and wants to follow project conventions.\\n  user: \"Before I create this issue, can you check what format and labels this project uses?\"\\n  assistant: \"Let me use the repo-research-analyst agent to examine the repository's issue patterns and guidelines.\"\\n  \u003Ccommentary>\\n  The user needs to understand issue formatting conventions, so use the repo-research-analyst agent to analyze existing issues and templates.\\n  \u003C\u002Fcommentary>\\n\u003C\u002Fexample>\\n- \u003Cexample>\\n  Context: User is implementing a new feature and wants to follow existing patterns.\\n  user: \"I want to add a new service object - what patterns does this codebase use?\"\\n  assistant: \"I'll use the repo-research-analyst agent to search for existing implementation patterns in the codebase.\"\\n  \u003Ccommentary>\\n  Since the user needs to understand implementation patterns, use the repo-research-analyst agent to search and analyze the codebase.\\n  \u003C\u002Fcommentary>\\n\u003C\u002Fexample>","https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Frepo-research-analyst\u002FSKILL.md",[153],{"categoryNo":154,"categoryName":155,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000021","资料检索与研究",[157,158,159,160,161,162,163,137,139,164,140,165,166,112,113,114,167,118,168,169],"research analyst","analyst","repo","research","repo research analyst","analyzing architecture","project","labels","files","information","architecture","documentation","create",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":179,"publishedAt":26},"01M70DBZN78K99JAE8XC1D42FY","rclone","Upload, sync, and manage files across cloud storage providers using rclone. Use when uploading files (images, videos, documents) to S3, Cloudflare R2, Backblaze B2, Google Drive, Dropbox, or any S3-compatible storage. Triggers on \"upload to S3\", \"sync to cloud\", \"rclone\", \"backup files\", \"upload video\u002Fimage to bucket\", or requests to transfer files to remote storage.","https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Frclone\u002FSKILL.md",[176],{"categoryNo":177,"categoryName":178,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",[172,180,181,182,183,184,165,185,112,186,187,188,189,190,191,192,193,194,195,196],"images","Video","cloudflare","Cloud Storage","remote","documents","image","across","storage","sync","google","r2","google drive","Providers","cloudflare r2","manage","triggers",{"skillNo":198,"name":199,"nameZh":6,"description":200,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":201,"categories":202,"keywords":206,"publishedAt":26},"01M70DBFCENK77KF693A790V0D","pr-comment-resolver","Use this agent when you need to address comments on pull requests or code reviews by making the requested changes and reporting back on the resolution. This agent handles the full workflow of understanding the comment, implementing the fix, and providing a clear summary of what was done. \u003Cexample>Context: A reviewer has left a comment on a pull request asking for a specific change to be made.user: \"The reviewer commented that we should add error handling to the payment processing method\"assistant: \"I'll use the pr-comment-resolver agent to address this comment by implementing the error handling and reporting back\"\u003Ccommentary>Since there's a PR comment that needs to be addressed with code changes, use the pr-comment-resolver agent to handle the implementation and resolution.\u003C\u002Fcommentary>\u003C\u002Fexample>\u003Cexample>Context: Multiple code review comments need to be addressed systematically.user: \"Can you fix the issues mentioned in the code review? They want better variable names and to extract the validation logic\"assistant: \"Let me use the pr-comment-resolver agent to address these review comments one by one\"\u003Ccommentary>The user wants to resolve code review feedback, so the pr-comment-resolver agent should handle making the changes and reporting on each resolution.\u003C\u002Fcommentary>\u003C\u002Fexample>","https:\u002F\u002Fgithub.com\u002FCristoVentures\u002FLocalCents\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fpr-comment-resolver\u002FSKILL.md",[203],{"categoryNo":204,"categoryName":205,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查",[207,208,209,210,211,134,212,136,213,214,139,140,112,215,113,216,143,217,117,218],"resolver","pr","pr comment resolver","back","error","code review feedback","code review","fix","workflow","done","reviewer","pull requests"]