{"record":{"id":"fb63294e53caf36b","repo":"we-promise/sure","slug":"too-many-merchants-to-enhance-max-is-25-per-reque","errorCode":null,"errorMessage":"Too many merchants to enhance. Max is 25 per request.","messagePattern":"Too many merchants to enhance\\. Max is 25 per request\\.","errorType":"exception","errorClass":"Provider::Anthropic::Error","httpStatus":null,"severity":"error","filePath":"app/models/provider/anthropic.rb","lineNumber":128,"sourceCode":"\n      result = AutoMerchantDetector.new(\n        client,\n        model: effective_model,\n        transactions: transactions,\n        user_merchants: user_merchants,\n        langfuse_trace: trace,\n        family: family\n      ).auto_detect_merchants\n\n      upsert_langfuse_trace(trace: trace, output: result.map(&:to_h))\n\n      result\n    end\n  end\n\n  def enhance_provider_merchants(merchants: [], model: \"\", family: nil, json_mode: nil)\n    with_provider_response do\n      raise Error, \"Too many merchants to enhance. Max is 25 per request.\" if merchants.size > 25\n\n      effective_model = model.presence || @default_model\n\n      trace = create_langfuse_trace(\n        name: \"anthropic.enhance_provider_merchants\",\n        input: { merchants: merchants }\n      )\n\n      result = ProviderMerchantEnhancer.new(\n        client,\n        model: effective_model,\n        merchants: merchants,\n        langfuse_trace: trace,\n        family: family\n      ).enhance_merchants\n\n      upsert_langfuse_trace(trace: trace, output: result.map(&:to_h))\n","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/we-promise/sure/blob/e69894adb92547273377398c15f45c979cd9416a/app/models/provider/anthropic.rb#L110-L146","documentation":"Provider::Anthropic#enhance_provider_merchants raises Error when merchants.size > 25. The enhancer sends all merchants in one prompt and expects one report_enhancements tool call back, so the provider enforces 25 per request to bound the tool-call payload and response length.","triggerScenarios":"Calling enhance_provider_merchants(merchants: list, ...) with more than 25 merchants — e.g. a first-run enhancement sweep over a newly imported provider's full merchant list (hundreds of entries) that forgot to paginate.","commonSituations":"Initial sync of a new bank connection imports a large merchant set and the enhancement job passes it whole; merchant backfill rake task without batching; provider change suddenly yields more merchants than usual.","solutions":["Batch the merchant list into chunks of 25 and call enhance_provider_merchants per chunk.","Move batching into the job that enqueues enhancement so each unit is capped at 25.","If enhancements are lower priority, run batches serially with small delays to also avoid provider-level rate limits."],"exampleFix":"# before\nprovider.enhance_provider_merchants(merchants: provider_merchants)\n# => Too many merchants to enhance. Max is 25 per request.\n\n# after\nprovider_merchants.each_slice(25) do |batch|\n  provider.enhance_provider_merchants(merchants: batch, family: family)\nend","handlingStrategy":"validation","validationCode":"merchants.each_slice(25) do |batch|\n  provider.enhance_provider_merchants(merchants: batch, family: family)\nend","typeGuard":null,"tryCatchPattern":"begin\n  provider.enhance_provider_merchants(merchants: batch, family: family)\nrescue Provider::Anthropic::Error => e\n  Rails.logger.error(\"merchant enhancement failed: #{e.message}\")\nend","preventionTips":["Cap enhancement jobs at 25 merchants per unit when enqueueing.","For large first-sync merchant sets, run batches serially to also respect provider rate limits.","Reuse the shared LLM batch helper."],"tags":["anthropic","llm","batch-limit","merchants","input-validation"],"backgroundTag":"batch-size-limit-exceeded","analyzedSha":"e69894adb92547273377398c15f45c979cd9416a","analyzedAt":"2026-08-21T18:22:41.165Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}