[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N486VAA9BX2KFKATGFM4MB":3,"skill-same:01M6N486VAA9BX2KFKATGFM4MB":84},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":54,"updatedAt":55,"install":56,"resources":69},"01M6N486VAA9BX2KFKATGFM4MB","oban-designer",null,"Design and implement Oban background job workers for Elixir. Configure queues, retry strategies, uniqueness constraints, cron scheduling, and error handling. Generate Oban workers, queue config, and test setups. Use when adding background jobs, async processing, scheduled tasks, or recurring cron jobs to an Elixir project using Oban.","Kernel8901\u002Fai-agent-skills-classification","Kernel8901","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72647553?v=4","01M6KV388J2H5PNC8D8P940BJD","01M6KV38CS5B3AY63RKZB410YM",7,"MIT","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F代码质量与测试\u002Foban\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"oban designer","oban","designer","background jobs","scheduled","retry","processing","error","cron scheduling","project","strategies","design","recurring","elixir","configure","cron","cron jobs","generate","tasks","config","2026-11-10 10:12:30",false,"---\nname: oban-designer\ndescription: \"Design and implement Oban background job workers for Elixir. Configure queues, retry strategies, uniqueness constraints, cron scheduling, and error handling. Generate Oban workers, queue config, and test setups. Use when adding background jobs, async processing, scheduled tasks, or recurring cron jobs to an Elixir project using Oban.\"\n---\n\n# Oban Designer\n\n## Installation\n\n```elixir\n# mix.exs\n{:oban, \"~> 2.18\"}\n\n# config\u002Fconfig.exs\nconfig :my_app, Oban,\n  repo: MyApp.Repo,\n  queues: [default: 10, mailers: 20, webhooks: 50, events: 5],\n  plugins: [\n    Oban.Plugins.Pruner,\n    {Oban.Plugins.Cron, crontab: [\n      {\"0 2 * * *\", MyApp.Workers.DailyCleanup},\n      {\"*\u002F5 * * * *\", MyApp.Workers.MetricsCollector}\n    ]}\n  ]\n\n# In application.ex children:\n{Oban, Application.fetch_env!(:my_app, Oban)}\n```\n\nGenerate the Oban migrations:\n\n```bash\nmix ecto.gen.migration add_oban_jobs_table\n```\n\n```elixir\ndefmodule MyApp.Repo.Migrations.AddObanJobsTable do\n  use Ecto.Migration\n  def up, do: Oban.Migration.up(version: 12)\n  def down, do: Oban.Migration.down(version: 1)\nend\n```\n\n## Worker Implementation\n\n### Basic Worker\n\n```elixir\ndefmodule MyApp.Workers.SendEmail do\n  use Oban.Worker,\n    queue: :mailers,\n    max_attempts: 5,\n    priority: 1\n\n  @impl Oban.Worker\n  def perform(%Oban.Job{args: %{\"to\" => to, \"template\" => template} = args}) do\n    case MyApp.Mailer.deliver(to, template, args) do\n      {:ok, _} -> :ok\n      {:error, :temporary} -> {:error, \"temporary failure\"}  # Will retry\n      {:error, :permanent} -> {:cancel, \"invalid address\"}   # Won't retry\n    end\n  end\nend\n```\n\n### Return Values\n\n| Return | Effect |\n|--------|--------|\n| `:ok` | Job marked complete |\n| `{:ok, result}` | Job marked complete |\n| `{:error, reason}` | Job retried (counts as attempt) |\n| `{:cancel, reason}` | Job cancelled, no more retries |\n| `{:snooze, seconds}` | Re-scheduled, doesn't count as attempt |\n| `{:discard, reason}` | Job discarded (Oban 2.17+) |\n\n## Queue Configuration\n\nSee [references\u002Fworker-patterns.md](references\u002Fworker-patterns.md) for common worker patterns.\n\n### Sizing Guidelines\n\n| Queue | Concurrency | Use Case |\n|-------|------------|----------|\n| `default` | 10 | General-purpose |\n| `mailers` | 20 | Email delivery (I\u002FO bound) |\n| `webhooks` | 50 | Webhook delivery (I\u002FO bound, high volume) |\n| `media` | 5 | Image\u002Fvideo processing (CPU bound) |\n| `events` | 5 | Analytics, audit logs |\n| `critical` | 3 | Billing, payments |\n\n### Queue Priority\n\nJobs within a queue execute by priority (0 = highest). Use sparingly:\n\n```elixir\n%{user_id: user.id}\n|> MyApp.Workers.SendEmail.new(priority: 0)  # Urgent\n|> Oban.insert()\n```\n\n## Retry Strategies\n\n### Default Backoff\n\nOban uses exponential backoff: `attempt^4 + attempt` seconds.\n\n### Custom Backoff\n\n```elixir\ndefmodule MyApp.Workers.WebhookDelivery do\n  use Oban.Worker,\n    queue: :webhooks,\n    max_attempts: 10\n\n  @impl Oban.Worker\n  def backoff(%Oban.Job{attempt: attempt}) do\n    # Exponential with jitter: 2^attempt + random(0..30)\n    trunc(:math.pow(2, attempt)) + :rand.uniform(30)\n  end\n\n  @impl Oban.Worker\n  def perform(%Oban.Job{args: args}) do\n    # ...\n  end\nend\n```\n\n### Timeout\n\n```elixir\nuse Oban.Worker, queue: :media\n\n@impl Oban.Worker\ndef timeout(%Oban.Job{args: %{\"size\" => \"large\"}}), do: :timer.minutes(10)\ndef timeout(_job), do: :timer.minutes(2)\n```\n\n## Uniqueness\n\nPrevent duplicate jobs:\n\n```elixir\ndefmodule MyApp.Workers.SyncAccount do\n  use Oban.Worker,\n    queue: :default,\n    unique: [\n      period: 300,               # 5 minutes\n      states: [:available, :scheduled, :executing, :retryable],\n      keys: [:account_id]        # Unique by this arg key\n    ]\nend\n```\n\n### Unique Options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `period` | 60 | Seconds to enforce uniqueness (`:infinity` for forever) |\n| `states` | all active | Which job states to check |\n| `keys` | all args | Specific arg keys to compare |\n| `timestamp` | `:inserted_at` | Use `:scheduled_at` for scheduled uniqueness |\n\n### Replace Existing\n\n```elixir\n%{account_id: id}\n|> MyApp.Workers.SyncAccount.new(\n  replace: [:scheduled_at],    # Update scheduled_at if duplicate\n  schedule_in: 60\n)\n|> Oban.insert()\n```\n\n## Cron Scheduling\n\n```elixir\n# config.exs\nplugins: [\n  {Oban.Plugins.Cron, crontab: [\n    {\"0 *\u002F6 * * *\", MyApp.Workers.DigestEmail},\n    {\"0 2 * * *\", MyApp.Workers.DailyCleanup},\n    {\"0 0 1 * *\", MyApp.Workers.MonthlyReport},\n    {\"*\u002F5 * * * *\", MyApp.Workers.HealthCheck, args: %{service: \"api\"}},\n  ]}\n]\n```\n\nCron expressions: `minute hour day_of_month month day_of_week`.\n\n## Inserting Jobs\n\n```elixir\n# Immediate\n%{user_id: user.id, template: \"welcome\"}\n|> MyApp.Workers.SendEmail.new()\n|> Oban.insert()\n\n# Scheduled\n%{report_id: id}\n|> MyApp.Workers.GenerateReport.new(schedule_in: 3600)\n|> Oban.insert()\n\n# Scheduled at specific time\n%{report_id: id}\n|> MyApp.Workers.GenerateReport.new(scheduled_at: ~U[2024-01-01 00:00:00Z])\n|> Oban.insert()\n\n# Bulk insert\nchangesets = Enum.map(users, fn user ->\n  MyApp.Workers.SendEmail.new(%{user_id: user.id})\nend)\nOban.insert_all(changesets)\n\n# Inside Ecto.Multi\nEcto.Multi.new()\n|> Ecto.Multi.insert(:user, changeset)\n|> Oban.insert(:welcome_email, fn %{user: user} ->\n  MyApp.Workers.SendEmail.new(%{user_id: user.id})\nend)\n|> Repo.transaction()\n```\n\n## Oban Pro Features\n\nAvailable with Oban Pro license:\n\n### Batch (group of jobs)\n\n```elixir\n# Process items in batch, run callback when all complete\nbatch = MyApp.Workers.ProcessItem.new_batch(\n  items |> Enum.map(&%{item_id: &1.id}),\n  callback: {MyApp.Workers.BatchComplete, %{batch_name: \"import\"}}\n)\nOban.insert_all(batch)\n```\n\n### Workflow (job dependencies)\n\n```elixir\nOban.Pro.Workflow.new()\n|> Oban.Pro.Workflow.add(:extract, MyApp.Workers.Extract.new(%{file: path}))\n|> Oban.Pro.Workflow.add(:transform, MyApp.Workers.Transform.new(%{}), deps: [:extract])\n|> Oban.Pro.Workflow.add(:load, MyApp.Workers.Load.new(%{}), deps: [:transform])\n|> Oban.insert_all()\n```\n\n### Chunk (aggregate multiple jobs)\n\n```elixir\ndefmodule MyApp.Workers.BulkIndex do\n  use Oban.Pro.Workers.Chunk,\n    queue: :indexing,\n    size: 100,            # Process 100 at a time\n    timeout: 30_000       # Or after 30s\n\n  @impl true\n  def process(jobs) do\n    items = Enum.map(jobs, & &1.args)\n    SearchIndex.bulk_upsert(items)\n    :ok\n  end\nend\n```\n\n## Testing\n\nSee [references\u002Ftesting-oban.md](references\u002Ftesting-oban.md) for detailed testing patterns.\n\n### Setup\n\n```elixir\n# config\u002Ftest.exs\nconfig :my_app, Oban,\n  testing: :manual  # or :inline for synchronous execution\n\n# test_helper.exs (if using :manual)\nOban.Testing.start()\n```\n\n### Asserting Job Enqueued\n\n```elixir\nuse Oban.Testing, repo: MyApp.Repo\n\ntest \"enqueues welcome email on signup\" do\n  {:ok, user} = Accounts.register(%{email: \"test@example.com\"})\n\n  assert_enqueued worker: MyApp.Workers.SendEmail,\n    args: %{user_id: user.id, template: \"welcome\"},\n    queue: :mailers\nend\n```\n\n### Executing Jobs in Tests\n\n```elixir\ntest \"processes email delivery\" do\n  {:ok, _} =\n    perform_job(MyApp.Workers.SendEmail, %{\n      \"to\" => \"user@example.com\",\n      \"template\" => \"welcome\"\n    })\nend\n```\n\n## Monitoring\n\n### Telemetry Events\n\n```elixir\n# Attach in application.ex\n:telemetry.attach_many(\"oban-logger\", [\n  [:oban, :job, :start],\n  [:oban, :job, :stop],\n  [:oban, :job, :exception]\n], &MyApp.ObanTelemetry.handle_event\u002F4, %{})\n```\n\n### Key Metrics to Track\n\n- Job execution duration (p50, p95, p99)\n- Queue depth (available jobs per queue)\n- Error rate per worker\n- Retry rate per worker\n","# Oban Designer\n\n## Installation\n\n```elixir\n# mix.exs\n{:oban, \"~> 2.18\"}\n\n# config\u002Fconfig.exs\nconfig :my_app, Oban,\n  repo: MyApp.Repo,\n  queues: [default: 10, mailers: 20, webhooks: 50, events: 5],\n  plugins: [\n    Oban.Plugins.Pruner,\n    {Oban.Plugins.Cron, crontab: [\n      {\"0 2 * * *\", MyApp.Workers.DailyCleanup},\n      {\"*\u002F5 * * * *\", MyApp.Workers.MetricsCollector}\n    ]}\n  ]\n\n# In application.ex children:\n{Oban, Application.fetch_env!(:my_app, Oban)}\n```\n\nGenerate the Oban migrations:\n\n```bash\nmix ecto.gen.migration add_oban_jobs_table\n```\n\n```elixir\ndefmodule MyApp.Repo.Migrations.AddObanJobsTable do\n  use Ecto.Migration\n  def up, do: Oban.Migration.up(version: 12)\n  def down, do: Oban.Migration.down(version: 1)\nend\n```\n\n## Worker Implementation\n\n### Basic Worker\n\n```elixir\ndefmodule MyApp.Workers.SendEmail do\n  use Oban.Worker,\n    queue: :mailers,\n    max_attempts: 5,\n    priority: 1\n\n  @impl Oban.Worker\n  def perform(%Oban.Job{args: %{\"to\" => to, \"template\" => template} = args}) do\n    case MyApp.Mailer.deliver(to, template, args) do\n      {:ok, _} -> :ok\n      {:error, :temporary} -> {:error, \"temporary failure\"}  # Will retry\n      {:error, :permanent} -> {:cancel, \"invalid address\"}   # Won't retry\n    end\n  end\nend\n```\n\n### Return Values\n\n| Return | Effect |\n|--------|--------|\n| `:ok` | Job marked complete |\n| `{:ok, result}` | Job marked complete |\n| `{:error, reason}` | Job retried (counts as attempt) |\n| `{:cancel, reason}` | Job cancelled, no more retries |\n| `{:snooze, seconds}` | Re-scheduled, doesn't count as attempt |\n| `{:discard, reason}` | Job discarded (Oban 2.17+) |\n\n## Queue Configuration\n\nSee [references\u002Fworker-patterns.md](references\u002Fworker-patterns.md) for common worker patterns.\n\n### Sizing Guidelines\n\n| Queue | Concurrency | Use Case |\n|-------|------------|----------|\n| `default` | 10 | General-purpose |\n| `mailers` | 20 | Email delivery (I\u002FO bound) |\n| `webhooks` | 50 | Webhook delivery (I\u002FO bound, high volume) |\n| `media` | 5 | Image\u002Fvideo processing (CPU bound) |\n| `events` | 5 | Analytics, audit logs |\n| `critical` | 3 | Billing, payments |\n\n### Queue Priority\n\nJobs within a queue execute by priority (0 = highest). Use sparingly:\n\n```elixir\n%{user_id: user.id}\n|> MyApp.Workers.SendEmail.new(priority: 0)  # Urgent\n|> Oban.insert()\n```\n\n## Retry Strategies\n\n### Default Backoff\n\nOban uses exponential backoff: `attempt^4 + attempt` seconds.\n\n### Custom Backoff\n\n```elixir\ndefmodule MyApp.Workers.WebhookDelivery do\n  use Oban.Worker,\n    queue: :webhooks,\n    max_attempts: 10\n\n  @impl Oban.Worker\n  def backoff(%Oban.Job{attempt: attempt}) do\n    # Exponential with jitter: 2^attempt + random(0..30)\n    trunc(:math.pow(2, attempt)) + :rand.uniform(30)\n  end\n\n  @impl Oban.Worker\n  def perform(%Oban.Job{args: args}) do\n    # ...\n  end\nend\n```\n\n### Timeout\n\n```elixir\nuse Oban.Worker, queue: :media\n\n@impl Oban.Worker\ndef timeout(%Oban.Job{args: %{\"size\" => \"large\"}}), do: :timer.minutes(10)\ndef timeout(_job), do: :timer.minutes(2)\n```\n\n## Uniqueness\n\nPrevent duplicate jobs:\n\n```elixir\ndefmodule MyApp.Workers.SyncAccount do\n  use Oban.Worker,\n    queue: :default,\n    unique: [\n      period: 300,               # 5 minutes\n      states: [:available, :scheduled, :executing, :retryable],\n      keys: [:account_id]        # Unique by this arg key\n    ]\nend\n```\n\n### Unique Options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `period` | 60 | Seconds to enforce uniqueness (`:infinity` for forever) |\n| `states` | all active | Which job states to check |\n| `keys` | all args | Specific arg keys to compare |\n| `timestamp` | `:inserted_at` | Use `:scheduled_at` for scheduled uniqueness |\n\n### Replace Existing\n\n```elixir\n%{account_id: id}\n|> MyApp.Workers.SyncAccount.new(\n  replace: [:scheduled_at],    # Update scheduled_at if duplicate\n  schedule_in: 60\n)\n|> Oban.insert()\n```\n\n## Cron Scheduling\n\n```elixir\n# config.exs\nplugins: [\n  {Oban.Plugins.Cron, crontab: [\n    {\"0 *\u002F6 * * *\", MyApp.Workers.DigestEmail},\n    {\"0 2 * * *\", MyApp.Workers.DailyCleanup},\n    {\"0 0 1 * *\", MyApp.Workers.MonthlyReport},\n    {\"*\u002F5 * * * *\", MyApp.Workers.HealthCheck, args: %{service: \"api\"}},\n  ]}\n]\n```\n\nCron expressions: `minute hour day_of_month month day_of_week`.\n\n## Inserting Jobs\n\n```elixir\n# Immediate\n%{user_id: user.id, template: \"welcome\"}\n|> MyApp.Workers.SendEmail.new()\n|> Oban.insert()\n\n# Scheduled\n%{report_id: id}\n|> MyApp.Workers.GenerateReport.new(schedule_in: 3600)\n|> Oban.insert()\n\n# Scheduled at specific time\n%{report_id: id}\n|> MyApp.Workers.GenerateReport.new(scheduled_at: ~U[2024-01-01 00:00:00Z])\n|> Oban.insert()\n\n# Bulk insert\nchangesets = Enum.map(users, fn user ->\n  MyApp.Workers.SendEmail.new(%{user_id: user.id})\nend)\nOban.insert_all(changesets)\n\n# Inside Ecto.Multi\nEcto.Multi.new()\n|> Ecto.Multi.insert(:user, changeset)\n|> Oban.insert(:welcome_email, fn %{user: user} ->\n  MyApp.Workers.SendEmail.new(%{user_id: user.id})\nend)\n|> Repo.transaction()\n```\n\n## Oban Pro Features\n\nAvailable with Oban Pro license:\n\n### Batch (group of jobs)\n\n```elixir\n# Process items in batch, run callback when all complete\nbatch = MyApp.Workers.ProcessItem.new_batch(\n  items |> Enum.map(&%{item_id: &1.id}),\n  callback: {MyApp.Workers.BatchComplete, %{batch_name: \"import\"}}\n)\nOban.insert_all(batch)\n```\n\n### Workflow (job dependencies)\n\n```elixir\nOban.Pro.Workflow.new()\n|> Oban.Pro.Workflow.add(:extract, MyApp.Workers.Extract.new(%{file: path}))\n|> Oban.Pro.Workflow.add(:transform, MyApp.Workers.Transform.new(%{}), deps: [:extract])\n|> Oban.Pro.Workflow.add(:load, MyApp.Workers.Load.new(%{}), deps: [:transform])\n|> Oban.insert_all()\n```\n\n### Chunk (aggregate multiple jobs)\n\n```elixir\ndefmodule MyApp.Workers.BulkIndex do\n  use Oban.Pro.Workers.Chunk,\n    queue: :indexing,\n    size: 100,            # Process 100 at a time\n    timeout: 30_000       # Or after 30s\n\n  @impl true\n  def process(jobs) do\n    items = Enum.map(jobs, & &1.args)\n    SearchIndex.bulk_upsert(items)\n    :ok\n  end\nend\n```\n\n## Testing\n\nSee [references\u002Ftesting-oban.md](references\u002Ftesting-oban.md) for detailed testing patterns.\n\n### Setup\n\n```elixir\n# config\u002Ftest.exs\nconfig :my_app, Oban,\n  testing: :manual  # or :inline for synchronous execution\n\n# test_helper.exs (if using :manual)\nOban.Testing.start()\n```\n\n### Asserting Job Enqueued\n\n```elixir\nuse Oban.Testing, repo: MyApp.Repo\n\ntest \"enqueues welcome email on signup\" do\n  {:ok, user} = Accounts.register(%{email: \"test@example.com\"})\n\n  assert_enqueued worker: MyApp.Workers.SendEmail,\n    args: %{user_id: user.id, template: \"welcome\"},\n    queue: :mailers\nend\n```\n\n### Executing Jobs in Tests\n\n```elixir\ntest \"processes email delivery\" do\n  {:ok, _} =\n    perform_job(MyApp.Workers.SendEmail, %{\n      \"to\" => \"user@example.com\",\n      \"template\" => \"welcome\"\n    })\nend\n```\n\n## Monitoring\n\n### Telemetry Events\n\n```elixir\n# Attach in application.ex\n:telemetry.attach_many(\"oban-logger\", [\n  [:oban, :job, :start],\n  [:oban, :job, :stop],\n  [:oban, :job, :exception]\n], &MyApp.ObanTelemetry.handle_event\u002F4, %{})\n```\n\n### Key Metrics to Track\n\n- Job execution duration (p50, p95, p99)\n- Queue depth (available jobs per queue)\n- Error rate per worker\n- Retry rate per worker\n",{"name":5,"description":7},"main","f4cb2d49f7667e79ef7804f50396d5aaffdf1f56","代码质量与测试\u002Foban",1,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification","https:\u002F\u002Fgithub.com\u002FKernel8901","a little little little dobe in life but science geek","2026-04-05 16:43:56",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add Kernel8901\u002Fai-agent-skills-classification --skill oban-designer",{"tool":62,"command":63},"bunx","bunx skills add Kernel8901\u002Fai-agent-skills-classification --skill oban-designer",{"tool":65,"command":66},"pnpm","pnpm dlx skills add Kernel8901\u002Fai-agent-skills-classification --skill oban-designer","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F代码质量与测试\u002Foban\u002FSKILL.md",true,[70,76,80],{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"_meta.json","REFERENCE","参考文档",261,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F代码质量与测试\u002Foban\u002F_meta.json",{"path":77,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Ftesting-oban.md",4687,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F代码质量与测试\u002Foban\u002Freferences\u002Ftesting-oban.md",{"path":81,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fworker-patterns.md",6056,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F代码质量与测试\u002Foban\u002Freferences\u002Fworker-patterns.md",[85,109,143,154,164,194],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":43},"01M6Q5R6WZ06RRB9RQTW54B34B","zyfai","Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount (Safe) linked to their EOA, enables automated yield optimization, and lets them deposit\u002Fwithdraw anytime.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzyfai-sdk\u002FSKILL.md",[],[87,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108],"safe","ethereum","defi","Optimization","user","use","Wallet","base","deposit","withdraw","yield","arbitrum","non-custodial","passive","defi yield","earn","yield optimization",{"skillNo":110,"name":111,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":125,"publishedAt":43},"01M6Q5R337B5JSNER4P4YS03TN","zerion-api","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api\u002FSKILL.md",[114,117,120],{"categoryNo":115,"categoryName":116,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":118,"categoryName":119,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":121,"categoryName":122,"taxonomyType":123,"taxonomyTypeDesc":124},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[126,127,128,129,130,131,132,94,133,98,134,135,136,137,138,139,140,141,142],"api","zerion api","zerion","MCP","mcp server","server","blockchain","transactions","crypto wallet","crypto","evm","solana","query","across","positions","token","prices",{"skillNo":144,"name":145,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":151,"publishedAt":43},"01M6Q5QZFYTDAZMZ27BN5VZXAR","zerion-api-skill","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-skill\u002FSKILL.md",[148,149,150],{"categoryNo":115,"categoryName":116,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":118,"categoryName":119,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":121,"categoryName":122,"taxonomyType":123,"taxonomyTypeDesc":124},[126,152,153,127,128,129,130,131,132,94,133,98,135,136,137,138,139,140,141,142],"api skill","zerion api skill",{"skillNo":155,"name":156,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":162,"publishedAt":43},"01M6Q5QW17QW98RA3FE45E4RD8","zerion-api-mcp","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-mcp\u002FSKILL.md",[159,160,161],{"categoryNo":115,"categoryName":116,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":118,"categoryName":119,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":121,"categoryName":122,"taxonomyType":123,"taxonomyTypeDesc":124},[129,126,163,127,128,130,131,94,133,98,134,135,136,137,138,139,140,141,142],"zerion api mcp",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":173,"publishedAt":43},"01M6Q5QQYZB7A501BDEQWKGSJT","yahoo-finance-forex","Fetches real-time FOREX news and market data from Yahoo Finance for major currency pairs (EUR\u002FUSD, GBP\u002FUSD, USD\u002FJPY, etc.). Analyzes sentiment and provides trading context.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-forex\u002FSKILL.md",[170],{"categoryNo":171,"categoryName":172,"taxonomyType":123,"taxonomyTypeDesc":124},"01JBSEEDCAT000000000000040","财务",[174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193],"finance","yahoo finance","forex","yahoo","yahoo finance forex","github","https","sentiment","real-time","python3","install","Market","usd","news","time","currency","gbp","pip","market data","for",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":201,"publishedAt":43},"01M6Q5QM6VS84WZVM7BKXXPF32","yahoo-finance","This skill should be used when the user asks to \"get stock prices\", \"check stock quotes\", \"look up earnings\", \"get financial data\", \"find trending stocks\", or needs stock market data from Yahoo Finance.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-cli\u002FSKILL.md",[200],{"categoryNo":171,"categoryName":172,"taxonomyType":123,"taxonomyTypeDesc":124},[174,175,177,202,203,204,205,206,207,185,208,209,210,211,212,213,214,215,142,192],"cli","homebrew","find","check","brew","up","local","get","stock","link","trending","sf","quotes","ln"]